如何从明显矛盾的假设中证明是假的

时间:2015-03-26 18:56:06

标签: coq proof

假设我想证明以下定理:

Theorem succ_neq_zero : forall n m: nat, S n = m -> 0 = m -> False.

这个是微不足道的,因为m不能同时为后继和零,如假设的那样。但是我发现证明这一点非常棘手,而且我不知道如何在没有辅助引理的情况下制作它:

Lemma succ_neq_zero_lemma : forall n : nat, O = S n -> False.
Proof.
  intros.
  inversion H.
Qed.

Theorem succ_neq_zero : forall n m: nat, S n = m -> 0 = m -> False.
Proof.
  intros.
  symmetry in H.
  apply (succ_neq_zero_lemma n).
  transitivity m.
  assumption.
  assumption.
Qed.

我很确定有更好的方法来证明这一点。最好的方法是什么?

3 个答案:

答案 0 :(得分:7)

您只需要在第一个等式中替换m

Theorem succ_neq_zero : forall n m: nat, S n = m -> 0 = m -> False.
Proof.
intros n m H1 H2; rewrite <- H2 in H1; inversion H1.
Qed.

答案 1 :(得分:6)

有一种非常简单的方法可以证明它:

Theorem succ_neq_zero : forall n m: nat, S n = m -> 0 = m -> False.
Proof.
  congruence.
Qed.

congruence策略是关于未解释符号的基本平等的决策程序。对于未解释的符号和构造函数来说,它是完整的,所以在这样的情况下,它可以证明相等0 = m是不可能的。

答案 2 :(得分:1)

了解同余如何运作可能会有用。

为了证明由不同构造函数构造的两个术语实际上是不同的,只需创建一个函数,在一个案例中返回True,在其他情况下返回False,然后用它来证明{{ 1}}。我认为这在Coq'Art

中有解释
True = False