# Library Coq.Logic.ClassicalDescription

This file provides classical logic and definite description, which is equivalent to providing classical logic and Church's iota operator
Classical logic and definite descriptions implies excluded-middle in Set and leads to a classical world populated with non computable functions. It conflicts with the impredicativity of Set

Set Implicit Arguments.

Require Export Classical. Require Export Description. Require Import ChoiceFacts.

The idea for the following proof comes from ChicliPottierSimpson02

Theorem excluded_middle_informative : forall P:Prop, {P} + {~ P}.

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

Church's iota operator

Definition iota (A : Type) (i:inhabited A) (P : A->Prop) : A
:= proj1_sig (classical_definite_description P i).

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

Axiom of unique "choice" (functional reification of functional relations)
Theorem 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)).

Theorem unique_choice :
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)).

Compatibility lemmas

Unset Implicit Arguments.

Definition dependent_description := dependent_unique_choice.
Definition description := unique_choice.