我不是这方面的专家,但最近在Coq 邮件列表中讨论了它。我将从这个线程中总结出结论。如果你想更彻底地理解这类问题,你应该看看双重否定翻译。
该问题属于直觉命题演算,因此可以由 决定tauto
。
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
tauto.
Qed.
该线程还提供了更详细的证明。我将尝试解释我将如何提出这个证明。请注意,我通常更容易处理引理的编程语言解释,所以这就是我要做的:
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
unfold not.
intros P f.
我们被要求编写一个函数,该函数接受该函数f
并产生一个类型的值False
。到达这一点的唯一方法False
是调用函数f
。
apply f.
因此,我们被要求为函数提供参数f
。我们有两个选择,通过P
或P -> False
。我看不到构建 a 的方法,P
所以我选择了第二个选项。
right.
intro p.
我们又回到了第一方,只是我们现在有一个p
可以合作的!所以我们申请f
,因为这是我们唯一能做的。
apply f.
再一次,我们被要求提供论据f
。不过现在这很容易,因为我们有一个p
可以使用的。
left.
apply p.
Qed.
该线程还提到了一个基于一些更简单的引理的证明。第一个引理是~(P /\ ~P)
。
Lemma lma (P:Prop) : ~(P /\ ~P).
unfold not.
intros H.
destruct H as [p].
apply H.
apply p.
Qed.
第二个引理是~(P \/ Q) -> ~P /\ ~Q
:
Lemma lma' (P Q:Prop) : ~(P \/ Q) -> ~P /\ ~Q.
unfold not.
intros H.
constructor.
- intro p.
apply H.
left.
apply p.
- intro q.
apply H.
right.
apply q.
Qed.
这些引理足以说明:
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
intros P H.
apply lma' in H.
apply lma in H.
apply H.
Qed.