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

时间:2019-06-27 13:09:19

标签: pattern-matching coq ltac

在按照用户定义的策略(与match goal with进行模式匹配时,我们可以使用?x绑定Gallina术语,以便以后我们可以引用它。我们可以在一个子句(... ?x ... ?y ...中使用多个这样的标识符,或者甚至可以使用相同的标识符(... ?x ... ?x ...)来表示,为了使子句匹配,必须在这些子句中出现相同的Gallina术语两个职位。从某种意义上说,这限制了可能的匹配与“相同”要求。这很方便,但是也能够提出“不同”的要求会更方便。有没有一种方法可以写成... ?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(或者再次绑定{{1 }})到a。但是,然后,在比赛条款的右侧,我想在?yx之间执行一些“ 它们是否不同?”检查,然后如果两者在字面上绑定相同的术语,请执行y

1 个答案:

答案 0 :(得分:4)

several tactics to check whether two terms are equal

我认为您可以将其与tryifassert_fails结合使用以完成您想要的操作。

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