我刚刚遇到问题induction
的问题,在阅读来自here的证据时,丢弃有关构造术语的信息。
作者使用了类似的东西:
remember (WHILE b DO c END) as cw eqn:Heqcw.
在实际归纳H
之前重写假设induction H
。我真的不喜欢不得不引入一个平凡的平等,因为它看起来像黑魔法。
在SO中的一些搜索显示实际上remember
技巧是必要的。但是,一个答案here指出新的dependent induction
可用于避免remember
伎俩。这很好,但dependent induction
本身现在看起来有点神奇。
我很难理解dependent induction
的工作原理。 documentation给出了一个需要dependent induction
的示例:
Lemma le_minus : forall n:nat, n < 1 -> n = 0.
我可以验证induction
失败的方式,dependent induction
在这种情况下有效。但我不能使用remember
技巧来复制dependent induction
结果。
我到目前为止试图模仿remember
技巧是:
Require Import Coq.Program.Equality.
Lemma le_minus : forall n:nat, n < 1 -> n = 0.
intros n H. (* dependent induction H works*)
remember (n < 1) as H0. induction H.
但这不起作用。任何人都可以根据dependent induction
- ing来解释remember
如何运作?
答案 0 :(得分:1)
你可以做到
Require Import Coq.Program.Equality.
Lemma le_minus : forall n:nat, n < 1 -> n = 0.
Proof.
intros n H.
remember 1 as m in H. induction H.
- inversion Heqm. reflexivity.
- inversion Heqm. subst m.
inversion H.
Qed.
如上所述here,问题在于Coq无法跟踪出现在您感应事物类型中的术语的形状。换句话说,对“小于”关系进行归纳会指示Coq尝试证明某个通用上限,而不是您正在考虑的特定上限(1)。
请注意,通过稍微概括一下您的结果,始终可以在没有remember
或dependent induction
的情况下证明这些目标:
Lemma le_minus_aux :
forall n m, n < m ->
match m with
| 1 => n = 0
| _ => True
end.
Proof.
intros n m H. destruct H.
- destruct n; trivial.
- destruct H; trivial.
Qed.
Lemma le_minus : forall n, n < 1 -> n = 0.
Proof.
intros n H.
apply (le_minus_aux n 1 H).
Qed.