感情关系

时间:2017-05-17 12:25:47

标签: coq coq-tactic

我试图证明关于自然界的顺序的以下玩具定理:

Inductive Le: nat -> nat -> Prop :=
  | le_n: forall n, Le n n
  | le_S: forall n m, Le n m -> Le n (S m).

Theorem le_Sn_m: forall n m,
  Le (S n) m -> Le n m.

在纸面上,这是对Le (S n) m的简单归纳。特别是le_n的基本情况是微不足道的。

在Coq中,从感应开始我的证明给了我以下内容:

Proof.
  intros n m H. induction H.

1 subgoal
n, n0 : nat
______________________________________(1/1)
Le n n0

......在这种情况下我被封锁了。

我应该如何继续?

3 个答案:

答案 0 :(得分:4)

这种情况正在发生,因为Coq对待 indices 参数(请参阅this question的已接受答案)以获得非常好的解释。 您的Le关系仅使用索引,而标准定义使第一个参数成为参数:

Inductive le (n : nat) : nat -> Prop :=
| le_n : n <= n
| le_S : forall m : nat, n <= m -> n <= S m

我可以推荐James Wilcox阅读this blog post。以下是相关摘录:

  

当Coq执行案例分析时,它首先抽象所有索引。在谓词上使用destruct时,您可能已经将此清单视为信息丢失

所以你可以(1)改变你的Le关系以便使用参数,或者(2)使用@Zimm i48建议的remember策略,或者(3)使用@Vinz提到的dependent induction策略:

Require Import Coq.Program.Equality.   (* for `dependent induction` *)

Inductive Le: nat -> nat -> Prop :=
  | le_n: forall n, Le n n
  | le_S: forall n m, Le n m -> Le n (S m).
Hint Constructors Le.                  (* so `auto` will work *)

Theorem le_Sn_m: forall n m,
  Le (S n) m -> Le n m.
Proof. intros n m H. dependent induction H; auto. Qed.

答案 1 :(得分:3)

这是由于Coq的限制,当使用induction对不仅仅由变量构成的术语时。通过引导,Coq忘记了第一个参数是某个S的{​​{1}}这一事实。

您可以执行以下操作:

n

我认为某个地方Theorem le_Sn_m_: forall X m, Le X m -> forall n, X = S n -> Le n m. 可以为您节省这个中间引理,但我无法回忆起哪里。

答案 2 :(得分:3)

与@Vinz建议相似,但不改变您所证明的陈述:

Proof.
  intros n m H.
  remember (S n) as p.
  induction H.

使用remember策略将在您的上下文中引入相等性,这将避免丢失此关键信息。