我已经困惑了几个小时,我无法弄清楚如何证明
forall n:nat, ~n<n
在Coq。我真的需要你的帮助。有什么建议吗?
答案 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.