如何从Coq的证人中引入一种新的存在条件?

时间:2015-10-15 05:17:12

标签: coq coq-tactic

我的问题涉及如何在一组条件/假设中构建exist项。

我有以下中间证明状态:

X : Type
P : X -> Prop
H : (exists x : X, P x -> False) -> False
x : X
H0 : P x -> False
______________________________________(1/1)
P x

在我看来,我知道由于H0x(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)).

2 个答案:

答案 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。您可以使用Falseexfalso等策略将目标更改为contradiction。使用这种方法,您可以使用原本难以操作的_ -> False形式的假设。为了您的证明,您可以写:

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