Built with Alectryon, running Coq+SerAPI v8.10.0+0.7.0. Coq sources are in this panel; goals and messages will appear in the other. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+β Ctrl+β to navigate, Ctrl+π±οΈ to focus.
(* -*- coding: utf-8 -*- *)
(************************************************************************)
(* * The Coq Proof Assistant / The Coq Development Team *)
(* v * INRIA, CNRS and contributors - Copyright 1999-2018 *)
(* <O___,, * (see CREDITS file for the list of authors) *)
(* \VV/ **************************************************************)
(* // * This file is distributed under the terms of the *)
(* * GNU Lesser General Public License Version 2.1 *)
(* * (see LICENSE file for the text of the license) *)
(************************************************************************)
Some facts and definitions about classical logic
Table of contents:
1. Propositional degeneracy = excluded-middle + propositional extensionality
2. Classical logic and proof-irrelevance
2.1. CC |- prop. ext. + A inhabited -> (A = A->A) -> A has fixpoint
2.2. CC |- prop. ext. + dep elim on bool -> proof-irrelevance
2.3. CIC |- prop. ext. -> proof-irrelevance
2.4. CC |- excluded-middle + dep elim on bool -> proof-irrelevance
2.5. CIC |- excluded-middle -> proof-irrelevance
3. Weak classical axioms
3.1. Weak excluded middle
3.2. GΓΆdel-Dummett axiom and right distributivity of implication over
disjunction
3 3. Independence of general premises and drinker's paradox
4. Principles equivalent to classical logic
4.1 Classical logic = principle of unrestricted minimization
4.2 Classical logic = choice of representatives in a partition of bool
(************************************************************************)
i.e. (β A, A=True β¨ A=False)
β
(β A, A\/~A) β§ (β A B, (AβB) β A=B)
prop_degeneracy (also referred to as propositional completeness)
asserts (up to consistency) that there are only two distinct formulas
Definition prop_degeneracy := forall A:Prop, A = True \/ A = False.
prop_extensionality asserts that equivalent formulas are equal
Definition prop_extensionality := forall A B:Prop, (A <-> B) -> A = B.
excluded_middle asserts that we can reason by case on the truth
or falsity of any formula
Definition excluded_middle := forall A:Prop, A \/ ~ A.
We show prop_degeneracy β (prop_extensionality β§ excluded_middle)
prop_degeneracy -> prop_extensionalityprop_degeneracy -> prop_extensionalityH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = TrueH1:B = TrueA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = TrueH1:B = FalseA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = TrueA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = FalseA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = TrueH1:B = FalseA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = TrueA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = FalseA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = TrueH1:B = False~ BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = TrueH1:B = FalseBH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = TrueA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = FalseA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = TrueH1:B = FalseBH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = TrueA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = FalseA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = TrueA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = FalseA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = True~ AH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = TrueAH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = FalseA = BH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = TrueAH:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = FalseA = Brewrite H1; exact H0. Qed.H:prop_degeneracyA, B:PropHab:A -> BHba:B -> AH0:A = FalseH1:B = FalseA = Bprop_degeneracy -> excluded_middleprop_degeneracy -> excluded_middleH:prop_degeneracyA:PropA \/ ~ AH:prop_degeneracyA:PropH0:A = TrueA \/ ~ AH:prop_degeneracyA:PropH0:A = FalseA \/ ~ Aright; rewrite H0; exact (fun x => x). Qed.H:prop_degeneracyA:PropH0:A = FalseA \/ ~ Aprop_extensionality -> excluded_middle -> prop_degeneracyprop_extensionality -> excluded_middle -> prop_degeneracyExt:prop_extensionalityEM:excluded_middleA:PropA = True \/ A = FalseExt:prop_extensionalityEM:excluded_middleA:PropH:AA = True \/ A = FalseExt:prop_extensionalityEM:excluded_middleA:PropH:~ AA = True \/ A = Falseright; apply (Ext A False); split; [ exact H | apply False_ind ]. Qed.Ext:prop_extensionalityEM:excluded_middleA:PropH:~ AA = True \/ A = False
A weakest form of propositional extensionality: extensionality for
provable propositions only
Require Import PropExtensionalityFacts. Definition provable_prop_extensionality := forall A:Prop, A -> A = True.prop_extensionality -> provable_prop_extensionalityexact PropExt_imp_ProvPropExt. Qed. (************************************************************************)prop_extensionality -> provable_prop_extensionality
(************************************************************************)
We successively show that:
prop_extensionality
implies equality of A and AβA for inhabited A, which
implies the existence of a (trivial) retract from AβA to A
(just take the identity), which
implies the existence of a fixpoint operator in A
(e.g. take the Y combinator of lambda-calculus)
Notation inhabited A := A (only parsing).prop_extensionality -> forall A : Prop, A -> (A -> A) = Aprop_extensionality -> forall A : Prop, A -> (A -> A) = Aapply (Ext (A -> A) A); split; [ exact (fun _ => a) | exact (fun _ _ => a) ]. Qed. Record retract (A B:Prop) : Prop := {f1 : A -> B; f2 : B -> A; f1_o_f2 : forall x:B, f1 (f2 x) = x}.Ext:prop_extensionalityA:Propa:A(A -> A) = Aprop_extensionality -> forall A : Prop, A -> retract A (A -> A)prop_extensionality -> forall A : Prop, A -> retract A (A -> A)Ext:prop_extensionalityA:Propa:Aretract A (A -> A)Ext:prop_extensionalityA:Propa:Aretract A Areflexivity. Qed. Record has_fixpoint (A:Prop) : Prop := {F : (A -> A) -> A; Fix : forall f:A -> A, F f = f (F f)}.Ext:prop_extensionalityA:Propa:Aforall x : A, x = xprop_extensionality -> forall A : Prop, A -> has_fixpoint Aprop_extensionality -> forall A : Prop, A -> has_fixpoint AExt:prop_extensionalityA:Propa:Ahas_fixpoint AExt:prop_extensionalityA:Propa:Ag1:A -> A -> Ag2:(A -> A) -> Ag1_o_g2:forall x : A -> A, g1 (g2 x) = xhas_fixpoint AExt:prop_extensionalityA:Propa:Ag1:A -> A -> Ag2:(A -> A) -> Ag1_o_g2:forall x : A -> A, g1 (g2 x) = xforall f : A -> A, f (g1 (g2 (fun x : A => f (g1 x x))) (g2 (fun x : A => f (g1 x x)))) = f (f (g1 (g2 (fun x : A => f (g1 x x))) (g2 (fun x : A => f (g1 x x)))))Ext:prop_extensionalityA:Propa:Ag1:A -> A -> Ag2:(A -> A) -> Ag1_o_g2:forall x : A -> A, g1 (g2 x) = xf:A -> Af (g1 (g2 (fun x : A => f (g1 x x))) (g2 (fun x : A => f (g1 x x)))) = f (f (g1 (g2 (fun x : A => f (g1 x x))) (g2 (fun x : A => f (g1 x x)))))Ext:prop_extensionalityA:Propa:Ag1:A -> A -> Ag2:(A -> A) -> Ag1_o_g2:forall x : A -> A, g1 (g2 x) = xf:A -> A(fun a0 : A -> A => f (a0 (g2 (fun x : A => f (g1 x x)))) = f (f (g1 (g2 (fun x : A => f (g1 x x))) (g2 (fun x : A => f (g1 x x)))))) (g1 (g2 (fun x : A => f (g1 x x))))reflexivity. Qed.Ext:prop_extensionalityA:Propa:Ag1:A -> A -> Ag2:(A -> A) -> Ag1_o_g2:forall x : A -> A, g1 (g2 x) = xf:A -> Af (f (g1 (g2 (fun x : A => f (g1 x x))) (g2 (fun x : A => f (g1 x x))))) = f (f (g1 (g2 (fun x : A => f (g1 x x))) (g2 (fun x : A => f (g1 x x)))))
Remark: prop_extensionality can be replaced in lemma ext_prop_fixpoint
by the weakest property provable_prop_extensionality.
(************************************************************************)
proof_irrelevance asserts equality of all proofs of a given formula
Definition proof_irrelevance := forall (A:Prop) (a1 a2:A), a1 = a2.
Assume that we have booleans with the property that there is at most 2
booleans (which is equivalent to dependent case analysis). Consider
the fixpoint of the negation function: it is either true or false by
dependent case analysis, but also the opposite by fixpoint. Hence
proof-irrelevance.
We then map equality of boolean proofs to proof irrelevance in all
propositions.
Section Proof_irrelevance_gen. Variable bool : Prop. Variable true : bool. Variable false : bool. Hypothesis bool_elim : forall C:Prop, C -> C -> bool -> C. Hypothesis bool_elim_redl : forall (C:Prop) (c1 c2:C), c1 = bool_elim C c1 c2 true. Hypothesis bool_elim_redr : forall (C:Prop) (c1 c2:C), c2 = bool_elim C c1 c2 false. Let bool_dep_induction := forall P:bool -> Prop, P true -> P false -> forall b:bool, P b.bool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:Propprop_extensionality -> bool_dep_induction -> true = falsebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:Propprop_extensionality -> bool_dep_induction -> true = falsebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductiontrue = falsebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionG:(bool -> bool) -> boolGfix:forall f : bool -> bool, G f = f (G f)true = falsebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionG:(bool -> bool) -> boolGfix:forall f : bool -> bool, G f = f (G f)neg:=fun b : bool => bool_elim bool false true b:bool -> booltrue = falsebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionG:(bool -> bool) -> boolGfix:forall f : bool -> bool, G f = f (G f)neg:=fun b : bool => bool_elim bool false true b:bool -> boolG neg = G neg -> true = falsebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionG:(bool -> bool) -> boolGfix:forall f : bool -> bool, G f = f (G f)neg:=fun b : bool => bool_elim bool false true b:bool -> bool(fun b : bool => b = G neg -> true = false) (G neg)bool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionG:(bool -> bool) -> boolGfix:forall f : bool -> bool, G f = f (G f)neg:=fun b : bool => bool_elim bool false true b:bool -> boolHeq:true = G negtrue = falsebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionG:(bool -> bool) -> boolGfix:forall f : bool -> bool, G f = f (G f)neg:=fun b : bool => bool_elim bool false true b:bool -> boolHeq:false = G negtrue = falsebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionG:(bool -> bool) -> boolGfix:forall f : bool -> bool, G f = f (G f)neg:=fun b : bool => bool_elim bool false true b:bool -> boolHeq:true = G negtrue = bool_elim bool false true truebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionG:(bool -> bool) -> boolGfix:forall f : bool -> bool, G f = f (G f)neg:=fun b : bool => bool_elim bool false true b:bool -> boolHeq:false = G negtrue = falsebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionG:(bool -> bool) -> boolGfix:forall f : bool -> bool, G f = f (G f)neg:=fun b : bool => bool_elim bool false true b:bool -> boolHeq:false = G negtrue = falsechange (neg false = false); rewrite Heq; symmetry ; apply Gfix. Qed.bool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionG:(bool -> bool) -> boolGfix:forall f : bool -> bool, G f = f (G f)neg:=fun b : bool => bool_elim bool false true b:bool -> boolHeq:false = G negbool_elim bool false true false = falsebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:Propprop_extensionality -> bool_dep_induction -> proof_irrelevancebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:Propprop_extensionality -> bool_dep_induction -> proof_irrelevancebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionA:Propa1, a2:Aa1 = a2bool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionA:Propa1, a2:Af:=fun b : bool => bool_elim A a1 a2 b:bool -> Aa1 = a2bool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionA:Propa1, a2:Af:=fun b : bool => bool_elim A a1 a2 b:bool -> Abool_elim A a1 a2 true = a2bool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionA:Propa1, a2:Af:=fun b : bool => bool_elim A a1 a2 b:bool -> Af true = a2bool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionA:Propa1, a2:Af:=fun b : bool => bool_elim A a1 a2 b:bool -> Af true = bool_elim A a1 a2 falsebool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionA:Propa1, a2:Af:=fun b : bool => bool_elim A a1 a2 b:bool -> Af true = f falsereflexivity. Qed. End Proof_irrelevance_gen.bool:Proptrue, false:boolbool_elim:forall C : Prop, C -> C -> bool -> Cbool_elim_redl:forall (C : Prop) (c1 c2 : C), c1 = bool_elim C c1 c2 truebool_elim_redr:forall (C : Prop) (c1 c2 : C), c2 = bool_elim C c1 c2 falsebool_dep_induction:=forall P : bool -> Prop, P true -> P false -> forall b : bool, P b:PropExt:prop_extensionalityInd:bool_dep_inductionA:Propa1, a2:Af:=fun b : bool => bool_elim A a1 a2 b:bool -> Af false = f false
In the pure Calculus of Constructions, we can define the boolean
proposition bool = (C:Prop)C->C->C but we cannot prove that it has at
most 2 elements.
Section Proof_irrelevance_Prop_Ext_CC. Definition BoolP := forall C:Prop, C -> C -> C. Definition TrueP : BoolP := fun C c1 c2 => c1. Definition FalseP : BoolP := fun C c1 c2 => c2. Definition BoolP_elim C c1 c2 (b:BoolP) := b C c1 c2. Definition BoolP_elim_redl (C:Prop) (c1 c2:C) : c1 = BoolP_elim C c1 c2 TrueP := eq_refl c1. Definition BoolP_elim_redr (C:Prop) (c1 c2:C) : c2 = BoolP_elim C c1 c2 FalseP := eq_refl c2. Definition BoolP_dep_induction := forall P:BoolP -> Prop, P TrueP -> P FalseP -> forall b:BoolP, P b.prop_extensionality -> BoolP_dep_induction -> proof_irrelevanceexact (ext_prop_dep_proof_irrel_gen BoolP TrueP FalseP BoolP_elim BoolP_elim_redl BoolP_elim_redr). Qed. End Proof_irrelevance_Prop_Ext_CC.prop_extensionality -> BoolP_dep_induction -> proof_irrelevance
Remark: prop_extensionality can be replaced in lemma
ext_prop_dep_proof_irrel_gen by the weakest property
provable_prop_extensionality.
(************************************************************************)
In the Calculus of Inductive Constructions, inductively defined booleans
enjoy dependent case analysis, hence directly proof-irrelevance from
propositional extensionality.
Section Proof_irrelevance_CIC. Inductive boolP : Prop := | trueP : boolP | falseP : boolP. Definition boolP_elim_redl (C:Prop) (c1 c2:C) : c1 = boolP_ind C c1 c2 trueP := eq_refl c1. Definition boolP_elim_redr (C:Prop) (c1 c2:C) : c2 = boolP_ind C c1 c2 falseP := eq_refl c2. Scheme boolP_indd := Induction for boolP Sort Prop.prop_extensionality -> proof_irrelevanceexact (fun pe => ext_prop_dep_proof_irrel_gen boolP trueP falseP boolP_ind boolP_elim_redl boolP_elim_redr pe boolP_indd). Qed. End Proof_irrelevance_CIC.prop_extensionality -> proof_irrelevance
Can we state proof irrelevance from propositional degeneracy
(i.e. propositional extensionality + excluded middle) without
dependent case analysis ?
Berardi [Berardi90] built a model of CC interpreting inhabited
types by the set of all untyped lambda-terms. This model satisfies
propositional degeneracy without satisfying proof-irrelevance (nor
dependent case analysis). This implies that the previous results
cannot be refined.
[Berardi90] Stefano Berardi, "Type dependence and constructive
mathematics", Ph. D. thesis, Dipartimento Matematica, UniversitΓ di
Torino, 1990.
(************************************************************************)
This is a proof in the pure Calculus of Construction that
classical logic in Prop + dependent elimination of disjunction entails
proof-irrelevance.
Reference:
[Coquand90] T. Coquand, "Metamathematical Investigations of a
Calculus of Constructions", Proceedings of Logic in Computer Science
(LICS'90), 1990.
Proof skeleton: classical logic + dependent elimination of
disjunction + discrimination of proofs implies the existence of a
retract from Prop into bool, hence inconsistency by encoding any
paradox of system U- (e.g. Hurkens' paradox).
Require Import Hurkens. Section Proof_irrelevance_EM_CC. Variable or : Prop -> Prop -> Prop. Variable or_introl : forall A B:Prop, A -> or A B. Variable or_intror : forall A B:Prop, B -> or A B. Hypothesis or_elim : forall A B C:Prop, (A -> C) -> (B -> C) -> or A B -> C. Hypothesis or_elim_redl : forall (A B C:Prop) (f:A -> C) (g:B -> C) (a:A), f a = or_elim A B C f g (or_introl A B a). Hypothesis or_elim_redr : forall (A B C:Prop) (f:A -> C) (g:B -> C) (b:B), g b = or_elim A B C f g (or_intror A B b). Hypothesis or_dep_elim : forall (A B:Prop) (P:or A B -> Prop), (forall a:A, P (or_introl A B a)) -> (forall b:B, P (or_intror A B b)) -> forall b:or A B, P b. Hypothesis em : forall A:Prop, or A (~ A). Variable B : Prop. Variables b1 b2 : B.
p2b and b2p form a retract if Β¬b1=b2
Let p2b A := or_elim A (~ A) B (fun _ => b1) (fun _ => b2) (em A). Let b2p b := b1 = b.or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bem:forall A : Prop, or A (~ A)B:Propb1, b2:Bp2b:=fun A : Prop => or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (em A):Prop -> Bb2p:=fun b : B => b1 = b:B -> Propforall A : Prop, A -> b2p (p2b A)or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bem:forall A : Prop, or A (~ A)B:Propb1, b2:Bp2b:=fun A : Prop => or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (em A):Prop -> Bb2p:=fun b : B => b1 = b:B -> Propforall A : Prop, A -> b2p (p2b A)or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a0 : A0), f a0 = or_elim A0 B0 C f g (or_introl A0 B0 a0)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a0 : A0, P (or_introl A0 B0 a0)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bem:forall A0 : Prop, or A0 (~ A0)B:Propb1, b2:Bp2b:=fun A0 : Prop => or_elim A0 (~ A0) B (fun _ : A0 => b1) (fun _ : ~ A0 => b2) (em A0):Prop -> Bb2p:=fun b : B => b1 = b:B -> PropA:Propa, H:Ab1 = or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (or_introl A (~ A) a)or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b0 : B0), g b0 = or_elim A0 B0 C f g (or_intror A0 B0 b0)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b0 : B0, P (or_intror A0 B0 b0)) -> forall b0 : or A0 B0, P b0em:forall A0 : Prop, or A0 (~ A0)B:Propb1, b2:Bp2b:=fun A0 : Prop => or_elim A0 (~ A0) B (fun _ : A0 => b1) (fun _ : ~ A0 => b2) (em A0):Prop -> Bb2p:=fun b0 : B => b1 = b0:B -> PropA:Propb:~ AH:Ab1 = or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (or_intror A (~ A) b)destruct (b H). Qed.or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b0 : B0), g b0 = or_elim A0 B0 C f g (or_intror A0 B0 b0)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b0 : B0, P (or_intror A0 B0 b0)) -> forall b0 : or A0 B0, P b0em:forall A0 : Prop, or A0 (~ A0)B:Propb1, b2:Bp2b:=fun A0 : Prop => or_elim A0 (~ A0) B (fun _ : A0 => b1) (fun _ : ~ A0 => b2) (em A0):Prop -> Bb2p:=fun b0 : B => b1 = b0:B -> PropA:Propb:~ AH:Ab1 = or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (or_intror A (~ A) b)or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bem:forall A : Prop, or A (~ A)B:Propb1, b2:Bp2b:=fun A : Prop => or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (em A):Prop -> Bb2p:=fun b : B => b1 = b:B -> Propb1 <> b2 -> forall A : Prop, b2p (p2b A) -> Aor:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bem:forall A : Prop, or A (~ A)B:Propb1, b2:Bp2b:=fun A : Prop => or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (em A):Prop -> Bb2p:=fun b : B => b1 = b:B -> Propb1 <> b2 -> forall A : Prop, b2p (p2b A) -> Aor:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bem:forall A : Prop, or A (~ A)B:Propb1, b2:Bp2b:=fun A : Prop => or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (em A):Prop -> Bb2p:=fun b : B => b1 = b:B -> Propnot_eq_b1_b2:b1 <> b2forall A : Prop, b2p (p2b A) -> Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a0 : A0), f a0 = or_elim A0 B0 C f g (or_introl A0 B0 a0)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a0 : A0, P (or_introl A0 B0 a0)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bem:forall A0 : Prop, or A0 (~ A0)B:Propb1, b2:Bp2b:=fun A0 : Prop => or_elim A0 (~ A0) B (fun _ : A0 => b1) (fun _ : ~ A0 => b2) (em A0):Prop -> Bb2p:=fun b : B => b1 = b:B -> Propnot_eq_b1_b2:b1 <> b2A:Propa:AH:b1 = or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (or_introl A (~ A) a)Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b0 : B0), g b0 = or_elim A0 B0 C f g (or_intror A0 B0 b0)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b0 : B0, P (or_intror A0 B0 b0)) -> forall b0 : or A0 B0, P b0em:forall A0 : Prop, or A0 (~ A0)B:Propb1, b2:Bp2b:=fun A0 : Prop => or_elim A0 (~ A0) B (fun _ : A0 => b1) (fun _ : ~ A0 => b2) (em A0):Prop -> Bb2p:=fun b0 : B => b1 = b0:B -> Propnot_eq_b1_b2:b1 <> b2A:Propb:~ AH:b1 = or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (or_intror A (~ A) b)Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b0 : B0), g b0 = or_elim A0 B0 C f g (or_intror A0 B0 b0)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b0 : B0, P (or_intror A0 B0 b0)) -> forall b0 : or A0 B0, P b0em:forall A0 : Prop, or A0 (~ A0)B:Propb1, b2:Bp2b:=fun A0 : Prop => or_elim A0 (~ A0) B (fun _ : A0 => b1) (fun _ : ~ A0 => b2) (em A0):Prop -> Bb2p:=fun b0 : B => b1 = b0:B -> Propnot_eq_b1_b2:b1 <> b2A:Propb:~ AH:b1 = or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (or_intror A (~ A) b)Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b0 : B0), g b0 = or_elim A0 B0 C f g (or_intror A0 B0 b0)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b0 : B0, P (or_intror A0 B0 b0)) -> forall b0 : or A0 B0, P b0em:forall A0 : Prop, or A0 (~ A0)B:Propb1, b2:Bp2b:=fun A0 : Prop => or_elim A0 (~ A0) B (fun _ : A0 => b1) (fun _ : ~ A0 => b2) (em A0):Prop -> Bb2p:=fun b0 : B => b1 = b0:B -> PropA:Propb:~ AH:b1 = or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (or_intror A (~ A) b)b1 = b2assumption. Qed.or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b0 : B0), g b0 = or_elim A0 B0 C f g (or_intror A0 B0 b0)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b0 : B0, P (or_intror A0 B0 b0)) -> forall b0 : or A0 B0, P b0em:forall A0 : Prop, or A0 (~ A0)B:Propb1, b2:Bp2b:=fun A0 : Prop => or_elim A0 (~ A0) B (fun _ : A0 => b1) (fun _ : ~ A0 => b2) (em A0):Prop -> Bb2p:=fun b0 : B => b1 = b0:B -> PropA:Propb:~ AH:b1 = b2b1 = b2
Using excluded-middle a second time, we get proof-irrelevance
or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bem:forall A : Prop, or A (~ A)B:Propb1, b2:Bp2b:=fun A : Prop => or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (em A):Prop -> Bb2p:=fun b : B => b1 = b:B -> Propb1 = b2or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bem:forall A : Prop, or A (~ A)B:Propb1, b2:Bp2b:=fun A : Prop => or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (em A):Prop -> Bb2p:=fun b : B => b1 = b:B -> Propb1 = b2or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bem:forall A : Prop, or A (~ A)B:Propb1, b2:Bp2b:=fun A : Prop => or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (em A):Prop -> Bb2p:=fun b : B => b1 = b:B -> PropH:b1 = b2b1 = b2or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bem:forall A : Prop, or A (~ A)B:Propb1, b2:Bp2b:=fun A : Prop => or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (em A):Prop -> Bb2p:=fun b : B => b1 = b:B -> PropH:b1 <> b2b1 = b2apply (NoRetractFromSmallPropositionToProp.paradox B p2b b2p (p2p2 H) p2p1). Qed. End Proof_irrelevance_EM_CC.or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bem:forall A : Prop, or A (~ A)B:Propb1, b2:Bp2b:=fun A : Prop => or_elim A (~ A) B (fun _ : A => b1) (fun _ : ~ A => b2) (em A):Prop -> Bb2p:=fun b : B => b1 = b:B -> PropH:b1 <> b2b1 = b2
Hurkens' paradox still holds with a retract from the negative
fragment of Prop into bool, hence weak classical logic,
i.e. β A, Β¬A\/~~A, is enough for deriving a weak version of
proof-irrelevance. This is enough to derive a contradiction from a
Set-bound weak excluded middle with an impredicative Set
universe.
Section Proof_irrelevance_WEM_CC. Variable or : Prop -> Prop -> Prop. Variable or_introl : forall A B:Prop, A -> or A B. Variable or_intror : forall A B:Prop, B -> or A B. Hypothesis or_elim : forall A B C:Prop, (A -> C) -> (B -> C) -> or A B -> C. Hypothesis or_elim_redl : forall (A B C:Prop) (f:A -> C) (g:B -> C) (a:A), f a = or_elim A B C f g (or_introl A B a). Hypothesis or_elim_redr : forall (A B C:Prop) (f:A -> C) (g:B -> C) (b:B), g b = or_elim A B C f g (or_intror A B b). Hypothesis or_dep_elim : forall (A B:Prop) (P:or A B -> Prop), (forall a:A, P (or_introl A B a)) -> (forall b:B, P (or_intror A B b)) -> forall b:or A B, P b. Hypothesis wem : forall A:Prop, or (~~A) (~ A). Notation NProp := NoRetractToNegativeProp.NProp. Notation El := NoRetractToNegativeProp.El. Variable B : Prop. Variables b1 b2 : B.
p2b and b2p form a retract if Β¬b1=b2
Let p2b (A:NProp) := or_elim (~~El A) (~El A) B (fun _ => b1) (fun _ => b2) (wem (El A)). Let b2p b : NProp := exist (fun P=>~~P -> P) (~~(b1 = b)) (fun h x => h (fun k => k x)).or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropforall A : NProp, El A -> El (b2p (p2b A))or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropforall A : NProp, El A -> El (b2p (p2b A))or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropA:NPropEl A -> El (b2p (p2b A))or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropA:NPropEl A -> El (b2p (or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A))))or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropA:NPropforall a : ~ ~ El A, El A -> El (b2p (or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (or_introl (~ ~ El A) (~ El A) a)))or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropA:NPropforall b : ~ El A, El A -> El (b2p (or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (or_intror (~ ~ El A) (~ El A) b)))or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropA:NPropforall a : ~ ~ El A, El A -> El (b2p (or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (or_introl (~ ~ El A) (~ El A) a)))or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a0 : A0), f a0 = or_elim A0 B0 C f g (or_introl A0 B0 a0)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a0 : A0, P (or_introl A0 B0 a0)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropA:NPropnna:~ ~ El Aa:El AEl (b2p (or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (or_introl (~ ~ El A) (~ El A) nna)))or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a0 : A0), f a0 = or_elim A0 B0 C f g (or_introl A0 B0 a0)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a0 : A0, P (or_introl A0 B0 a0)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropA:NPropnna:~ ~ El Aa:El AEl (b2p b1)auto.or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a0 : A0), f a0 = or_elim A0 B0 C f g (or_introl A0 B0 a0)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a0 : A0, P (or_introl A0 B0 a0)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropA:NPropnna:~ ~ El Aa:El A~ b1 <> b1or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropA:NPropforall b : ~ El A, El A -> El (b2p (or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (or_intror (~ ~ El A) (~ El A) b)))destruct (n x). Qed.or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x0 : b1 <> b) => h (fun k : ~ b1 <> b => k x0)):B -> NPropA:NPropn:~ El Ax:El AEl (b2p (or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (or_intror (~ ~ El A) (~ El A) n)))or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropb1 <> b2 -> forall A : NProp, El (b2p (p2b A)) -> El Aor:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropb1 <> b2 -> forall A : NProp, El (b2p (p2b A)) -> El Aor:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropnot_eq_b1_b2:b1 <> b2forall A : NProp, El (b2p (p2b A)) -> El Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropnot_eq_b1_b2:b1 <> b2A:NPropEl (b2p (p2b A)) -> El Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropnot_eq_b1_b2:b1 <> b2A:NPropEl (b2p (or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)))) -> El Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropnot_eq_b1_b2:b1 <> b2A:NPropforall a : ~ ~ El A, El (b2p (or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (or_introl (~ ~ El A) (~ El A) a))) -> El Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropnot_eq_b1_b2:b1 <> b2A:NPropforall b : ~ El A, El (b2p (or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (or_intror (~ ~ El A) (~ El A) b))) -> El Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropnot_eq_b1_b2:b1 <> b2A:NPropforall a : ~ ~ El A, El (b2p (or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (or_introl (~ ~ El A) (~ El A) a))) -> El Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropnot_eq_b1_b2:b1 <> b2A:NPropforall a : ~ ~ El A, ~ b1 <> or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (or_introl (~ ~ El A) (~ El A) a) -> El Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x0 : b1 <> b) => h (fun k : ~ b1 <> b => k x0)):B -> NPropnot_eq_b1_b2:b1 <> b2A:NPropx:~ ~ El AEl Aor:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x1 : b1 <> b) => h (fun k : ~ b1 <> b => k x1)):B -> NPropnot_eq_b1_b2:b1 <> b2x0:Propp:~ ~ x0 -> x0x:~ ~ El (exist (fun P : Prop => ~ ~ P -> P) x0 p)El (exist (fun P : Prop => ~ ~ P -> P) x0 p)auto.or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x1 : b1 <> b) => h (fun k : ~ b1 <> b => k x1)):B -> NPropnot_eq_b1_b2:b1 <> b2x0:Propp:~ ~ x0 -> x0x:~ ~ x0x0or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropnot_eq_b1_b2:b1 <> b2A:NPropforall b : ~ El A, El (b2p (or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (or_intror (~ ~ El A) (~ El A) b))) -> El Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropnot_eq_b1_b2:b1 <> b2A:NPropna:~ El AEl (b2p (or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (or_intror (~ ~ El A) (~ El A) na))) -> El Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropnot_eq_b1_b2:b1 <> b2A:NPropna:~ El AEl (b2p b2) -> El Aor:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NPropnot_eq_b1_b2:b1 <> b2A:NPropna:~ El A~ b1 <> b2 -> El Adestruct (h not_eq_b1_b2). Qed.or:Prop -> Prop -> Propor_introl:forall A0 B0 : Prop, A0 -> or A0 B0or_intror:forall A0 B0 : Prop, B0 -> or A0 B0or_elim:forall A0 B0 C : Prop, (A0 -> C) -> (B0 -> C) -> or A0 B0 -> Cor_elim_redl:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (a : A0), f a = or_elim A0 B0 C f g (or_introl A0 B0 a)or_elim_redr:forall (A0 B0 C : Prop) (f : A0 -> C) (g : B0 -> C) (b : B0), g b = or_elim A0 B0 C f g (or_intror A0 B0 b)or_dep_elim:forall (A0 B0 : Prop) (P : or A0 B0 -> Prop), (forall a : A0, P (or_introl A0 B0 a)) -> (forall b : B0, P (or_intror A0 B0 b)) -> forall b : or A0 B0, P bwem:forall A0 : Prop, or (~ ~ A0) (~ A0)B:Propb1, b2:Bp2b:=fun A0 : NProp => or_elim (~ ~ El A0) (~ El A0) B (fun _ : ~ ~ El A0 => b1) (fun _ : ~ El A0 => b2) (wem (El A0)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h0 : ~ ~ ~ b1 <> b) (x : b1 <> b) => h0 (fun k : ~ b1 <> b => k x)):B -> NPropnot_eq_b1_b2:b1 <> b2A:NPropna:~ El Ah:~ b1 <> b2El A
By Hurkens's paradox, we get a weak form of proof irrelevance.
or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NProp~ b1 <> b2or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h : ~ ~ ~ b1 <> b) (x : b1 <> b) => h (fun k : ~ b1 <> b => k x)):B -> NProp~ b1 <> b2or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h0 : ~ ~ ~ b1 <> b) (x : b1 <> b) => h0 (fun k : ~ b1 <> b => k x)):B -> NProph:b1 <> b2Falseor:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h0 : ~ ~ ~ b1 <> b) (x : b1 <> b) => h0 (fun k : ~ b1 <> b => k x)):B -> NProph:b1 <> b2~ ~ B -> Bor:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h0 : ~ ~ ~ b1 <> b) (x : b1 <> b) => h0 (fun k : ~ b1 <> b => k x)):B -> NProph:b1 <> b2NB:=exist (fun P : Prop => ~ ~ P -> P) B ?Goal:{P : Prop | ~ ~ P -> P}Falseexact (fun _ => b1).or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h0 : ~ ~ ~ b1 <> b) (x : b1 <> b) => h0 (fun k : ~ b1 <> b => k x)):B -> NProph:b1 <> b2~ ~ B -> Bor:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h0 : ~ ~ ~ b1 <> b) (x : b1 <> b) => h0 (fun k : ~ b1 <> b => k x)):B -> NProph:b1 <> b2NB:=exist (fun P : Prop => ~ ~ P -> P) B (fun _ : ~ ~ B => b1):{P : Prop | ~ ~ P -> P}Falseor:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h0 : ~ ~ ~ b1 <> b) (x : b1 <> b) => h0 (fun k : ~ b1 <> b => k x)):B -> NProph:b1 <> b2NB:=exist (fun P : Prop => ~ ~ P -> P) B (fun _ : ~ ~ B => b1):{P : Prop | ~ ~ P -> P}paradox:forall B0 : NProp, El B0Falseor:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h0 : ~ ~ ~ b1 <> b) (x : b1 <> b) => h0 (fun k : ~ b1 <> b => k x)):B -> NProph:b1 <> b2NB:=exist (fun P : Prop => ~ ~ P -> P) B (fun _ : ~ ~ B => b1):{P : Prop | ~ ~ P -> P}paradox:forall B0 : NProp, El B0~ ~ False -> Falseor:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h0 : ~ ~ ~ b1 <> b) (x : b1 <> b) => h0 (fun k : ~ b1 <> b => k x)):B -> NProph:b1 <> b2NB:=exist (fun P : Prop => ~ ~ P -> P) B (fun _ : ~ ~ B => b1):{P : Prop | ~ ~ P -> P}paradox:forall B0 : NProp, El B0F:=exist (fun P : Prop => ~ ~ P -> P) False ?Goal:{P : Prop | ~ ~ P -> P}Falseauto.or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h0 : ~ ~ ~ b1 <> b) (x : b1 <> b) => h0 (fun k : ~ b1 <> b => k x)):B -> NProph:b1 <> b2NB:=exist (fun P : Prop => ~ ~ P -> P) B (fun _ : ~ ~ B => b1):{P : Prop | ~ ~ P -> P}paradox:forall B0 : NProp, El B0~ ~ False -> Falseexact (paradox F). Qed. End Proof_irrelevance_WEM_CC. (************************************************************************)or:Prop -> Prop -> Propor_introl:forall A B0 : Prop, A -> or A B0or_intror:forall A B0 : Prop, B0 -> or A B0or_elim:forall A B0 C : Prop, (A -> C) -> (B0 -> C) -> or A B0 -> Cor_elim_redl:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (a : A), f a = or_elim A B0 C f g (or_introl A B0 a)or_elim_redr:forall (A B0 C : Prop) (f : A -> C) (g : B0 -> C) (b : B0), g b = or_elim A B0 C f g (or_intror A B0 b)or_dep_elim:forall (A B0 : Prop) (P : or A B0 -> Prop), (forall a : A, P (or_introl A B0 a)) -> (forall b : B0, P (or_intror A B0 b)) -> forall b : or A B0, P bwem:forall A : Prop, or (~ ~ A) (~ A)B:Propb1, b2:Bp2b:=fun A : NProp => or_elim (~ ~ El A) (~ El A) B (fun _ : ~ ~ El A => b1) (fun _ : ~ El A => b2) (wem (El A)):NProp -> Bb2p:=fun b : B => exist (fun P : Prop => ~ ~ P -> P) (~ b1 <> b) (fun (h0 : ~ ~ ~ b1 <> b) (x : b1 <> b) => h0 (fun k : ~ b1 <> b => k x)):B -> NProph:b1 <> b2NB:=exist (fun P : Prop => ~ ~ P -> P) B (fun _ : ~ ~ B => b1):{P : Prop | ~ ~ P -> P}paradox:forall B0 : NProp, El B0F:=exist (fun P : Prop => ~ ~ P -> P) False (fun H : ~ ~ False => H (fun H0 : False => H0)):{P : Prop | ~ ~ P -> P}False
Since, dependent elimination is derivable in the Calculus of
Inductive Constructions (CCI), we get proof-irrelevance from classical
logic in the CCI.
Section Proof_irrelevance_CCI. Hypothesis em : forall A:Prop, A \/ ~ A. Definition or_elim_redl (A B C:Prop) (f:A -> C) (g:B -> C) (a:A) : f a = or_ind f g (or_introl B a) := eq_refl (f a). Definition or_elim_redr (A B C:Prop) (f:A -> C) (g:B -> C) (b:B) : g b = or_ind f g (or_intror A b) := eq_refl (g b). Scheme or_indd := Induction for or Sort Prop.em:forall A : Prop, A \/ ~ Aforall (B : Prop) (b1 b2 : B), b1 = b2exact (proof_irrelevance_cc or or_introl or_intror or_ind or_elim_redl or_elim_redr or_indd em). Qed. End Proof_irrelevance_CCI.em:forall A : Prop, A \/ ~ Aforall (B : Prop) (b1 b2 : B), b1 = b2
The same holds with weak excluded middle. The proof is a little
more involved, however.
Section Weak_proof_irrelevance_CCI. Hypothesis wem : forall A:Prop, ~~A \/ ~ A.wem:forall A : Prop, ~ ~ A \/ ~ Aforall (B : Prop) (b1 b2 : B), ~ b1 <> b2exact (wproof_irrelevance_cc or or_introl or_intror or_ind or_elim_redl or_elim_redr or_indd wem). Qed. End Weak_proof_irrelevance_CCI.wem:forall A : Prop, ~ ~ A \/ ~ Aforall (B : Prop) (b1 b2 : B), ~ b1 <> b2
Remark: in the Set-impredicative CCI, Hurkens' paradox still holds with
bool in Set and since Β¬true=false for true and false
in bool from Set, we get the inconsistency of
em : β A:Prop, {A}+{~A} in the Set-impredicative CCI.
We show the following increasing in the strength of axioms:
- weak excluded-middle
- right distributivity of implication over disjunction and GΓΆdel-Dummett axiom
- independence of general premises and drinker's paradox
- excluded-middle
The weak classical logic based on ~~A β¨ Β¬A is referred to with
name KC in [ChagrovZakharyaschev97]
[ChagrovZakharyaschev97] Alexander Chagrov and Michael
Zakharyaschev, "Modal Logic", Clarendon Press, 1997.
Definition weak_excluded_middle :=
forall A:Prop, ~~A \/ ~A.
The interest in the equivalent variant
weak_generalized_excluded_middle is that it holds even in logic
without a primitive False connective (like GΓΆdel-Dummett axiom)
Definition weak_generalized_excluded_middle :=
forall A B:Prop, ((A -> B) -> B) \/ (A -> B).
(AβB) β¨ (BβA) is studied in [Dummett59] and is based on [GΓΆdel33].
[Dummett59] Michael A. E. Dummett. "A Propositional Calculus
with a Denumerable Matrix", In the Journal of Symbolic Logic, Vol
24 No. 2(1959), pp 97-103.
[GΓΆdel33] Kurt GΓΆdel. "Zum intuitionistischen AussagenkalkΓΌl",
Ergeb. Math. Koll. 4 (1933), pp. 34-38.
Definition GodelDummett := forall A B:Prop, (A -> B) \/ (B -> A).excluded_middle -> GodelDummettexcluded_middle -> GodelDummettEM:excluded_middleA, B:Prop(A -> B) \/ (B -> A)EM:excluded_middleA, B:PropHB:B(A -> B) \/ (B -> A)EM:excluded_middleA, B:PropHnotB:~ B(A -> B) \/ (B -> A)right; intros HB; destruct (HnotB HB). Qed.EM:excluded_middleA, B:PropHnotB:~ B(A -> B) \/ (B -> A)
(AβB) β¨ (BβA) is equivalent to (C β Aβ¨B) β (CβA) β¨ (CβB)
(proof from [Dummett59])
Definition RightDistributivityImplicationOverDisjunction := forall A B C:Prop, (C -> A\/B) -> (C->A) \/ (C->B).GodelDummett <-> RightDistributivityImplicationOverDisjunctionGodelDummett <-> RightDistributivityImplicationOverDisjunctionGodelDummett -> RightDistributivityImplicationOverDisjunctionRightDistributivityImplicationOverDisjunction -> GodelDummettGD:GodelDummettA, B, C:PropHCAB:C -> A \/ B(C -> A) \/ (C -> B)RightDistributivityImplicationOverDisjunction -> GodelDummettRightDistributivityImplicationOverDisjunction -> GodelDummettDistr:RightDistributivityImplicationOverDisjunctionA, B:Prop(A -> B) \/ (B -> A)Distr:RightDistributivityImplicationOverDisjunctionA, B:PropA \/ B -> A \/ BDistr:RightDistributivityImplicationOverDisjunctionA, B:PropHABA:A \/ B -> A(A -> B) \/ (B -> A)Distr:RightDistributivityImplicationOverDisjunctionA, B:PropHABB:A \/ B -> B(A -> B) \/ (B -> A)Distr:RightDistributivityImplicationOverDisjunctionA, B:PropHABA:A \/ B -> A(A -> B) \/ (B -> A)Distr:RightDistributivityImplicationOverDisjunctionA, B:PropHABB:A \/ B -> B(A -> B) \/ (B -> A)left; intro HA; apply HABB; left; assumption. Qed.Distr:RightDistributivityImplicationOverDisjunctionA, B:PropHABB:A \/ B -> B(A -> B) \/ (B -> A)
(AβB) β¨ (BβA) is stronger than the weak excluded middle
GodelDummett -> weak_excluded_middleGodelDummett -> weak_excluded_middleGD:GodelDummettA:Prop~ ~ A \/ ~ AGD:GodelDummettA:PropHnotAA:~ A -> A~ ~ A \/ ~ AGD:GodelDummettA:PropHAnotA:A -> ~ A~ ~ A \/ ~ Aright; intro HA; apply (HAnotA HA HA). Qed.GD:GodelDummettA:PropHAnotA:A -> ~ A~ ~ A \/ ~ A
Independence of general premises is the unconstrained, non
constructive, version of the Independence of Premises as
considered in [Troelstra73].
It is a generalization to predicate logic of the right
distributivity of implication over disjunction (hence of
GΓΆdel-Dummett axiom) whose own constructive form (obtained by a
restricting the third formula to be negative) is called
Kreisel-Putnam principle [KreiselPutnam57].
[KreiselPutnam57], Georg Kreisel and Hilary Putnam. "Eine
Unableitsbarkeitsbeweismethode fΓΌr den intuitionistischen
AussagenkalkΓΌl". Archiv fΓΌr Mathematische Logik und
Graundlagenforschung, 3:74- 78, 1957.
[Troelstra73], Anne Troelstra, editor. Metamathematical
Investigation of Intuitionistic Arithmetic and Analysis, volume
344 of Lecture Notes in Mathematics, Springer-Verlag, 1973.
Definition IndependenceOfGeneralPremises := forall (A:Type) (P:A -> Prop) (Q:Prop), inhabited A -> (Q -> exists x, P x) -> exists x, Q -> P x.IndependenceOfGeneralPremises -> RightDistributivityImplicationOverDisjunctionIndependenceOfGeneralPremises -> RightDistributivityImplicationOverDisjunctionIP:IndependenceOfGeneralPremisesA, B, C:PropHCAB:C -> A \/ B(C -> A) \/ (C -> B)IP:IndependenceOfGeneralPremisesA, B, C:PropHCAB:C -> A \/ BC -> exists x : bool, if x then A else BIP:IndependenceOfGeneralPremisesA, B, C:PropHCAB:C -> A \/ BH:C -> A(C -> A) \/ (C -> B)IP:IndependenceOfGeneralPremisesA, B, C:PropHCAB:C -> A \/ BH:C -> B(C -> A) \/ (C -> B)IP:IndependenceOfGeneralPremisesA, B, C:PropHCAB:C -> A \/ BH:C -> A(C -> A) \/ (C -> B)IP:IndependenceOfGeneralPremisesA, B, C:PropHCAB:C -> A \/ BH:C -> B(C -> A) \/ (C -> B)right; assumption. Qed.IP:IndependenceOfGeneralPremisesA, B, C:PropHCAB:C -> A \/ BH:C -> B(C -> A) \/ (C -> B)IndependenceOfGeneralPremises -> GodelDummettIndependenceOfGeneralPremises -> GodelDummettauto using independence_general_premises_right_distr_implication_over_disjunction. Qed.H:GodelDummett -> RightDistributivityImplicationOverDisjunctionH0:RightDistributivityImplicationOverDisjunction -> GodelDummettIndependenceOfGeneralPremises -> GodelDummett
Independence of general premises is equivalent to the drinker's paradox
Definition DrinkerParadox := forall (A:Type) (P:A -> Prop), inhabited A -> exists x, (exists x, P x) -> P x.IndependenceOfGeneralPremises <-> DrinkerParadoxIndependenceOfGeneralPremises <-> DrinkerParadoxIndependenceOfGeneralPremises -> DrinkerParadoxDrinkerParadox -> IndependenceOfGeneralPremisesDrinkerParadox -> IndependenceOfGeneralPremisesexists x; intro HQ; apply (Hx (H HQ)). Qed.Drinker:DrinkerParadoxA:TypeP:A -> PropQ:PropInhA:AH:Q -> exists x0 : A, P x0x:AHx:(exists x0 : A, P x0) -> P xexists x0 : A, Q -> P x0
Independence of general premises is weaker than (generalized)
excluded middle
Remark: generalized excluded middle is preferred here to avoid relying on
the "ex falso quodlibet" property (i.e. False β β A, A)
Definition generalized_excluded_middle := forall A B:Prop, A \/ (A -> B).generalized_excluded_middle -> DrinkerParadoxgeneralized_excluded_middle -> DrinkerParadoxGEM:generalized_excluded_middleA:TypeP:A -> Propx0:Aexists x : A, (exists x1 : A, P x1) -> P xGEM:generalized_excluded_middleA:TypeP:A -> Propx0, x:AHx:P xexists x1 : A, (exists x2 : A, P x2) -> P x1GEM:generalized_excluded_middleA:TypeP:A -> Propx0:AHnot:(exists x : A, P x) -> P x0exists x : A, (exists x1 : A, P x1) -> P xexists x0; exact Hnot. Qed.GEM:generalized_excluded_middleA:TypeP:A -> Propx0:AHnot:(exists x : A, P x) -> P x0exists x : A, (exists x1 : A, P x1) -> P x
Require Import Coq.Arith.PeanoNat. Definition Minimal (P:nat -> Prop) (n:nat) : Prop := P n /\ forall k, P k -> n<=k. Definition Minimization_Property (P : nat -> Prop) : Prop := forall n, P n -> exists m, Minimal P m. Section Unrestricted_minimization_entails_excluded_middle. Hypothesis unrestricted_minimization: forall P, Minimization_Property P.unrestricted_minimization:forall P : nat -> Prop, Minimization_Property Pforall A : Prop, A \/ ~ Aunrestricted_minimization:forall P : nat -> Prop, Minimization_Property Pforall A : Prop, A \/ ~ Aunrestricted_minimization:forall P : nat -> Prop, Minimization_Property PA:PropA \/ ~ Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> PropA \/ ~ Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> PropP 1unrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Proph:P 1A \/ ~ Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> PropP 1intuition.unrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Prop1 = 0 /\ A \/ 1 = 1unrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Proph:P 1A \/ ~ Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Proph:P 1P 0 <-> Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Proph:P 1pβ:P 0 <-> AA \/ ~ Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Proph:P 1P 0 <-> Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Proph:P 1P 0 -> Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Proph:P 1A -> P 0unrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Proph:P 1P 0 -> Aassumption.unrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Proph:P 1hβ:AAunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Proph:P 1A -> P 0tauto.unrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Proph:P 1A -> 0 = 0 /\ A \/ 0 = 1unrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Proph:P 1pβ:P 0 <-> AA \/ ~ Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Prophm:P 0hmm:forall k : nat, P k -> 0 <= kpβ:P 0 <-> AA \/ ~ Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Prophm:P 1hmm:forall k : nat, P k -> 1 <= kpβ:P 0 <-> AA \/ ~ Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Propm:nathm:P (S (S m))hmm:forall k : nat, P k -> S (S m) <= kpβ:P 0 <-> AA \/ ~ Aintuition.unrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Prophm:P 0hmm:forall k : nat, P k -> 0 <= kpβ:P 0 <-> AA \/ ~ Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Prophm:P 1hmm:forall k : nat, P k -> 1 <= kpβ:P 0 <-> AA \/ ~ Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Prophm:P 1hmm:forall k : nat, P k -> 1 <= kpβ:P 0 <-> A~ Aunrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Prophm:P 1hmm:forall k : nat, P k -> 1 <= kpβ:P 0 <-> AHA:AFalseassumption.unrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Prophm:P 1hmm:forall k : nat, P k -> 1 <= kpβ:P 0 <-> AHA:FalseFalsedestruct hm as [([=],_) | [=] ]. Qed. End Unrestricted_minimization_entails_excluded_middle. Require Import Wf_nat. Section Excluded_middle_entails_unrestricted_minimization. Hypothesis em : forall A, A\/~A.unrestricted_minimization:forall P0 : nat -> Prop, Minimization_Property P0A:PropP:=fun n : nat => n = 0 /\ A \/ n = 1:nat -> Propm:nathm:P (S (S m))hmm:forall k : nat, P k -> S (S m) <= kpβ:P 0 <-> AA \/ ~ Aem:forall A : Prop, A \/ ~ Aforall P : nat -> Prop, Minimization_Property Pem:forall A : Prop, A \/ ~ Aforall P : nat -> Prop, Minimization_Property Pem:forall A : Prop, A \/ ~ AP:nat -> Propn:natHPn:P nexists m : nat, Minimal P mem:forall A : Prop, A \/ ~ AP:nat -> Propn:natHPn:P ndec:forall n0 : nat, P n0 \/ ~ P n0exists m : nat, Minimal P mem:forall A : Prop, A \/ ~ AP:nat -> Propn:natHPn:P ndec:forall n0 : nat, P n0 \/ ~ P n0ex:exists n0 : nat, P n0exists m : nat, Minimal P mem:forall A : Prop, A \/ ~ AP:nat -> Propn:natHPn:P ndec:forall n0 : nat, P n0 \/ ~ P n0ex:exists n0 : nat, P n0n':natHPn':P n' /\ (forall x' : nat, P x' -> n' <= x')exists m : nat, Minimal P massumption. Qed. End Excluded_middle_entails_unrestricted_minimization.em:forall A : Prop, A \/ ~ AP:nat -> Propn:natHPn:P ndec:forall n0 : nat, P n0 \/ ~ P n0ex:exists n0 : nat, P n0n':natHPn':P n' /\ (forall x' : nat, P x' -> n' <= x')Minimal P n'
However, minimization for a given predicate does not necessarily imply
decidability of this predicate
Section Example_of_undecidable_predicate_with_the_minimization_property. Variable s : nat -> bool. Let P n := exists k, n<=k /\ s k = true.s:nat -> boolP:=fun n : nat => exists k : nat, n <= k /\ s k = true:nat -> PropMinimization_Property Ps:nat -> boolP:=fun n : nat => exists k : nat, n <= k /\ s k = true:nat -> PropMinimization_Property Ps:nat -> boolP:=fun n : nat => exists k : nat, n <= k /\ s k = true:nat -> Propforall n : nat, P n -> exists m : nat, Minimal P ms:nat -> boolP:=fun n : nat => exists k : nat, n <= k /\ s k = true:nat -> Proph:nathn:P hexists m : nat, Minimal P ms:nat -> boolP:=fun n : nat => exists k : nat, n <= k /\ s k = true:nat -> Proph:nathn:P hMinimal P 0s:nat -> boolP:=fun n : nat => exists k : nat, n <= k /\ s k = true:nat -> Proph:nathn:P hP 0s:nat -> boolP:=fun n : nat => exists k : nat, n <= k /\ s k = true:nat -> Proph:nathn:P hforall k : nat, P k -> 0 <= ks:nat -> boolP:=fun n : nat => exists k : nat, n <= k /\ s k = true:nat -> Proph:nathn:P hP 0s:nat -> boolP:=fun n : nat => exists k : nat, n <= k /\ s k = true:nat -> Proph:nathn:exists k : nat, h <= k /\ s k = trueexists k : nat, 0 <= k /\ s k = trues:nat -> boolP:=fun n : nat => exists k0 : nat, n <= k0 /\ s k0 = true:nat -> Proph, k:nathkβ:h <= khkβ:s k = trueexists k0 : nat, 0 <= k0 /\ s k0 = trues:nat -> boolP:=fun n : nat => exists k0 : nat, n <= k0 /\ s k0 = true:nat -> Proph, k:nathkβ:h <= khkβ:s k = true0 <= k /\ s k = trues:nat -> boolP:=fun n : nat => exists k0 : nat, n <= k0 /\ s k0 = true:nat -> Proph, k:nathkβ:h <= khkβ:s k = true0 <= ks:nat -> boolP:=fun n : nat => exists k0 : nat, n <= k0 /\ s k0 = true:nat -> Proph, k:nathkβ:h <= khkβ:s k = trues k = trues:nat -> boolP:=fun n : nat => exists k0 : nat, n <= k0 /\ s k0 = true:nat -> Proph, k:nathkβ:h <= khkβ:s k = true0 <= kapply PeanoNat.Nat.le_0_l.s:nat -> boolP:=fun n : nat => exists k0 : nat, n <= k0 /\ s k0 = true:nat -> Proph, k:nathkβ:h <= khkβ:s k = true0 <= hassumption.s:nat -> boolP:=fun n : nat => exists k0 : nat, n <= k0 /\ s k0 = true:nat -> Proph, k:nathkβ:h <= khkβ:s k = trues k = trues:nat -> boolP:=fun n : nat => exists k : nat, n <= k /\ s k = true:nat -> Proph:nathn:P hforall k : nat, P k -> 0 <= kapply PeanoNat.Nat.le_0_l. Qed. End Example_of_undecidable_predicate_with_the_minimization_property.s:nat -> boolP:=fun n : nat => exists k0 : nat, n <= k0 /\ s k0 = true:nat -> Proph:nathn:P hk:natH:P k0 <= k
This is similar to Bell's "weak extensional selection principle" in [Bell]
[Bell] John L. Bell, Choice principles in intuitionistic set theory, unpublished.
Require Import RelationClasses. Notation representative_boolean_partition := (forall R:bool->bool->Prop, Equivalence R -> exists f, forall x, R x (f x) /\ forall y, R x y -> f x = f y).representative_boolean_partition -> excluded_middlerepresentative_boolean_partition -> excluded_middleReprFunChoice:representative_boolean_partitionP:PropP \/ ~ PReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> PropP \/ ~ PReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> PropEquivalence RReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> PropH:Equivalence RP \/ ~ PReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> PropEquivalence RReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> PropReflexive RReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> PropSymmetric RReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> PropTransitive Rnow left.ReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> PropReflexive RReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> PropSymmetric RReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propx, y:boolH:x = yR y xReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propx, y:boolH:PR y xnow right.ReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propx, y:boolH:PR y xReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> PropTransitive Rleft; now transitivity y.ReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propx, y, z:boolH:x = yH0:y = zR x zReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> PropH:Equivalence RP \/ ~ PReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> PropH:Equivalence Rf:bool -> boolHf:forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)P \/ ~ PReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propf:bool -> boolHf:forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)P \/ ~ PReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propf:bool -> boolHf:forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)Heq:f true = f falseP \/ ~ PReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propf:bool -> boolHf:forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)Hneq:f true <> f falseP \/ ~ PReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propf:bool -> boolHf:forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)Heq:f true = f falseP \/ ~ PReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propf:bool -> boolHf:forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)Heq:f true = f falsePReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propf:bool -> boolHf:forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)Heq:f true = f falseHfalse:false = f falsePcongruence.ReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propf:bool -> boolHf:forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)Heq:f true = f falseHfalse:false = f falseHtrue:true = f truePReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propf:bool -> boolHf:forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)Hneq:f true <> f falseP \/ ~ PReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propf:bool -> boolHf:forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)Hneq:f true <> f false~ PReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propf:bool -> boolHf:forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)Hneq:f true <> f falseHP:PFalseReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propf:bool -> boolHf:forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)Hneq:f true <> f falseHP:PH:forall y : bool, R true y -> f true = f yFalsenow right. Qed.ReprFunChoice:representative_boolean_partitionP:PropR:=fun b1 b2 : bool => b1 = b2 \/ P:bool -> bool -> Propf:bool -> boolHf:forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)Hneq:f true <> f falseHP:PH:forall y : bool, R true y -> f true = f yR true falseexcluded_middle -> representative_boolean_partitionexcluded_middle -> representative_boolean_partitionEM:excluded_middleR:bool -> bool -> PropH:Equivalence Rexists f : bool -> bool, forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)EM:excluded_middleR:bool -> bool -> PropH:Equivalence RH0:R true falseexists f : bool -> bool, forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)EM:excluded_middleR:bool -> bool -> PropH:Equivalence RH0:~ R true falseexists f : bool -> bool, forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)EM:excluded_middleR:bool -> bool -> PropH:Equivalence RH0:R true falseexists f : bool -> bool, forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)intros []; firstorder.EM:excluded_middleR:bool -> bool -> PropH:Equivalence RH0:R true falseforall x : bool, R x true /\ (forall y : bool, R x y -> true = true)EM:excluded_middleR:bool -> bool -> PropH:Equivalence RH0:~ R true falseexists f : bool -> bool, forall x : bool, R x (f x) /\ (forall y : bool, R x y -> f x = f y)EM:excluded_middleR:bool -> bool -> PropH:Equivalence RH0:~ R true falseforall x : bool, R x x /\ (forall y : bool, R x y -> x = y)EM:excluded_middleR:bool -> bool -> PropH:Equivalence RH0:~ R true falseb:boolR b b /\ (forall y : bool, R b y -> b = y)EM:excluded_middleR:bool -> bool -> PropH:Equivalence RH0:~ R true falseb:boolR b bEM:excluded_middleR:bool -> bool -> PropH:Equivalence RH0:~ R true falseb:boolforall y : bool, R b y -> b = yreflexivity.EM:excluded_middleR:bool -> bool -> PropH:Equivalence RH0:~ R true falseb:boolR b bdestruct b, y; intros HR; easy || now symmetry in HR. Qed.EM:excluded_middleR:bool -> bool -> PropH:Equivalence RH0:~ R true falseb:boolforall y : bool, R b y -> b = yexcluded_middle <-> representative_boolean_partitionsplit; auto using excluded_middle_imp_representative_boolean_partition, representative_boolean_partition_imp_excluded_middle. Qed.excluded_middle <-> representative_boolean_partition