如何从矛盾的假设中证明目标?

时间:2014-08-09 20:06:56

标签: coq

我的上下文中有假设i <= 0i >= 2。我怎样才能证明我的目标?这有策略吗?

2 个答案:

答案 0 :(得分:3)

您可以使用Omega策略自动解决此问题。

Require Import Omega.
Open Scope Z_scope.

Lemma xxx : forall i : Z, i <= 0 -> i >= 2 -> False.
  Proof.
    intros.
    omega.
  Qed.

答案 1 :(得分:2)

如果您对证明的内容感兴趣,而不仅仅是&#34;是真还是假?#34;这里是一个脚本&#34;手工&#34;其中详细介绍了证明这一主张的一种方法。顺便说一句,既然OP没有给出i的类型,我首先假设它是一个自然数。

Lemma xxx : forall i : nat, i <= 0 -> i >= 2 -> False.
Proof.
intros i h_i_O h_2_i.
assert (h_2_O: 2 <= 0).
- apply le_trans with i.
  + exact h_2_i. (* i >= 2 is just a notation for 2 <= i *)
  + exact h_i_O.
- apply le_Sn_O in h_2_O.
  contradiction.
Qed.  

我们的想法是:如果2 <= i <= 0然后2 <= 0,则S n的任何数量都不可能小于或等于0

如果您需要Z上的相同结果:

Lemma yyy : forall i : Z, i <= 0 -> i >= 2 -> False.
Proof.
intros i h_i_O h_2_i.
assert (h_2_O: 2 <= 0).
- apply Zle_trans with i.
  + apply Z.ge_le; exact h_2_i. (* here we first need to switch the direction of <= by hand *)
  + exact h_i_O.
- vm_compute in h_2_O. 
  apply h_2_O; reflexivity.
Qed. 

主要区别在于如何定义<=运算符leZ.leZ.le构建于可判定函数Z.compare (a.k.a. ?=)之上(基本上,Z.le a b表示Z.compare a b <> Gt),因此vm_compute调用要求Z.compare计算2 ?= 0的结果,Gt(2大于0),因此您最终会得到用于关闭目标的假设Gt = Gt -> False

还有其他方法可以证明这一点,您应该查看有关natZ的库。您还可以通过打印(Omega)Qed之后的证明内容,将这些脚本与Print xxx生成的脚本进行比较。

最佳,