如何证明fo:n,nat,~n

时间:2011-11-12 07:41:45

标签: logic coq

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

forall n:nat, ~n<n

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

2 个答案:

答案 0 :(得分:5)

这个引理在标准库中:

Require Import Arith.
Lemma not_lt_refl : forall n:nat, ~n<n.
Print Hint.

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

info auto with arith.

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

intro n; simple apply lt_irrefl.

既然你知道在哪里可以找到证明,我只会从第一原则(我认为这是你的家庭作业的重点)提示如何做到这一点。

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

intros h H.
red in H.   (* or `unfold lt in H` *)

现在你需要证明S n <= n不可能发生。要从第一原则做到这一点,您有两个选择:您可以尝试导入n,或者您可以尝试导入<=<=谓词是通过归纳来定义的,通常在这些情况下你需要引导它 - 也就是说,通过对你的假设证明的归纳来推理。但是,在这里,您最终需要在n上进行推理,以证明n不能成为S n的m th 后继者,并且您可以开始直接引导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 <= n证明S (S n) <= S n。我建议您将此声明为单独的引理(首先要证明),这可以概括为:forall n m, S n <= S m -> n <= m

答案 1 :(得分:2)

Require Import Arith.
auto with arith.
相关问题