我试图证明关于自然界的顺序的以下玩具定理:
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
......在这种情况下我被封锁了。
我应该如何继续?
答案 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
策略将在您的上下文中引入相等性,这将避免丢失此关键信息。