Coq:证明<;和≤;

Coq:证明<;和≤;,coq,proof,coq-tactic,Coq,Proof,Coq Tactic,我现在正在学习Coq,在一个更大的证明中,我被以下子证明难住了: Theorem sub : ∀ n m : nat, n ≤ m → n ≠ m → n < m. 这里,“n≤ “m”的归纳定义如下: Inductive le : nat → nat → Prop := | le_n : ∀ n : nat, le n n | le_S : ∀ n m : nat, (le n m) → (le n (S m)). 我还没走多远,但我的尝试是这样的: Theore

我现在正在学习Coq,在一个更大的证明中,我被以下子证明难住了:

  Theorem sub : ∀ n m : nat, n ≤ m → n ≠ m → n < m.
这里,“n≤ “m”的归纳定义如下:

  Inductive le : nat → nat → Prop :=
  | le_n : ∀ n : nat, le n n
  | le_S : ∀ n m : nat, (le n m) → (le n (S m)).
我还没走多远,但我的尝试是这样的:

  Theorem sub : ∀ n m : nat, n ≤ m → n ≠ m → n < m.
  Proof.
    unfold lt.
    intro n.
    induction n.
    - induction m.
      + intros. exfalso. contradiction.
      + admit.
    - admit.
  Admitted.

我不知道如何利用这个假设来证明这个子目标。如果能给我提供正确的指导,我将不胜感激。

既然
le
被定义为归纳谓词,那么对其进行归纳比
n
更有意义
le
没有任何引用
0
甚至
SN
(它确实有
SM
),因此对
n
进行归纳可能不是一种方法。对
m
进行归纳可能有效,但可能比必要的难度更大

在开始正式证明之前,考虑一下如何非正式地证明这一点(尽管仍然使用相同的定义),通常会有所帮助。如果您假定
n≤ m
,然后根据
lt
的归纳定义,这意味着
n
m
是相同的,或者
m
是某个数
m'
的后继数,并且
n
小于或等于
m'
(你能看出
lt
的定义为什么意味着这一点吗?)。在第一种情况下,我们必须使用附加的假设,
n≠ m
推导出一个矛盾。在第二种情况下,我们甚至不需要它<代码>n≤ m'表示
sn≤ S m'
,所以既然
m=S m'
sn≤ m
,即
n

对于形式化,我们必须在最后一行证明
n的假设≤ m
表示
sn≤ S m
。你应该尝试类似的非正式分析来证明这一点。除此之外,非正式的证明应该直接形式化。
H:n案例分析≤ m
只是
自毁H.


还有一件事。这不是必要的,但从长远来看通常会有所帮助。在定义归纳类型(或谓词)时,如果您可以将每个构造函数中使用相同方式的参数分解出来,则可以使归纳原理更加强大。使用
le
n
的方法是普遍量化的,并且对两个构造函数使用相同的方法。
le
的每个实例都以
le n
开头

  Inductive le : nat → nat → Prop :=
  | le_n : ∀ n : nat, le n n
  | le_S : ∀ n m : nat, (le n m) → (le n (S m)).
这意味着我们可以将该索引分解为一个参数

  Inductive le' (n: nat) : nat → Prop :=
  | le_n' : le' n n
  | le_S' : ∀ m : nat, (le' n m) → (le' n (S m)).
这将为您提供一个稍微简单/更好的归纳原理

le'_ind
     : forall (n : nat) (P : nat -> Prop),
       P n ->
       (forall m : nat, le' n m -> P m -> P (S m)) ->
       forall n0 : nat, le' n n0 -> P n0
将此与
leu ind
进行比较

le_ind
     : forall P : nat -> nat -> Prop,
       (forall n : nat, P n n) ->
       (forall n m : nat, le n m -> P n m -> P n (S m)) ->
       forall n n0 : nat, le n n0 -> P n n0

基本上,这里发生的事情是,使用
leu ind
,您必须证明每个
n
的一切。使用
le''u ind
,您只需证明您正在使用的特定
n
。这有时可以简化证明,尽管这不是证明定理的必要条件。要证明这两个谓词是等价的,这是一个很好的练习。

除了@SCappella的答案外,请注意,
介绍;lia。
也会解决这个问题。
le'_ind
     : forall (n : nat) (P : nat -> Prop),
       P n ->
       (forall m : nat, le' n m -> P m -> P (S m)) ->
       forall n0 : nat, le' n n0 -> P n0
le_ind
     : forall P : nat -> nat -> Prop,
       (forall n : nat, P n n) ->
       (forall n m : nat, le n m -> P n m -> P n (S m)) ->
       forall n n0 : nat, le n n0 -> P n n0