为什么不能在Coq中使用普遍合格的假设进行反演?

时间:2014-12-22 00:54:24

标签: coq

我一直在阅读软件基础课程并找到以下证明(source link)。

Theorem not_exists_dist :
  excluded_middle ->
  forall (X:Type) (P : X -> Prop),
    ~ (exists x, ~ P x) -> (forall x, P x).
Proof.
  unfold not. intros.
  unfold excluded_middle in H.
  assert ((P x) \/ ((P x) -> False)) as HP.
  apply H with (P:=(P x)).
  inversion HP.
  apply H1.
  apply ex_falso_quodlibet. apply H0. exists x. apply H1.
Qed.

我很好奇,为什么有一个断言说(P x) \/ ((P x) -> False),如果我unfold excluded_middle in Hunfold not in H,我会得到与断言完全相同的H : forall P : Prop, P \/ (P -> False) ,只有那是一个普遍的量词。

这更为明显,因为断言只能通过apply H来证明,而这一步的全部原因是对新断言的假设进行inversion HP

问题是,为什么不能在开头直接做inversion H,并且不需要额外的步骤来定义断言,这只是复制其中一个假设?有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

inversion仅适用于归纳类型的内容,例如orforall不是归纳类型构造函数,因此无法对其执行inversion。人们可以将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.