[英]Is it possible to bind necessarily different terms in Ltac-match?
在用戶定義的策略中進行模式匹配( 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
(或再次將a
)綁定到?y
。 但是,然后,在比賽條款的右側,我想在x
和y
之間執行一些“ 它們是否不同? ”檢查,並在兩個idtac
實際上綁定相同術語的情況下執行idtac
。
我認為您可以將它與tryif
或assert_fails
結合使用以執行您想要的操作。
match goal with
| [H : ... |- _] => tryif (constr_eq x y) then fail else some_tactic
end.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.