項がリテラル ゼロかどうかをチェックする次の戦術があるとします。
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: 参考までに、簡略化されていない問題は、 へのFMap
一連の呼び出しによって構築された値におそらく一致するキーを効率的に検索しようとしているということですadd
。戦術は次のようになります。
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
ます。