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