使用“依赖感应”策略在进行归纳时保持信息

时间:2015-12-04 12:12:28

标签: coq induction coq-tactic

我刚刚遇到问题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如何运作?

1 个答案:

答案 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)。

请注意,通过稍微概括一下您的结果,始终可以在没有rememberdependent 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.