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) *)
(************************************************************************)
This file provides classical logic and unique choice; this is
weaker than providing iota operator and classical logic as the
definite descriptions provided by the axiom of unique choice can
be used only in a propositional context (especially, they cannot
be used to build functions outside the scope of a theorem proof)
Classical logic and unique choice, as shown in
[ChicliPottierSimpson02], implies the double-negation of
excluded-middle in Set, hence it implies a strongly classical
world. Especially it conflicts with the impredicativity of Set.
[ChicliPottierSimpson02] Laurent Chicli, Loïc Pottier, Carlos
Simpson, Mathematical Quotients and Quotient Types in Coq,
Proceedings of TYPES 2002, Lecture Notes in Computer Science 2646,
Springer Verlag.
Require Export Classical. Axiom dependent_unique_choice : forall (A:Type) (B:A -> Type) (R:forall x:A, B x -> Prop), (forall x : A, exists! y : B x, R x y) -> (exists f : (forall x:A, B x), forall x:A, R x (f x)).
Unique choice reifies functional relations into functions
forall (A B : Type) (R : A -> B -> Prop), (forall x : A, exists ! y : B, R x y) -> exists f : A -> B, forall x : A, R x (f x)forall (A B : Type) (R : A -> B -> Prop), (forall x : A, exists ! y : B, R x y) -> exists f : A -> B, forall x : A, R x (f x)apply (dependent_unique_choice A (fun _ => B)). Qed.A, B:Typeforall R : A -> B -> Prop, (forall x : A, exists ! y : B, R x y) -> exists f : A -> B, forall x : A, R x (f x)
The following proof comes from [ChicliPottierSimpson02]
Require Import Setoid.forall C : Prop, ((forall P : Prop, {P} + {~ P}) -> C) -> Cforall C : Prop, ((forall P : Prop, {P} + {~ P}) -> C) -> CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CCC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropCC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propexists f : Prop -> bool, forall A : Prop, R A (f A)C:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propforall x : Prop, exists ! y : bool, R x yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:Propexists ! y : bool, R A yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHa:Aexists ! y : bool, R A yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHnota:~ Aexists ! y : bool, R A yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHa:AR A trueC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHa:Aforall x' : bool, R A x' -> true = x'C:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHnota:~ Aexists ! y : bool, R A yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHa:Aforall x' : bool, R A x' -> true = x'C:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHnota:~ Aexists ! y : bool, R A yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHa:Ay:boolHy:true = ytrue = yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHa:Ay:boolHna:~ Atrue = yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHnota:~ Aexists ! y : bool, R A yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHa:Ay:boolHna:~ Atrue = yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHnota:~ Aexists ! y : bool, R A yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHnota:~ Aexists ! y : bool, R A yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHnota:~ AR A falseC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHnota:~ Aforall x' : bool, R A x' -> false = x'C:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHnota:~ Aforall x' : bool, R A x' -> false = x'C:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHnota:~ Ay:boolHa:Afalse = yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHnota:~ Ay:boolHy:false = yfalse = yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A0 : Prop) (b : bool) => A0 /\ true = b \/ ~ A0 /\ false = b:Prop -> bool -> PropA:PropHnota:~ Ay:boolHy:false = yfalse = yC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> PropH:exists f : Prop -> bool, forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)CC:PropHnotEM:(forall P : Prop, {P} + {~ P}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)forall P : Prop, {P} + {~ P}C:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:Prop{P} + {~ P}(* Elimination from Hf to Set is not allowed but from f to Set yes ! *)C:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHfP:R P (f P){P} + {~ P}C:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHfP:R P true{P} + {~ P}C:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHfP:R P false{P} + {~ P}C:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHfP:R P truePC:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHfP:R P false{P} + {~ P}C:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHa:PPC:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHfalse:false = truePC:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHfP:R P false{P} + {~ P}C:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHfalse:false = truePC:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHfP:R P false{P} + {~ P}C:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHfP:R P false{P} + {~ P}C:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHfP:R P false~ PC:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHfalse:true = false~ PC:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHna:~ P~ Passumption. Qed.C:PropHnotEM:(forall P0 : Prop, {P0} + {~ P0}) -> CR:=fun (A : Prop) (b : bool) => A /\ true = b \/ ~ A /\ false = b:Prop -> bool -> Propf:Prop -> boolHf:forall A : Prop, R A (f A)P:PropHna:~ P~ P((forall P : Prop, {P} + {~ P}) -> False) -> Falseapply classic_set_in_prop_context. Qed. (* Compatibility *) Notation classic_set := not_not_classic_set (only parsing).((forall P : Prop, {P} + {~ P}) -> False) -> False