(**********************************************************************)
(** * Extensional Hilbert's epsilon description operator -> Excluded-Middle *)
(** Proof sketch from Bell [[Bell93]] (with thanks to P. Castéran) *)
Local 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.
Local Notation eps := (epsilon bool true) (only parsing).

(* Specifications: *)
Theorem extensional_epsilon_imp_EM : forall P:Prop, P \/ ~ P.
End ExtensionalEpsilon_imp_EM.