在Coq中证明(〜A->〜B)->(〜A-> B)-> A

时间:2019-03-19 00:33:55

标签: coq proof

我一直试图在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

我的证明可以改编为正确的或正确的证明吗?

1 个答案:

答案 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