如何从Coq证人那里引入新的存在条件?

如何从Coq证人那里引入新的存在条件?,coq,coq-tactic,Coq,Coq Tactic,我的问题涉及如何在一组条件/假设中构造一个存在项 我有以下中间证明状态: 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是存在x:x,px->False的见证,我想介绍一个名称: w: (exists x : X, P

我的问题涉及如何在一组条件/假设中构造一个存在项

我有以下中间证明状态:

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是存在x:x,px->False的见证,我想介绍一个名称:

w: (exists x : X, P x -> False)
基于上述推理,然后将其与应用H-in-w一起在假设中生成一个False,最后将False反转

但我不知道用什么策略/语法来介绍上面的证人w。到目前为止,我所能达到的最好结果是检查ex_intro u fun x=>px->False xh0。给假

有人能解释一下如何引入存在条件,或者用另一种方式来完成证明吗

谢谢

另外,我要证明的是整个定理:

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)).
您可以使用断言策略:

它将要求你在一个新的子目标中证明这一点,并在现有目标的基础上增加w。对于这种琐碎的证明,您可以直接内联证明:

assert(w: exists x, P x -> False) by (exists x; exact H0).

在这里,因为您已经知道如何构造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))
完成证明的另一种方法是证明错误。你可以用exfalso或矛盾等战术将目标改为False。通过这种方法,您可以使用形式为->False的假设,否则很难操纵这些假设。作为证明,你可以写:

exfalso. apply H. (* or directly, contradiction H *)
exists x. assumption.

请注意,没有必要展开或不使用它们。谢谢。这很有趣,因为我尝试了归纳法,但没有成功。你能解释一下为什么destruct在这里工作吗?事实上,它对我很有效。可能是因为您使用的下划线。ex_intro需要4个参数,但第一个参数是隐式的,因此不需要指定它。我将编辑我的答案。但我不明白为什么它通过了你的类型检查。我的错,我尝试了反转而不是归纳试图反转错误。但它不起作用。你知道为什么自毁/归纳法有效而反转法无效吗?它对我也有效。在姿势证明H ex_intro fun x=>P x->False x H0之后,反转H1解决了目标。你想逆转什么?请注意,您必须颠倒类型为False的假设,而不是False本身。谢谢。我可能倒错了,而不是它的证据。
exfalso. apply H. (* or directly, contradiction H *)
exists x. assumption.