(* -*- coding: utf-8 -*- *)
(************************************************************************)
(*         *      The Rocq Prover / The Rocq Development Team           *)
(*  v      *         Copyright INRIA, CNRS and contributors             *)
(* <O___,, * (see version control and CREDITS file for authors & dates) *)
(*   \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)         *)
(************************************************************************)
(** Some facts and definitions about classical logic  Table of contents:  1. Propositional degeneracy = excluded-middle + propositional extensionality  2. Classical logic and proof-irrelevance  2.1. CC |- prop. ext. + A inhabited -> (A = A->A) -> A has fixpoint  2.2. CC |- prop. ext. + dep elim on bool -> proof-irrelevance  2.3. CIC |- prop. ext. -> proof-irrelevance  2.4. CC |- excluded-middle + dep elim on bool -> proof-irrelevance  2.5. CIC |- excluded-middle -> proof-irrelevance  3. Weak classical axioms  3.1. Weak excluded middle and classical de Morgan law  3.2. Gödel-Dummett axiom and right distributivity of implication over disjunction  3.3. Independence of general premises and drinker's paradox  3.4. Relativized independence of general premises and excluded-middle  4. Principles equivalent to classical logic  4.1 Classical logic = principle of unrestricted minimization  4.2 Classical logic = choice of representatives in a partition of bool *)
(************************************************************************)
(** * Prop degeneracy = excluded-middle + prop extensionality      *)
(** i.e.        [(forall A, A=True \/ A=False) <-> (forall A, A\/~A) /\ (forall A B, (A<->B) -> A=B)] *)
(** [prop_degeneracy] (also referred to as propositional completeness) asserts (up to consistency) that there are only two distinct formulas *)
Definition prop_degeneracy := forall A:Prop, A = True \/ A = False.
(** [prop_extensionality] asserts that equivalent formulas are equal *)
Definition prop_extensionality := forall A B:Prop, (A <-> B) -> A = B.
(** [excluded_middle] asserts that we can reason by case on the truth or falsity of any formula *)
Definition excluded_middle := forall A:Prop, A \/ ~ A.
(** We show [prop_degeneracy <-> (prop_extensionality /\ excluded_middle)] *)

(* Specifications: *)
Lemma prop_degen_ext : prop_degeneracy -> prop_extensionality.
Lemma prop_degen_em : prop_degeneracy -> excluded_middle.
Lemma prop_ext_em_degen :
prop_extensionality -> excluded_middle -> prop_degeneracy.