证明(~A->;~B)>;(~A->;B)——>;Coq中的A

证明(~A->;~B)>;(~A->;B)——>;Coq中的A,coq,proof,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. intr

我一直在努力证明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

我的证明可以用来证明或纠正这个定理吗?或者有一种简单的方法来证明这个定理吗?

这句话相当于排除中间原则,即
A\/~A
适用于任何命题
A
。被排除在外的中间因其在Coq和其他基于构造数学的系统中的缺失而臭名昭著。为了证明Coq中的陈述,您必须明确声明您想要假设非建设性推理

Require Import Coq.Logic.Classical.

Theorem Axiom3: forall A B: Prop, (~A -> ~B)-> ((~A -> B) -> A).
Proof. intros A B. tauto. Qed.
如果您注释掉第一行,您将看到证明失败,因为Coq不会尝试在证明中使用排除的中间部分

如果您感到好奇,这里有一个更明确的证据证明
Axiom3
如何暗示排除的中间:

Axiom Axiom3: forall A B: Prop, (~A -> ~B)-> ((~A -> B) -> A).

Lemma classical : forall A : Prop, A \/ ~ A.
Proof.
intros A.
apply (Axiom3 (A \/ ~A) (A \/ ~A)).
- trivial.
- intros H. exfalso.
  assert (H' : ~ ~ A).
  { intros HA. apply H. right. trivial. }
  apply H'. intros HA. apply H. left. trivial.
Qed.

在证明这个公理是经典的过程中,可能更容易通过双重否定消去法(即选择
B=False
)。