Goal forall (d : nat), d + 1 = d -> False.
Proof.
intros d H.
Abort.
如何从False
证明H
? inversion H
只是复制它。
答案 0 :(得分:5)
以下是如何发现一些有用的引理来从你的上下文中得出一个矛盾。首先,我们需要导入一个包含它们的模块,否则Search
命令无法发现这些引理:
Require Import Coq.Arith.Arith.
让我们检查一下我们是否有我们需要的引理(回想一下x <> y
是not (eq x y)
的符号,而not A
代表A -> False
):
Search (?x + _ <> ?x).
这次没有运气。好的,添加是可交换的,让我们这样尝试:
Search (_ + ?x <> ?x).
再也没有。但我们当然应该有类似的东西:
Search (S ?x <> ?x).
最后我们有以下问题:
Nat.neq_succ_diag_l: forall n : nat, S n <> n
我们可以这样使用:
Require Import Coq.Arith.Arith.
Goal forall (d : nat), d + 1 = d -> False.
Proof.
intros d H.
rewrite Nat.add_comm in H.
now apply Nat.neq_succ_diag_l in H.
Qed.
答案 1 :(得分:0)
证明遵循d
上的归纳并使用:
eq_add_S
: forall n m : nat, S n = S m -> n = m
基本案例是0 = 1
,通过反转导致False
,这结束了案例。归纳案例,您将d + 1 = d -> False
作为归纳假设,S d + 1 = S d -> False
作为您的目标。我们知道来自x + 1 = y + 1 -> x + y
的{{1}},因此我们重写了目标并应用了归纳假设。
完整的证据:
eq_add_S