假设我有以下策略来检查一个术语是否是文字零:
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
map 包含一个可转换为value
但在语法上不等于它的术语,则该策略将错误地返回None
.