假设我有以下设置:
Inductive exp: Set :=
| CE: nat -> exp.
Inductive adt: exp -> Prop :=
| CA: forall e, adt e.
Coercion nat_to_exp := CE.
Ltac my_tactic := match goal with
| [ |- adt (CE ?N) ] => apply (CA (CE N))
end.
我试图用自定义策略证明一个简单的定理:
Theorem silly: adt 0.
Proof.
my_tactic. (* Error: No matching clauses for match. *)
Abort.
此操作失败,因为目标不是adt (CE ?N)
形式,而是adt (nat_to_exp ?N)
形式(使用Set Printing Coercions
时显式显示)。
试图证明一个稍微不同的定理有效:
Theorem silly: adt (CE 0).
Proof.
my_tactic. (* Success. *)
Qed.
我知道的可能的解决方法:
unfold nat_to_exp
)。这可以稍微缓解这个问题,但是一旦新的强制措施被引入,战术不知道就会失败。理想情况下,如果在展开所有定义后模式匹配,我希望模式匹配成功(当然,定义不应该保持展开)。
这可能吗?如果没有,是否有可能无法解释的原因?
答案 0 :(得分:2)
您可以直接将构造函数CE
声明为强制,而不是将其包装为nat_to_exp
,如下所示:
Coercion CE : nat >-> exp.
证明然后没有任何问题。如果你坚持命名你的强制(例如因为它是复合表达式而不是单个构造函数),你可以改变你的策略,以便它明确地处理非展开的强制:
Ltac my_tactic := match goal with
| [ |- adt (CE ?N) ] => apply (CA (CE N))
| [ |- adt (nat_to_exp ?N) ] => apply (CA (CE N))
end.