Coq 关系归纳法

Coq 关系归纳法,coq,coq-tactic,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(sn)m的一个简单归纳。特别是,le_n的基本情况并不重要 但是,在Coq中,以归纳法开始我

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

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(sn)m
的一个简单归纳。特别是,
le_n
的基本情况并不重要

但是,在Coq中,以归纳法开始我的证明给了我以下信息:

Proof.
  intros n m H. induction H.

1 subgoal
n, n0 : nat
______________________________________(1/1)
Le n n0
…在这种情况下,我会被阻止


我应该如何处理呢?

这是由于Coq的限制,当使用
归纳法时,不只是使用变量。通过归纳,Coq忘记了第一个参数是某个
n
S

您可以改为执行以下操作:

Theorem le_Sn_m_: forall X m,
  Le X m -> forall n, X = S n -> Le n m.

我认为有一个
依赖归纳法
可以拯救你这个中间引理,但我不记得在哪里。

类似于@Vinz建议,但不改变你正在证明的陈述:

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

使用该策略将在您的上下文中引入一个等式,从而避免丢失此关键信息。

之所以会出现这种情况,是因为Coq对索引和参数的处理方式不同(请参阅的公认答案,以获得非常好的解释)。 您的
Le
关系仅使用索引,而标准定义将第一个参数作为参数:

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

IMHO这个例子可以作为对Coq归纳类型和指标的练习;但是,如果你打算做的是规范<代码> NAT > BoOL 。@ VIZ,如果你使用Emacs和证明一般,那么考虑查看公司COQ模式。当您开始键入命令时,它会弹出一个包含完成项的弹出窗口,您可以选择一个,按ctrl-h键并在《技术参考手册》中获取文档。因此,在这种情况下,只需键入'depe'并向下箭头至'dependent inclution ident',然后按ctrl-h。文档将告诉您包括Coq.Program.Equality。至少为您节省了一次网络浏览器之旅和一次心理上下文切换…很高兴知道!谢谢@larsr
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.