如何证明排除中间在Coq中无可辩驳?

时间:2015-09-27 21:05:49

标签: logic coq coq-tactic

我试图从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来证明这一点?

感谢。

1 个答案:

答案 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的参数。我们有两种选择,可以通过PP -> 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.