Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import HProp.Generalizable VariablesA B n f.(** * Universes of truncated typesNow that we have the univalence axiom (from [Types/Universe]), we study further the universes [TruncType] of truncated types (including [hProp] and [hSet]) that were defined in [Basics/Trunc]. *)(** ** Paths in [TruncType] *)SectionTruncType.Context `{Univalence}.
H: Univalence n: trunc_index
{X : Type & IsTrunc n X} <~> n -Type
H: Univalence n: trunc_index
{X : Type & IsTrunc n X} <~> n -Type
issig.Defined.
H: Univalence n: trunc_index A, B: n -Type
A = B <~> A = B
H: Univalence n: trunc_index A, B: n -Type
A = B <~> A = B
H: Univalence n: trunc_index A, B: n -Type
A = B <~>
issig_trunctype^-1%equiv A =
issig_trunctype^-1%equiv B
(equiv_path_trunctype' A B)^-1%equiv ==
ap trunctype_type
intros []; reflexivity.Defined.Definitionequiv_path_trunctype {n : trunc_index} (AB : TruncType n)
: (A <~> B) <~> (A = B :> TruncType n)
:= equiv_path_trunctype' _ _ oE equiv_path_universe _ _.Definitionpath_trunctype@{a b} {n : trunc_index} {A B : TruncType n}
: A <~> B -> (A = B :> TruncType n)
:= equiv_path_trunctype@{a b} A B.#[export] Instanceisequiv_path_trunctype {n : trunc_index} {AB : TruncType n}
: IsEquiv (@path_trunctype n A B) := _.(** [path_trunctype] is functorial *)
H: Univalence n: trunc_index A: n -Type
path_trunctype 1 = 1
H: Univalence n: trunc_index A: n -Type
path_trunctype 1 = 1
H: Univalence n: trunc_index A: n -Type
(1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(A; trunctype_istrunc A)
(path_universe_uncurried 1))) @ 1 = 1
H: Univalence n: trunc_index A: n -Type
(1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(A; trunctype_istrunc A) 1)) @ 1 = 1
H: Univalence n: trunc_index A: n -Type
(1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|}) 1) @ 1 = 1
reflexivity.Qed.
H: Univalence n: trunc_index A, B: n -Type f: A <~> B
path_trunctype f^-1 = (path_trunctype f)^
H: Univalence n: trunc_index A, B: n -Type f: A <~> B
path_trunctype f^-1 = (path_trunctype f)^
H: Univalence n: trunc_index A, B: n -Type f: A <~> B
(1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (B; trunctype_istrunc B)
(A; trunctype_istrunc A)
(path_universe_uncurried f^-1))) @ 1 =
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f))) @ 1)^
H: Univalence n: trunc_index A, B: n -Type f: A <~> B
(1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (B; trunctype_istrunc B)
(A; trunctype_istrunc A)
(path_universe_uncurried f)^)) @ 1 =
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f))) @ 1)^
H: Univalence n: trunc_index A, B: n -Type f: A <~> B
(1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f))^) @ 1 =
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f))) @ 1)^
H: Univalence n: trunc_index A, B: n -Type f: A <~> B
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f))^ =
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f))) @ 1)^
H: Univalence n: trunc_index A, B: n -Type f: A <~> B
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f))^ =
(ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f)))^
exact (ap_V _ _).Qed.
H: Univalence n: trunc_index A, B, C: n -Type f: A <~> B g: B <~> C
path_trunctype (g oE f) =
path_trunctype f @ path_trunctype g
H: Univalence n: trunc_index A, B, C: n -Type f: A <~> B g: B <~> C
path_trunctype (g oE f) =
path_trunctype f @ path_trunctype g
H: Univalence n: trunc_index A, B, C: n -Type f: A <~> B g: B <~> C
(1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(C; trunctype_istrunc C)
(path_universe_uncurried (g oE f)))) @ 1 =
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f))) @ 1) @
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (B; trunctype_istrunc B)
(C; trunctype_istrunc C)
(path_universe_uncurried g))) @ 1)
H: Univalence n: trunc_index A, B, C: n -Type f: A <~> B g: B <~> C
(1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(C; trunctype_istrunc C)
(path_universe_uncurried f @
path_universe_uncurried g))) @ 1 =
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f))) @ 1) @
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (B; trunctype_istrunc B)
(C; trunctype_istrunc C)
(path_universe_uncurried g))) @ 1)
H: Univalence n: trunc_index A, B, C: n -Type f: A <~> B g: B <~> C
(1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f) @
path_sigma_hprop (B; trunctype_istrunc B)
(C; trunctype_istrunc C)
(path_universe_uncurried g))) @ 1 =
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f))) @ 1) @
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (B; trunctype_istrunc B)
(C; trunctype_istrunc C)
(path_universe_uncurried g))) @ 1)
H: Univalence n: trunc_index A, B, C: n -Type f: A <~> B g: B <~> C
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f) @
path_sigma_hprop (B; trunctype_istrunc B)
(C; trunctype_istrunc C)
(path_universe_uncurried g)) =
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f))) @ 1) @
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (B; trunctype_istrunc B)
(C; trunctype_istrunc C)
(path_universe_uncurried g))) @ 1)
H: Univalence n: trunc_index A, B, C: n -Type f: A <~> B g: B <~> C
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f) @
path_sigma_hprop (B; trunctype_istrunc B)
(C; trunctype_istrunc C)
(path_universe_uncurried g)) =
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f))) @ 1) @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (B; trunctype_istrunc B)
(C; trunctype_istrunc C)
(path_universe_uncurried g))
H: Univalence n: trunc_index A, B, C: n -Type f: A <~> B g: B <~> C
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f) @
path_sigma_hprop (B; trunctype_istrunc B)
(C; trunctype_istrunc C)
(path_universe_uncurried g)) =
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (A; trunctype_istrunc A)
(B; trunctype_istrunc B)
(path_universe_uncurried f)) @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1; trunctype_istrunc := u.2
|})
(path_sigma_hprop (B; trunctype_istrunc B)
(C; trunctype_istrunc C)
(path_universe_uncurried g))
exact (ap_pp _ _ _).Qed.
H: Univalence n: trunc_index A, B: n -Type f: A <~> B
ap trunctype_type (path_trunctype f) =
path_universe_uncurried f
H: Univalence n: trunc_index A, B: n -Type f: A <~> B
ap trunctype_type (path_trunctype f) =
path_universe_uncurried f
H: Univalence n: trunc_index trunctype_type: Type trunctype_istrunc: IsTrunc n trunctype_type trunctype_type0: Type trunctype_istrunc0: IsTrunc n trunctype_type0 f: {|
trunctype_type := trunctype_type;
trunctype_istrunc := trunctype_istrunc
|} <~>
{|
trunctype_type := trunctype_type0;
trunctype_istrunc := trunctype_istrunc0
|}
ap Trunc.trunctype_type (path_trunctype f) =
path_universe_uncurried f
H: Univalence n: trunc_index trunctype_type: Type trunctype_istrunc: IsTrunc n trunctype_type trunctype_type0: Type trunctype_istrunc0: IsTrunc n trunctype_type0 f: trunctype_type <~> trunctype_type0
ap Trunc.trunctype_type
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1;
trunctype_istrunc := u.2
|})
(path_sigma_hprop
(trunctype_type; trunctype_istrunc)
(trunctype_type0; trunctype_istrunc0)
(path_universe_uncurried f))) @ 1) =
path_universe_uncurried f
H: Univalence n: trunc_index trunctype_type: Type trunctype_istrunc, trunctype_istrunc0: IsTrunc n trunctype_type f: trunctype_type <~> trunctype_type
ap Trunc.trunctype_type
((1 @
ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1;
trunctype_istrunc := u.2
|})
(path_sigma_hprop
(trunctype_type; trunctype_istrunc)
(trunctype_type; trunctype_istrunc0) 1)) @ 1) =
1
H: Univalence n: trunc_index trunctype_type: Type trunctype_istrunc, trunctype_istrunc0: IsTrunc n trunctype_type f: trunctype_type <~> trunctype_type
ap Trunc.trunctype_type
(ap
(funu : {X : Type & IsTrunc n X} =>
{|
trunctype_type := u.1;
trunctype_istrunc := u.2
|})
(path_sigma_hprop
(trunctype_type; trunctype_istrunc)
(trunctype_type; trunctype_istrunc0) 1)) = 1
H: Univalence n: trunc_index trunctype_type: Type trunctype_istrunc, trunctype_istrunc0: IsTrunc n trunctype_type f: trunctype_type <~> trunctype_type
foralln : trunc_index,
IsTrunc n.+1 {A : Type & IsTrunc n A}
H: Univalence
foralln : trunc_index,
IsTrunc n.+1 {A : Type & IsTrunc n A}
H: Univalence n: trunc_index
IsTrunc n.+1 {A : Type & IsTrunc n A}
exact (istrunc_equiv_istrunc _ issig_trunctype^-1).Defined.(** ** Some standard inhabitants *)DefinitionUnit_hp : HProp := (Build_HProp Unit).DefinitionFalse_hp : HProp := (Build_HProp Empty).DefinitionNegation_hp `{Funext} (hprop : HProp) : HProp := Build_HProp (~hprop).(** We could continue with products etc *)(** ** The canonical map from [Bool] to [HProp] *)Definitionis_true (b : Bool) : HProp
:= if b then Unit_hp else False_hp.(** ** Facts about [HProp]s using univalence *)
H: Univalence X, Y: Type IsHProp0: IsHProp Y
IsHProp (X = Y)
H: Univalence X, Y: Type IsHProp0: IsHProp Y
IsHProp (X = Y)
H: Univalence X, Y: Type IsHProp0: IsHProp Y
forallxy : X = Y, x = y
H: Univalence X, Y: Type IsHProp0: IsHProp Y pf1, pf2: X = Y
pf1 = pf2
H: Univalence X, Y: Type IsHProp0: IsHProp Y pf1, pf2: X = Y
equiv_path X Y pf1 = equiv_path X Y pf2
H: Univalence X, Y: Type IsHProp0: IsHProp Y pf1, pf2: X = Y
equiv_path X Y pf1 == equiv_path X Y pf2
intros x; byapply path_ishprop.Qed.Definitionpath_iff_ishprop_uncurried `{IsHProp A, IsHProp B}
: (A <-> B) -> A = B :> Type
:= @path_universe_uncurried _ A B o equiv_iff_hprop_uncurried.Definitionpath_iff_hprop_uncurried {AB : HProp}
: (A <-> B) -> A = B :> HProp
:= (@path_hprop A B) o (@equiv_iff_hprop_uncurried A _ B _).#[export] Instanceisequiv_path_iff_ishprop_uncurried `{IsHProp A, IsHProp B}
: IsEquiv (@path_iff_ishprop_uncurried A _ B _) := _.#[export] Instanceisequiv_path_iff_hprop_uncurried {AB : HProp}
: IsEquiv (@path_iff_hprop_uncurried A B) := _.Definitionpath_iff_ishprop `{IsHProp A, IsHProp B}
: (A -> B) -> (B -> A) -> A = B :> Type
:= funfg => path_iff_ishprop_uncurried (f,g).Definitionpath_iff_hprop {AB : HProp}
: (A -> B) -> (B -> A) -> A = B :> HProp
:= funfg => path_iff_hprop_uncurried (f,g).
H: Univalence A, B: Type IsHProp0: IsHProp A IsHProp1: IsHProp B
(A <-> B) <~> A = B
H: Univalence A, B: Type IsHProp0: IsHProp A IsHProp1: IsHProp B