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.
(************************************************************************)
(*         *   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 indefinite description under the form of Hilbert's epsilon operator; it does not assume classical logic.
Require Import ChoiceFacts.

Set Implicit Arguments.
Hilbert's epsilon: operator and specification in one statement
Axiom epsilon_statement :
  forall (A : Type) (P : A->Prop), inhabited A ->
    { x : A | (exists x, P x) -> P x }.


forall (A : Type) (P : A -> Prop), (exists x : A, P x) -> {x : A | P x}

forall (A : Type) (P : A -> Prop), (exists x : A, P x) -> {x : A | P x}

EpsilonStatement
exact epsilon_statement. Qed.

forall (A : Type) (P : A -> Prop), inhabited A -> exists x : A, (exists x0 : A, P x0) -> P x

forall (A : Type) (P : A -> Prop), inhabited A -> exists x : A, (exists x0 : A, P x0) -> P x

EpsilonStatement
exact epsilon_statement. Qed.

forall (A : Type) (P : A -> Prop), inhabited A -> {x : A | (exists ! x0 : A, P x0) -> P x}

forall (A : Type) (P : A -> Prop), inhabited A -> {x : A | (exists ! x0 : A, P x0) -> P x}
intros; destruct epsilon_statement with (P:=P); firstorder. Qed.

forall (A : Type) (P : A -> Prop), (exists ! x : A, P x) -> {x : A | P x}

forall (A : Type) (P : A -> Prop), (exists ! x : A, P x) -> {x : A | P x}

IotaStatement
exact iota_statement. Qed.
Hilbert's epsilon operator and its specification
Definition epsilon (A : Type) (i:inhabited A) (P : A->Prop) : A
  := proj1_sig (epsilon_statement P i).

Definition epsilon_spec (A : Type) (i:inhabited A) (P : A->Prop) :
  (exists x, P x) -> P (epsilon i P)
  := proj2_sig (epsilon_statement P i).
Church's iota operator and its specification
Definition iota (A : Type) (i:inhabited A) (P : A->Prop) : A
  := proj1_sig (iota_statement P i).

Definition iota_spec (A : Type) (i:inhabited A) (P : A->Prop) :
  (exists! x:A, P x) -> P (iota i P)
  := proj2_sig (iota_statement P i).