【问题标题】:Coq: Proving relation between < and ≤Coq:证明 < 和 ≤ 之间的关系
【发布时间】:2019-08-30 02:34:02
【问题描述】:

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

  Theorem sub : ∀ n m : nat, n ≤ m → n ≠ m → n < m.

或者,一旦展开:

  Theorem sub : ∀ n m : nat, n ≤ m → n ≠ m → S 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.

在第一个归纳步骤(由第一个承认标记)中,归纳假设显示以下内容:

1 subgoal
m : nat
IHm : 0 ≤ m → 0 ≠ m → 1 ≤ m
______________________________________(1/1)
0 ≤ S m → 0 ≠ S m → 1 ≤ S m

我不确定如何利用这个假设来证明子目标。我将不胜感激任何正确方向的指导。

【问题讨论】:

  • 除了@SCappella 的回答,注意intros; lia. 也可以解决。

标签: coq proof coq-tactic


【解决方案1】:

由于le 被定义为归纳谓词,因此对其进行归纳比n 更有意义。 le 没有引用 0 甚至 S n(它确实有 S m),所以对 n 的归纳可能不是要走的路。 m 的感应可能有效,但可能比必要的要难。

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

为了形式化,我们必须在最后一行证明n ≤ m 隐含S n ≤ S m 的假设。您应该尝试类似的非正式分析来证明这一点。除此之外,非正式证明应该可以直接形式化。 H: n ≤ m的案例分析就是destruct H.


还有一件事。这不是必需的,但从长远来看通常会有所帮助。在定义归纳类型(或谓词)时,如果您可以分解出在每个构造函数中使用相同方式的参数,则可以使归纳原理更加强大。使用len 的方式是普遍量化的,并且对两个构造函数使用相同的方式。 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

将此与 le_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

基本上这里发生的情况是,对于le_ind,您必须为每个n 证明一切。使用le'_ind,您只需证明您正在使用的特定n。这有时可以简化证明,尽管它不是证明你的定理所必需的。证明这两个谓词等价是一个很好的练习。

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多