为什么可以';t反演可以用于Coq中的普遍限定假设吗?

为什么可以';t反演可以用于Coq中的普遍限定假设吗?,coq,Coq,我一直在学习软件基础课程,发现了以下证据() 我很好奇,为什么会有一个断言说(px)\/((px)->False),如果我在H中展开,而不在H中展开,我会得到与断言完全相同的H:forall p:Prop,p\/(p->False),只是有一个通用量词 这一点更为明显,因为只要执行apply H,就可以证明该断言,而该步骤的全部原因是对新断言的HP执行inversion HP 问题是,为什么不可能在一开始就直接执行反转H,而省去定义断言的额外步骤,而断言只是复制一个假设?有更好的方法吗?倒装仅适

我一直在学习软件基础课程,发现了以下证据()

我很好奇,为什么会有一个断言说
(px)\/((px)->False)
,如果我
在H
中展开,而
不在H
中展开,我会得到与断言完全相同的
H:forall p:Prop,p\/(p->False)
,只是有一个通用量词

这一点更为明显,因为只要执行
apply H
,就可以证明该断言,而该步骤的全部原因是对新断言的HP执行
inversion HP


问题是,为什么不可能在一开始就直接执行
反转H
,而省去定义断言的额外步骤,而断言只是复制一个假设?有更好的方法吗?

倒装
仅适用于归纳类型的事物,例如
forall
不是归纳型构造函数,因此不能对其执行
inversion
。你可以扩展
倒置
来表现得像
(e)destruct
:如果你给它一些普遍量化的东西,它会产生额外的存在和证明义务,你需要履行这些义务来填补缺失的地方,并破坏结论。然而,这不是它现在的工作方式

我们可以通过应用
H
并直接破坏它来进行更直接的证明:

Theorem not_exists_dist :
  excluded_middle ->
  forall (X:Type) (P : X -> Prop),
    ~ (exists x, ~ P x) -> (forall x, P x).
Proof.
  intros.
  destruct (H (P x)).
  apply H1.
  exfalso. apply H0. exists x. apply H1.
Qed.
Theorem not_exists_dist :
  excluded_middle ->
  forall (X:Type) (P : X -> Prop),
    ~ (exists x, ~ P x) -> (forall x, P x).
Proof.
  intros.
  destruct (H (P x)).
  apply H1.
  exfalso. apply H0. exists x. apply H1.
Qed.