我一直试图在Coq中证明以下重言式。
Theorem Axiom3: forall A B: Prop, (~A -> ~B)-> ((~A -> B) -> A).
我的计划是遵循以下条件
Theorem Axiom3: forall A B: Prop, (~A -> ~B)-> ((~A -> B) -> A).
Proof.
intros A B.
unfold not.
intros nA_implies_nB.
intros nA_implies_B.
pose (proof_of_False := nA_implies_nB nA_implies_B).
case proof_of_False.
Qed.
但是,以下是我的问题所在。
pose (proof_of_False := nA_implies_nB nA_implies_B).
我不能简单地将以下内容组合在一起以获得错误的证明。
nA_implies_nB : (A -> False) -> B -> False
nA_implies_B : (A -> False) -> B
我的证明可以改编为正确的或正确的证明吗?
答案 0 :(得分:2)
此陈述等同于排除中间的原理,该原则认为const intersect = (num1,num2) => num1.filter(x => num2.includes(x))
console.log(intersect([1,2,2,1],[2,2]))
适用于任何命题A \/ ~A
。被排除的中间因它在Coq和其他基于构造数学的系统中的缺失而臭名昭著。为了证明Coq中的陈述,您必须明确声明要承担非构造性推理。
A
如果注释掉第一行,您将看到证明失败,因为Coq不会尝试使用证明中排除的中间部分。
如果您感到好奇,这里有一个更明确的证据证明Require Import Coq.Logic.Classical.
Theorem Axiom3: forall A B: Prop, (~A -> ~B)-> ((~A -> B) -> A).
Proof. intros A B. tauto. Qed.
暗示被排除的中间物:
Axiom3