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) *)
(************************************************************************)
Diaconescu showed that the Axiom of Choice entails Excluded-Middle
in topoi [Diaconescu75]. Lacas and Werner adapted the proof to show
that the axiom of choice in equivalence classes entails
Excluded-Middle in Type Theory [LacasWerner99].
Three variants of Diaconescu's result in type theory are shown below.
A. A proof that the relational form of the Axiom of Choice +
Extensionality for Predicates entails Excluded-Middle (by Hugo
Herbelin)
B. A proof that the relational form of the Axiom of Choice + Proof
Irrelevance entails Excluded-Middle for Equality Statements (by
Benjamin Werner)
C. A proof that extensional Hilbert epsilon's description operator
entails excluded-middle (taken from Bell [Bell93])
See also [Carlström04] for a discussion of the connection between the
Extensional Axiom of Choice and Excluded-Middle
[Diaconescu75] Radu Diaconescu, Axiom of Choice and Complementation,
in Proceedings of AMS, vol 51, pp 176-178, 1975.
[LacasWerner99] Samuel Lacas, Benjamin Werner, Which Choices imply
the excluded middle?, preprint, 1999.
[Bell93] John L. Bell, Hilbert's epsilon operator and classical
logic, Journal of Philosophical Logic, 22: 1-18, 1993
[Carlström04] Jesper Carlström, EM + Ext + AC_int is equivalent
to AC_ext, Mathematical Logic Quaterly, vol 50(3), pp 236-240, 2004.
Require ClassicalFacts ChoiceFacts. (**********************************************************************)
Section PredExt_RelChoice_imp_EM.
The axiom of extensionality for predicates
Definition PredicateExtensionality :=
forall P Q:bool -> Prop, (forall b:bool, P b <-> Q b) -> P = Q.
From predicate extensionality we get propositional extensionality
hence proof-irrelevance
Import ClassicalFacts. Variable pred_extensionality : PredicateExtensionality.pred_extensionality:PredicateExtensionalityforall A B : Prop, A <-> B -> A = Bpred_extensionality:PredicateExtensionalityforall A B : Prop, A <-> B -> A = Bpred_extensionality:PredicateExtensionalityA, B:PropH:A <-> BA = Bpred_extensionality:PredicateExtensionalityA, B:PropH:A <-> B(fun _ : bool => A) true = (fun _ : bool => B) truepred_extensionality:PredicateExtensionalityA, B:PropH:A <-> BB = Bpred_extensionality:PredicateExtensionalityA, B:PropH:A <-> Bbool -> A <-> Bintros _; exact H. Qed.pred_extensionality:PredicateExtensionalityA, B:PropH:A <-> Bbool -> A <-> Bpred_extensionality:PredicateExtensionalityforall (A : Prop) (a1 a2 : A), a1 = a2apply (ext_prop_dep_proof_irrel_cic prop_ext). Qed.pred_extensionality:PredicateExtensionalityforall (A : Prop) (a1 a2 : A), a1 = a2
From proof-irrelevance and relational choice, we get guarded
relational choice
Import ChoiceFacts. Variable rel_choice : RelationalChoice.pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceGuardedRelationalChoiceapply (rel_choice_and_proof_irrel_imp_guarded_rel_choice rel_choice proof_irrel). Qed.pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceGuardedRelationalChoice
The form of choice we need: there is a functional relation which chooses
an element in any non empty subset of bool
Import Bool.pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceexists R : (bool -> Prop) -> bool -> Prop, forall P : bool -> Prop, (exists b : bool, P b) -> exists b : bool, P b /\ R P b /\ (forall b' : bool, R P b' -> b = b')pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceexists R : (bool -> Prop) -> bool -> Prop, forall P : bool -> Prop, (exists b : bool, P b) -> exists b : bool, P b /\ R P b /\ (forall b' : bool, R P b' -> b = b')pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceforall x : bool -> Prop, (exists y : bool, x y) -> exists y : bool, x ypred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceR:(bool -> Prop) -> bool -> PropHRsub:subrelation R (fun (Q : bool -> Prop) (y : bool) => Q y)HR:forall x : bool -> Prop, (exists y : bool, x y) -> exists ! y : bool, R x yexists R0 : (bool -> Prop) -> bool -> Prop, forall P : bool -> Prop, (exists b : bool, P b) -> exists b : bool, P b /\ R0 P b /\ (forall b' : bool, R0 P b' -> b = b')pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceR:(bool -> Prop) -> bool -> PropHRsub:subrelation R (fun (Q : bool -> Prop) (y : bool) => Q y)HR:forall x : bool -> Prop, (exists y : bool, x y) -> exists ! y : bool, R x yexists R0 : (bool -> Prop) -> bool -> Prop, forall P : bool -> Prop, (exists b : bool, P b) -> exists b : bool, P b /\ R0 P b /\ (forall b' : bool, R0 P b' -> b = b')pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceR:(bool -> Prop) -> bool -> PropHRsub:subrelation R (fun (Q : bool -> Prop) (y : bool) => Q y)HR:forall x : bool -> Prop, (exists y : bool, x y) -> exists ! y : bool, R x yP:bool -> PropHP:exists b : bool, P bexists b : bool, P b /\ R P b /\ (forall b' : bool, R P b' -> b = b')exists y; firstorder. Qed.pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceR:(bool -> Prop) -> bool -> PropHRsub:subrelation R (fun (Q : bool -> Prop) (y0 : bool) => Q y0)HR:forall x : bool -> Prop, (exists y0 : bool, x y0) -> exists ! y0 : bool, R x y0P:bool -> PropHP:exists b : bool, P by:boolHy:R P yHuni:forall x' : bool, R P x' -> y = x'exists b : bool, P b /\ R P b /\ (forall b' : bool, R P b' -> b = b')
The proof of the excluded middle
Remark: P could have been in Set or Type
pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceforall P : Prop, P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceforall P : Prop, P \/ ~ P(* first we exhibit the choice functional relation R *)pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropP \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> PropP \/ ~ P(* the actual "decision": is (R class_of_true) = true or false? *)pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> PropP \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propexists b : bool, class_of_true bpred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:class_of_true b0H0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:class_of_true b0H0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ P(* the actual "decision": is (R class_of_false) = true or false? *)pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'exists b : bool, class_of_false bpred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:class_of_false b1H1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:class_of_false b1H1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ P(* case where P is false: (R class_of_true)=true /\ (R class_of_false)=false *)pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PFalsepred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:Pforall b : bool, class_of_true b <-> class_of_false bpred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bFalsepred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b2 : bool, P0 b2) -> exists b2 : bool, P0 b2 /\ R P0 b2 /\ (forall b' : bool, R P0 b' -> b2 = b')class_of_true:=fun b2 : bool => b2 = true \/ P:bool -> Propclass_of_false:=fun b2 : bool => b2 = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:Pb:boolclass_of_true b -> class_of_false bpred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b2 : bool, P0 b2) -> exists b2 : bool, P0 b2 /\ R P0 b2 /\ (forall b' : bool, R P0 b' -> b2 = b')class_of_true:=fun b2 : bool => b2 = true \/ P:bool -> Propclass_of_false:=fun b2 : bool => b2 = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:Pb:boolclass_of_false b -> class_of_true bpred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bFalsepred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b2 : bool, P0 b2) -> exists b2 : bool, P0 b2 /\ R P0 b2 /\ (forall b' : bool, R P0 b' -> b2 = b')class_of_true:=fun b2 : bool => b2 = true \/ P:bool -> Propclass_of_false:=fun b2 : bool => b2 = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:Pb:boolclass_of_false b -> class_of_true bpred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bFalsepred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bFalsepred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bclass_of_true = class_of_falsepred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bHeq:class_of_true = class_of_falseFalsepred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bHeq:class_of_true = class_of_falseFalsepred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bHeq:class_of_true = class_of_falsetrue = falsepred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bHeq:class_of_true = class_of_falseb0 = falsepred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bHeq:class_of_true = class_of_falseb0 = b1pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bHeq:class_of_true = class_of_falseb0 = b0pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bHeq:class_of_true = class_of_falseR class_of_true b1pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bHeq:class_of_true = class_of_falseR class_of_true b1pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:b1 = falseH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'HP:PHequiv:forall b : bool, class_of_true b <-> class_of_false bHeq:class_of_true = class_of_falseR class_of_false b1pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ P(* cases where P is true *)pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:b0 = trueH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'b1:boolH1:PH1':R class_of_false b1H1'':forall b' : bool, R class_of_false b' -> b1 = b'P \/ ~ Ppred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ Pleft; assumption. Qed. End PredExt_RelChoice_imp_EM. (**********************************************************************)pred_extensionality:PredicateExtensionalityrel_choice:RelationalChoiceP:PropR:(bool -> Prop) -> bool -> PropH:forall P0 : bool -> Prop, (exists b : bool, P0 b) -> exists b : bool, P0 b /\ R P0 b /\ (forall b' : bool, R P0 b' -> b = b')class_of_true:=fun b : bool => b = true \/ P:bool -> Propclass_of_false:=fun b : bool => b = false \/ P:bool -> Propb0:boolH0:PH0':R class_of_true b0H0'':forall b' : bool, R class_of_true b' -> b0 = b'P \/ ~ P
This is an adaptation of Diaconescu's theorem, exploiting the
form of extensionality provided by proof-irrelevance
Section ProofIrrel_RelChoice_imp_EqEM. Import ChoiceFacts. Variable rel_choice : RelationalChoice. Variable proof_irrelevance : forall P:Prop , forall x y:P, x=y.
Let a1 and a2 be two elements in some type A
Variable A :Type. Variables a1 a2 : A.
We build the subset A' of A made of a1 and a2
Definition A' := @sigT A (fun x => x=a1 \/ x=a2).exists a1 ; auto. Defined.rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AA'exists a2 ; auto. Defined.rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AA'
By proof-irrelevance, projection is a retraction
rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Aa1 = a2 -> a1' = a2'rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Aa1 = a2 -> a1' = a2'rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AHeq:a1 = a2existT (fun x : A => x = a1 \/ x = a2) a1 (or_introl eq_refl) = existT (fun x : A => x = a1 \/ x = a2) a2 (or_intror eq_refl)rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AHeq:a1 = a2existT (fun x : A => x = a2 \/ x = a2) a2 (or_introl eq_refl) = existT (fun x : A => x = a2 \/ x = a2) a2 (or_intror eq_refl)rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AHeq:a1 = a2existT (fun x : A => x = a2 \/ x = a2) a2 (or_intror eq_refl) = existT (fun x : A => x = a2 \/ x = a2) a2 (or_intror eq_refl)rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AHeq:a1 = a2or_intror eq_refl = or_introl eq_reflapply proof_irrelevance. Qed.rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AHeq:a1 = a2or_intror eq_refl = or_introl eq_refl
But from the actual proofs of being in A', we can assert in the
proof-irrelevant world the existence of relevant boolean witnesses
rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Aforall x : A', exists y : bool, projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = falseintros [a [Ha1|Ha2]]; [exists true | exists false]; auto. Qed.rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Aforall x : A', exists y : bool, projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false
Thanks to the axiom of choice, the boolean witnesses move from the
propositional world to the relevant world
rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Aa1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Aa1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Aforall x : A', exists y : bool, projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = falserel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x ya1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x ya1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'a1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Hb1true:b1 = truea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Ha1a2:projT1 a1' = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Hb1true:b1 = trueb2:boolHa2'b2:R a2' b2Huni2:forall x' : bool, R a2' x' -> b2 = x'a1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Ha1a2:projT1 a1' = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Hb1true:b1 = trueb2:boolHa2'b2:R a2' b2Huni2:forall x' : bool, R a2' x' -> b2 = x'Ha2a1:projT1 a2' = a1_Hb2true:b2 = truea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Hb1true:b1 = trueb2:boolHa2'b2:R a2' b2Huni2:forall x' : bool, R a2' x' -> b2 = x'Hb2false:b2 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Ha1a2:projT1 a1' = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Hb1true:b1 = trueb2:boolHa2'b2:R a2' b2Huni2:forall x' : bool, R a2' x' -> b2 = x'Hb2false:b2 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Ha1a2:projT1 a1' = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Hb1true:b1 = trueb2:boolHa2'b2:R a2' b2Huni2:forall x' : bool, R a2' x' -> b2 = x'Hb2false:b2 = falseH:a1 = a2Falserel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Ha1a2:projT1 a1' = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x y_Huni1:forall x' : bool, R a1' x' -> true = x'Ha1'b1:R a1' trueHuni2:forall x' : bool, R a2' x' -> false = x'Ha2'b2:R a2' falseH:a1 = a2Falserel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Ha1a2:projT1 a1' = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x y_Huni1:forall x' : bool, R a1' x' -> true = x'Ha1'b1:R a2' trueHuni2:forall x' : bool, R a2' x' -> false = x'Ha2'b2:R a2' falseH:a1 = a2Falserel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Ha1a2:projT1 a1' = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x y_Huni1:forall x' : bool, R a1' x' -> true = x'Ha1'b1:R a2' trueHuni2:forall x' : bool, R a2' x' -> false = x'Ha2'b2:R a2' falseH:a1 = a2H0:false = trueFalserel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Ha1a2:projT1 a1' = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2left; assumption. Qed.rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:AR:A' -> bool -> PropHRsub:subrelation R (fun (x : A') (y : bool) => projT1 x = a1 /\ y = true \/ projT1 x = a2 /\ y = false)HR:forall x : A', exists ! y : bool, R x yb1:boolHa1'b1:R a1' b1_Huni1:forall x' : bool, R a1' x' -> b1 = x'Ha1a2:projT1 a1' = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2
An alternative more concise proof can be done by directly using
the guarded relational choice
rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Aa1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Aa1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Aforall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falserel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoicea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceforall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falserel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x ya1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x ya1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x ya1 = a1 \/ a1 = a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'a1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'a1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Hb1true:b1 = truea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Ha1a2:a1 = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Hb1true:b1 = truea2 = a1 \/ a2 = a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Hb1true:b1 = trueb2:boolHa2b2:R a2 b2Huni2:forall x' : bool, R a2 x' -> b2 = x'a1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Ha1a2:a1 = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Hb1true:b1 = trueb2:boolHa2b2:R a2 b2Huni2:forall x' : bool, R a2 x' -> b2 = x'a1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Ha1a2:a1 = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Hb1true:b1 = trueb2:boolHa2b2:R a2 b2Huni2:forall x' : bool, R a2 x' -> b2 = x'Ha2a1:a2 = a1_Hb2true:b2 = truea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Hb1true:b1 = trueb2:boolHa2b2:R a2 b2Huni2:forall x' : bool, R a2 x' -> b2 = x'Hb2false:b2 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Ha1a2:a1 = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Hb1true:b1 = trueb2:boolHa2b2:R a2 b2Huni2:forall x' : bool, R a2 x' -> b2 = x'Hb2false:b2 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Ha1a2:a1 = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Hb1true:b1 = trueb2:boolHa2b2:R a2 b2Huni2:forall x' : bool, R a2 x' -> b2 = x'Hb2false:b2 = falseH:a1 = a2Falserel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Ha1a2:a1 = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea2:Adecide:forall x : A, x = a2 \/ x = a2 -> exists y : bool, x = a2 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHa1b1:R a2 true_Huni1:forall x' : bool, R a2 x' -> true = x'HR:forall x : A, x = a2 \/ x = a2 -> exists ! y : bool, R x yHRsub:subrelation R (fun (x : A) (y : bool) => x = a2 /\ y = true \/ x = a2 /\ y = false)Huni2:forall x' : bool, R a2 x' -> false = x'Ha2b2:R a2 falseFalserel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Ha1a2:a1 = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea2:Adecide:forall x : A, x = a2 \/ x = a2 -> exists y : bool, x = a2 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHa1b1:R a2 true_Huni1:forall x' : bool, R a2 x' -> true = x'HR:forall x : A, x = a2 \/ x = a2 -> exists ! y : bool, R x yHRsub:subrelation R (fun (x : A) (y : bool) => x = a2 /\ y = true \/ x = a2 /\ y = false)Huni2:forall x' : bool, R a2 x' -> false = x'Ha2b2:R a2 falseH:false = trueFalserel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Ha1a2:a1 = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2left; assumption. Qed. End ProofIrrel_RelChoice_imp_EqEM. (**********************************************************************)rel_choice:RelationalChoiceproof_irrelevance:forall (P : Prop) (x y : P), x = yA:Typea1, a2:Adecide:forall x : A, x = a1 \/ x = a2 -> exists y : bool, x = a1 /\ y = true \/ x = a2 /\ y = falseguarded_rel_choice:GuardedRelationalChoiceR:A -> bool -> PropHRsub:subrelation R (fun (x : A) (y : bool) => x = a1 /\ y = true \/ x = a2 /\ y = false)HR:forall x : A, x = a1 \/ x = a2 -> exists ! y : bool, R x yb1:boolHa1b1:R a1 b1_Huni1:forall x' : bool, R a1 x' -> b1 = x'Ha1a2:a1 = a2_Hb1false:b1 = falsea1 = a2 \/ a1 <> a2
Proof sketch from Bell [Bell93] (with thanks to P. Castéran)
Notation inhabited A := A (only parsing). Section ExtensionalEpsilon_imp_EM. Variable epsilon : forall A : Type, inhabited A -> (A -> Prop) -> A. Hypothesis epsilon_spec : forall (A:Type) (i:inhabited A) (P:A->Prop), (exists x, P x) -> P (epsilon A i P). Hypothesis epsilon_extensionality : forall (A:Type) (i:inhabited A) (P Q:A->Prop), (forall a, P a <-> Q a) -> epsilon A i P = epsilon A i Q. Notation eps := (epsilon bool true) (only parsing).epsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P : A -> Prop), (exists x : A, P x) -> P (epsilon A i P)epsilon_extensionality:forall (A : Type) (i : A) (P Q : A -> Prop), (forall a : A, P a <-> Q a) -> epsilon A i P = epsilon A i Qforall P : Prop, P \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P : A -> Prop), (exists x : A, P x) -> P (epsilon A i P)epsilon_extensionality:forall (A : Type) (i : A) (P Q : A -> Prop), (forall a : A, P a <-> Q a) -> epsilon A i P = epsilon A i Qforall P : Prop, P \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHfalse:epsilon bool true B = falseP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHP:PP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHfalse:epsilon bool true B = falseHtrue:epsilon bool true C = trueP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHfalse:epsilon bool true B = falseHP:PP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHP:PP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHfalse:epsilon bool true B = falseHtrue:epsilon bool true C = trueHP:PFalseepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHfalse:epsilon bool true B = falseHP:PP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHP:PP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHfalse:epsilon bool true B = falseHtrue:epsilon bool true C = trueHP:PH:forall y : bool, B y <-> C yFalseepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHfalse:epsilon bool true B = falseHP:PP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHP:PP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHfalse:epsilon bool true C = falseHtrue:epsilon bool true C = trueHP:PH:forall y : bool, B y <-> C yFalseepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHfalse:epsilon bool true B = falseHP:PP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHP:PP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHfalse:true = falseHtrue:epsilon bool true C = trueHP:PH:forall y : bool, B y <-> C yFalseepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHfalse:epsilon bool true B = falseHP:PP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHP:PP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHfalse:epsilon bool true B = falseHP:PP \/ ~ Pepsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHP:PP \/ ~ Pauto. Qed. End ExtensionalEpsilon_imp_EM.epsilon:forall A : Type, A -> (A -> Prop) -> Aepsilon_spec:forall (A : Type) (i : A) (P0 : A -> Prop), (exists x : A, P0 x) -> P0 (epsilon A i P0)epsilon_extensionality:forall (A : Type) (i : A) (P0 Q : A -> Prop), (forall a : A, P0 a <-> Q a) -> epsilon A i P0 = epsilon A i QP:PropB:=fun y : bool => y = false \/ P:bool -> PropC:=fun y : bool => y = true \/ P:bool -> PropHP:PP \/ ~ P