Coq强制和目标匹配

时间:2017-08-03 11:06:33

标签: coq coq-tactic ltac

假设我有以下设置:

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)。这可以稍微缓解这个问题,但是一旦新的强制措施被引入,战术不知道就会失败。

理想情况下,如果在展开所有定义后模式匹配,我希望模式匹配成功(当然,定义不应该保持展开)。

这可能吗?如果没有,是否有可能无法解释的原因?

1 个答案:

答案 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.