我的问题涉及如何在一组条件/假设中构建exist
项。
我有以下中间证明状态:
X : Type
P : X -> Prop
H : (exists x : X, P x -> False) -> False
x : X
H0 : P x -> False
______________________________________(1/1)
P x
在我看来,我知道由于H0
,x
是(exists x : X, P x -> False)
的见证人,我想引入一个名字:
w: (exists x : X, P x -> False)
基于上述推理,然后将其与apply H in w
一起用于在假设中生成False
,最后inversion
False
。
但我不知道用什么策略/语法来介绍上面的见证w
。到目前为止,我能达到的最好效果是Check (ex_intro _ (fun x => P x -> False) x H0)).
给出了False
。
有人可以解释如何引入存在条件,或者另外一种方法来完成证明吗?
感谢。
P.S。我对整个定理的证明是:
Theorem not_exists_dist :
excluded_middle ->
forall (X:Type) (P : X -> Prop),
~ (exists x, ~ P x) -> (forall x, P x).
Proof.
unfold excluded_middle. unfold not.
intros exm X P H x.
destruct (exm (P x)).
apply H0.
Check (H (ex_intro _ (fun x => P x -> False) x H0)).
答案 0 :(得分:2)
您可以使用assert
策略:
assert(w: exists x, P x -> False).
它会要求您在新的子目标中证明此声明,并将w
添加到您的现有目标中。对于这种琐碎的证明,您可以直接内联证明:
assert(w: exists x, P x -> False) by (exists x; exact H0).
答案 1 :(得分:2)
此处,由于您已经知道如何构建False
类型的术语,因此可以使用pose proof
将其添加到上下文中。这给出了:
pose proof (H (ex_intro (fun x => P x -> False) x H0))
你甚至可以直接破坏这个术语,从而解决目标。
destruct (H (ex_intro (fun x => P x -> False) x H0))
完成证明的另一种方法是证明False
。您可以使用False
或exfalso
等策略将目标更改为contradiction
。使用这种方法,您可以使用原本难以操作的_ -> False
形式的假设。为了您的证明,您可以写:
exfalso. apply H. (* or directly, contradiction H *)
exists x. assumption.