是否可以在 Ltac-match 中绑定不同的术语?

Is it possible to bind necessarily different terms in Ltac-match?

在用户自定义策略中进行模式匹配(使用match goal with)时,可以使用?x绑定一个Gallina term,方便后面引用。我们可以在一个子句中使用多个这样的标识符 (... ?x ... ?y ...) 或者我们甚至可以使用相同的标识符 (... ?x ... ?x ...) 来指示为了使子句匹配,相同的 Gallina 术语必须出现在那些两个职位。在某种程度上,这限制了与 "sameness" 要求的可能匹配。这很方便,但如果能够提出 "different" 要求会更方便(原文如此)。有没有一种方法可以编写形式为 ... ?x ... ?y ... 的匹配子句,其中我们要求 ?x?y 约束的术语是可区分的?

我所说的可区分并不一定意味着不相等,而只是不同(它们的名称 [或表示] 不重合)。例如,假设我有两个术语 a,b:C。在我们可以证明命题 a = b 的意义上,这两项可能相等,但这与我的目的无关。 ab 的区别在于它们的名称不同。

那么,我可以通过提出两个元变量 ?x?y 必须绑定不同术语的要求来进行模式匹配吗?

在某些情况下,假设我们已经定义了对、投影,并让 R 成为某种(适当类型的)二元关系。假设我以某种方式在我的假设中得出以下两个结论。

H  : R (proj1 (pair a b)) c
H' : R (proj1 (pair a b)) a

我希望能够在我的策略中编写一个只匹配 H 而不是 H' 的匹配子句。有什么诀窍吗?

如果没有办法只匹配 H,那么也许我可以同时匹配两者,我将 a 绑定到 ?xc(或者再次 a) 到 ?y。但是,在匹配子句的右侧,我想在 x 和 [=34] 之间执行一些“are-they-different?”检查=] 并执行 idtac 以防两者绑定相同的术语。

several tactics to check whether two terms are equal.

我想你可以将它与 tryif or assert_fails 结合起来做你想做的事情。

match goal with
  | [H : ... |- _] => tryif (constr_eq x y) then fail else some_tactic
end.