我的上下文中有假设i <= 0
和i >= 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.
主要区别在于如何定义<=
运算符le
和Z.le
。 Z.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
。
还有其他方法可以证明这一点,您应该查看有关nat
和Z
的库。您还可以通过打印(Omega
)Qed之后的证明内容,将这些脚本与Print xxx
生成的脚本进行比较。
最佳,
诉P>