我一直在阅读软件基础课程并找到以下证明(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 H
和unfold not in H
,我会得到与断言完全相同的H : forall P : Prop, P \/ (P -> False)
,只有那是一个普遍的量词。
这更为明显,因为断言只能通过apply H
来证明,而这一步的全部原因是对新断言的假设进行inversion HP
。
问题是,为什么不能在开头直接做inversion H
,并且不需要额外的步骤来定义断言,这只是复制其中一个假设?有更好的方法吗?
答案 0 :(得分:3)
inversion
仅适用于归纳类型的内容,例如or
。 forall
不是归纳类型构造函数,因此无法对其执行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.