[英]How do I check for convertibility in a tactic producing terms?
假設我有以下策略來檢查一項是否為文字零:
Ltac isZero x :=
match x with
| O => constr:true
| _ => constr:false
end.
Goal Set.
let isz := isZero O in pose isz.
(* adds true to the context *)
現在想象一下,我想讓策略接受更多; 也許任何可以零轉換的項。 如果這是一種針對目標的策略,我會做
Ltac isZero x :=
match x with
| ?v => unify v 0; constr:true
| _ => constr:false
end.
但這對於產生術語的策略來說是失敗的:
Error: Value is a term. Expected a tactic.
我該如何檢查戰術生成條款中的可兌換性? 在此特定示例中,減少x
或對其進行計算( let xx := eval compute in x
)可能有效,但在更復雜的示例中,計算成本可能會令人望而卻步,尤其是因為我需要減少比較的兩個項。
PS:作為參考,未簡化的問題是,我正在嘗試在通過調用add
序列構建的FMap
高效地查找可能與值匹配的鍵,該策略看起來像
Ltac find_key value :=
match fmap with
| add ?k value _ => constr:(Some k)
| add _ _ ?m => find_key value m
| _ => constr:None
end
有了這個實施,如果不是的value
的地圖包含可轉換為長期value
,但語法上不等於它,戰術會錯誤地返回None
。
您可以嘗試構建一個觸發轉化檢查的字詞; 例如:
Goal 2 + 2 = 4.
match goal with
| |- ?a = ?b =>
let e := constr:(eq_refl a : a = b) in
idtac "equal"
| |- _ => idtac "not equal"
end.
通常,這將打印“等於”。 但是,如果在上述目標中將4
替換為3
,則內部分支將失敗,並顯示“不相等”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.