tin*_*lyx 8 logic coq coq-tactic
我试图从一个排除中间的在线课程中证明以下简单定理是无可辩驳的,但在第1步被卡住了:
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
Proof.
intros P. unfold not. intros H.
Run Code Online (Sandbox Code Playgroud)
现在我得到:
1 subgoals
P : Prop
H : P \/ (P -> False) -> False
______________________________________(1/1)
False
Run Code Online (Sandbox Code Playgroud)
如果我apply H,那么目标就是P \/ ~P,中间被排除在外,无法建设性地证明.但除此之外apply,我不知道可以对假设做些什么P \/ (P -> False) -> False:暗示->是原始的,我不知道如何destruct分解它.这是唯一的假设.
我的问题是,如何使用原始策略(如此处所表征,即没有神秘auto的策略)来证明这一点?
谢谢.
Kon*_*itz 14
我不是这方面的专家,但最近在Coq邮件列表上进行了讨论.我将从这个帖子中总结出结论.如果你想更彻底地理解这些问题,你应该看看双重否定翻译.
问题属于直觉主义命题演算,因此可以由此决定tauto.
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
tauto.
Qed.
Run Code Online (Sandbox Code Playgroud)
该线程还提供了更精细的证据.我将尝试解释如何提出这个证据.请注意,我通常更容易处理lemmas的编程语言解释,所以这就是我要做的:
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
unfold not.
intros P f.
Run Code Online (Sandbox Code Playgroud)
我们被要求编写一个函数来获取函数f并生成一个类型的值False.False到目前为止,唯一的方法是调用该函数f.
apply f.
Run Code Online (Sandbox Code Playgroud)
因此,我们被要求提供函数的参数f.我们有两个选择,通过P或P -> False.我没有看到构建一个方法,P所以我选择了第二个选项.
right.
intro p.
Run Code Online (Sandbox Code Playgroud)
我们回到了第一个方向,除了我们现在有一个p合作!所以我们申请,f因为这是我们唯一可以做的事情.
apply f.
Run Code Online (Sandbox Code Playgroud)
再次,我们被要求提供论据f.现在这很容易,因为我们有一个p合作.
left.
apply p.
Qed.
Run Code Online (Sandbox Code Playgroud)
该线程还提到了一个基于一些更简单的引理的证明.第一个引理是~(P /\ ~P).
Lemma lma (P:Prop) : ~(P /\ ~P).
unfold not.
intros H.
destruct H as [p].
apply H.
apply p.
Qed.
Run Code Online (Sandbox Code Playgroud)
第二个引理是~(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.
Run Code Online (Sandbox Code Playgroud)
这些lemmas足以显示:
Theorem excluded_middle_irrefutable: forall (P:Prop), ~~(P \/ ~ P).
intros P H.
apply lma' in H.
apply lma in H.
apply H.
Qed.
Run Code Online (Sandbox Code Playgroud)