在按照用户定义的策略(与match goal with
进行模式匹配时,我们可以使用?x
绑定Gallina术语,以便以后我们可以引用它。我们可以在一个子句(... ?x ... ?y ...
中使用多个这样的标识符,或者甚至可以使用相同的标识符(... ?x ... ?x ...
)来表示,为了使子句匹配,必须在这些子句中出现相同的Gallina术语两个职位。从某种意义上说,这限制了可能的匹配与“相同”要求。这很方便,但是也能够提出“不同”的要求会更方便。有没有一种方法可以写成... ?x ... ?y ...
形式的匹配子句,以要求由?x
和?y
约束的术语是可区分的?
通过区别,我不一定表示不相等,而是不同(它们的名称[或表示形式]不重合)。例如,假设我有两个词a,b:C
。在可以证明命题a = b
的意义上,这两个术语可能是相等的,但这与我的目的无关。 a
和b
彼此不同的原因在于它们的名称不同。
因此,我是否可以通过提出两个元变量?x
和?y
必须绑定不同术语的要求来进行模式匹配?
在某种情况下,要说我们已经定义了对,投影,并让R
为某种(适当类型的)二进制关系。假设我以某种方式最终得到以下两个结果。
H : R (proj1 (pair a b)) c
H' : R (proj1 (pair a b)) a
我希望能够在我的战术中写一个只匹配H
而不匹配H'
的比赛子句。这有招吗?
如果没有办法只匹配H
,那么也许我可以两者都匹配,在这里我将a
绑定到?x
和c
(或者再次绑定{{1 }})到a
。但是,然后,在比赛条款的右侧,我想在?y
和x
之间执行一些“ 它们是否不同?”检查,然后如果两者在字面上绑定相同的术语,请执行y
。
答案 0 :(得分:4)
有several tactics to check whether two terms are equal。
我认为您可以将其与tryif
或assert_fails
结合使用以完成您想要的操作。
match goal with
| [H : ... |- _] => tryif (constr_eq x y) then fail else some_tactic
end.