Library Stdlib.Logic.HLevels


The first three levels of homotopy type theory: homotopy propositions, homotopy sets and homotopy one types. For more information, https://github.com/HoTT/HoTT and https://homotopytypetheory.org/book
Univalence is not assumed here, and equality is Coq's usual inductive type eq in sort Prop. This is a little different from HoTT, where sort Prop does not exist and equality is directly in sort Type.

Require Import Stdlib.Logic.FunctionalExtensionality.

Definition IsHProp (P : Type) : Prop
  := forall p q : P, p = q.

Definition IsHSet (X : Type) : Prop
  := forall (x y : X) (p q : x = y), p = q.

Definition IsHOneType (X : Type) : Prop
  := forall (x y : X) (p q : x = y) (r s : p = q), r = s.

Lemma forall_hprop : forall (A : Type) (P : A -> Prop),
    (forall x:A, IsHProp (P x))
    -> IsHProp (forall x:A, P x).

Lemma and_hprop : forall P Q : Prop,
    IsHProp P -> IsHProp Q -> IsHProp (P /\ Q).

Lemma impl_hprop : forall P Q : Prop,
    IsHProp Q -> IsHProp (P -> Q).

Lemma false_hprop : IsHProp False.

Lemma true_hprop : IsHProp True.

Lemma not_hprop : forall P : Type, IsHProp (P -> False).

Lemma hset_hprop : forall X : Type,
    IsHProp X -> IsHSet X.

Lemma eq_trans_cancel : forall {X : Type} {x y z : X} (p : x = y) (q r : y = z),
  (eq_trans p q = eq_trans p r) -> q = r.

Lemma hset_hOneType : forall X : Type,
    IsHSet X -> IsHOneType X.

Lemma hprop_hprop : forall X : Type,
    IsHProp (IsHProp X).

Lemma hprop_hset : forall X : Type,
    IsHProp (IsHSet X).