如何从Coq假设'd = d + 1'证明`false`和扩展?

时间:2017-12-28 19:25:53

标签: coq

Goal forall (d : nat), d + 1 = d -> False.
Proof.
  intros d H.
Abort.      

如何从False证明Hinversion H只是复制它。

2 个答案:

答案 0 :(得分:5)

以下是如何发现一些有用的引理来从你的上下文中得出一个矛盾。首先,我们需要导入一个包含它们的模块,否则Search命令无法发现这些引理:

Require Import Coq.Arith.Arith.

让我们检查一下我们是否有我们需要的引理(回想一下x <> ynot (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