如何证明forall n:nat,~n <n in Coq?

DAN*_*Fan 2 logic coq

我已经困惑了几个小时,我无法弄清楚如何证明

forall n:nat, ~n<n
Run Code Online (Sandbox Code Playgroud)

在Coq.我真的需要你的帮助.有什么建议?

Gil*_*il' 5

这个引理在标准库中:

Require Import Arith.
Lemma not_lt_refl : forall n:nat, ~n<n.
Print Hint.
Run Code Online (Sandbox Code Playgroud)

其中的结果是lt_irrefl.实现这一目标的更直接的方法是

info auto with arith.
Run Code Online (Sandbox Code Playgroud)

这证明了目标,并说明了如何:

intro n; simple apply lt_irrefl.
Run Code Online (Sandbox Code Playgroud)

既然你知道在哪里可以找到证明,那么我只是从第一原则(我认为这是你的功课的重点)提示如何做到这一点.

首先,你需要证明一个否定.这几乎意味着你推动n<n作为一个假设并证明你可以推断出一个矛盾.然后,为了推理n<n,将其扩展到其定义.

intros h H.
red in H.   (* or `unfold lt in H` *)
Run Code Online (Sandbox Code Playgroud)

现在你需要证明S n <= n不可能发生.要从第一原则做到这一点,那么你有两个选择:你可以尝试导入n,或者你可以尝试导入<=.该<=谓词通过感应定义,并经常在你需要导入就可以了这些情况下-也就是对你的假设的证据推理感应.在这里,不过,你最终会需要理智上n,以表明n不能是m 的继任者S n,你就可以开始对中引起n直线距离.

之后induction n,你需要证明基本情况:你有假设1 <= 0,你需要证明这是不可能的(目标是False).通常,要将归纳假设分解为案例,您可以使用该induction策略或其中一种变体.这种策略构成了对假设的相当复杂的依赖案例分析.查看正在发生的事情的一种方法是调用simple inversion,这会留下两个子目标:假设的证明1 <= 0使用le_n构造函数,这需要1 = 0,或者证明使用le_S构造函数,这需要S m = 0.在这两种情况下,要求显然与定义相矛盾S,因此策略discriminate证明了子目标.而不是simple inversion H,你可以使用inversion H,在这种特殊情况下直接证明了目标(不可能的假设情况非常普遍,并且它已经融入了完整的inversion战术).

现在,我们转向感应的情况下,我们赶快来,我们想证明这一点S n <= nS (S n) <= S n.我建议你把它作为一个单独的引理(首先证明),这可以概括为:forall n m, S n <= S m -> n <= m.