我试图从an online course证明以下简单的定理,排除中间是无可辩驳的,但在第1步被卡住了:
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
Proof.
intros P. unfold not. intros H.
现在我明白了:
1 subgoals
P : Prop
H : P \/ (P -> False) -> False
______________________________________(1/1)
False
如果我apply H
,那么目标就是P \/ ~P
,其被排除在中间位置,无法进行建设性的证明。但除了apply
之外,我不知道可以对假设P \/ (P -> False) -> False
做些什么:暗示->
是原始的,我不知道如何destruct
或分解它。这是唯一的假设。
我的问题是,如何仅使用原始策略(as characterized here,即没有神秘的auto
来证明这一点?
感谢。
答案 0 :(得分:13)
我不是这方面的专家,但最近在Coq mailing-list进行了讨论。我将从这个帖子中总结出结论。如果您想更彻底地了解这些问题,请查看double-negation translation。
问题属于直觉主义命题演算,因此可以由tauto
决定。
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
tauto.
Qed.
该主题还提供了更精细的证据。我将尝试解释如何提出这个证据。请注意,我通常更容易处理lemmas的编程语言解释,所以这就是我要做的:
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
unfold not.
intros P f.
我们被要求编写一个函数,它接受函数f
并生成类型为False
的值。此时到达False
的唯一方法是调用函数f
。
apply f.
因此,我们被要求提供函数f
的参数。我们有两种选择,可以通过P
或P -> False
。我没有看到构建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.
这些lemmas足以显示:
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
intros P H.
apply lma' in H.
apply lma in H.
apply H.
Qed.