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 Types.Sigma Types.Paths Types.Unit Types.Arrow.(** * H-Sets *)LocalOpen Scope path_scope.(** A type is a set if and only if it satisfies Axiom K. *)DefinitionaxiomKA := forall (x : A) (p : x = x), p = idpath x.
H: Funext A: Type IsHSet0: IsHSet A x, y: A p, q: x = y
p = q
H: Funext A: Type IsHSet0: IsHSet A x, y: A p, q: x = y
p = q
H: Funext A: Type IsHSet0: IsHSet A x: A p: x = x
p = 1
apply axiomK_hset; assumption.Defined.(** Recall that axiom K says that any self-path is homotopic to the identity path. In particular, the identity path is homotopic to itself. The following lemma says that the endo-homotopy of the identity path thus specified is in fact (homotopic to) its identity homotopy (whew!). *)(* TODO: What was the purpose of this lemma? Do we need it at all? It's actually fairly trivial. *)
H: Funext A: Type x: A K: axiomK A
K x 1 = 1
H: Funext A: Type x: A K: axiomK A
K x 1 = 1
H: Funext A: Type x: A K: axiomK A T1A:= istrunc_succ: IsTrunc 1 A
K x 1 = 1
exact (@hset_path2 (x=x) (T1A x x) _ _ _ _).Defined.EndAssumeFunext.(** We prove that if [R] is a reflexive mere relation on [X] implying identity, then [X] is an hSet, and hence [R x y] is equivalent to [x = y]. *)
X: Type R: Relation X H: Reflexive R H0: is_mere_relation X R f: forallxy : X, R x y -> x = y
IsHSet X
X: Type R: Relation X H: Reflexive R H0: is_mere_relation X R f: forallxy : X, R x y -> x = y
IsHSet X
X: Type R: Relation X H: Reflexive R H0: is_mere_relation X R f: forallxy : X, R x y -> x = y
axiomK X
X: Type R: Relation X H: Reflexive R H0: is_mere_relation X R f: forallxy : X, R x y -> x = y x: X p: x = x
p = 1
X: Type R: Relation X H: Reflexive R H0: is_mere_relation X R f: forallxy : X, R x y -> x = y x: X p: x = x
p =
(f x x (transport (R x) p^ (reflexivity x)))^ @
f x x (transport (R x) p^ (reflexivity x))
X: Type R: Relation X H: Reflexive R H0: is_mere_relation X R f: forallxy : X, R x y -> x = y x: X p: x = x
f x x (transport (R x) p^ (reflexivity x)) @ p =
f x x (transport (R x) p^ (reflexivity x))
X: Type R: Relation X H: Reflexive R H0: is_mere_relation X R f: forallxy : X, R x y -> x = y x: X p: x = x
transport (funy : X => x = y) p
(f x x (transport (R x) p^ (reflexivity x))) =
f x x (transport (R x) p^ (reflexivity x))
X: Type R: Relation X H: Reflexive R H0: is_mere_relation X R f: forallxy : X, R x y -> x = y x: X p: x = x
transport (funx0 : X => R x x0 -> x = x0) p (f x x)
(reflexivity x) =
f x x (transport (R x) p^ (reflexivity x))
X: Type R: Relation X H: Reflexive R H0: is_mere_relation X R f: forallxy : X, R x y -> x = y x: X p: x = x
f x x (reflexivity x) =
f x x (transport (R x) p^ (reflexivity x))
X: Type R: Relation X H: Reflexive R H0: is_mere_relation X R f: forallxy : X, R x y -> x = y x: X p: x = x
reflexivity x = transport (R x) p^ (reflexivity x)
apply path_ishprop.Defined.
X: Type R: Relation X H: Reflexive R H0: is_mere_relation X R f: forallxy : X, R x y -> x = y x, y: X
IsEquiv (f x y)
X: Type R: Relation X H: Reflexive R H0: is_mere_relation X R f: forallxy : X, R x y -> x = y x, y: X
IsEquiv (f x y)
X: Type R: Relation X H: Reflexive R H0: is_mere_relation X R f: forallxy : X, R x y -> x = y x, y: X X0: IsHSet X
IsEquiv (f x y)
refine (isequiv_adjointify
(f x y)
(funp => transport (R x) p (reflexivity x))
_
_);
intro;
apply path_ishprop.Defined.(** We will now prove that for sets, monos and injections are equivalent.*)Definitionismono {XY} (f : X -> Y)
:= forall (Z : HSet),
forallgh : Z -> X, f o g = f o h -> g = h.
A, B: Type m: A -> B
IsEmbedding m -> IsInjective m
A, B: Type m: A -> B
IsEmbedding m -> IsInjective m
A, B: Type m: A -> B ise: IsEmbedding m x, y: A p: m x = m y
x = y
A, B: Type m: A -> B ise: IsEmbedding m x, y: A p: m x = m y i:= ise (m y): IsHProp (hfiber m (m y))
x = y
A, B: Type m: A -> B ise: IsEmbedding m x, y: A p: m x = m y i:= ise (m y): IsHProp (hfiber m (m y)) q: (x; p) = (y; 1)
x = y
exact (ap pr1 q).Defined.(** Computation rule for [isinj_embedding]. *)
X, Y: Type f: X -> Y I: IsEmbedding f x: X
isinj_embedding f I x x 1 = 1
X, Y: Type f: X -> Y I: IsEmbedding f x: X
isinj_embedding f I x x 1 = 1
exact (ap (ap pr1) (contr (idpath : (x;idpath) = (x;idpath)))).Defined.
A, B: Type s: A -> B r: B -> A H: r o s == idmap
IsInjective s
A, B: Type s: A -> B r: B -> A H: r o s == idmap
IsInjective s
A, B: Type s: A -> B r: B -> A H: r o s == idmap a, a': A alpha: s a = s a'
a = a'
exact ((H a)^ @ ap r alpha @ H a').Defined.
A, B: Type IsHSet0: IsHSet B m: A -> B
IsInjective m -> IsEmbedding m
A, B: Type IsHSet0: IsHSet B m: A -> B
IsInjective m -> IsEmbedding m
A, B: Type IsHSet0: IsHSet B m: A -> B isi: IsInjective m b: B
IsHProp (hfiber m b)
A, B: Type IsHSet0: IsHSet B m: A -> B isi: IsInjective m b: B x: A p: m x = b y: A q: m y = b
(x; p) = (y; q)
A, B: Type IsHSet0: IsHSet B m: A -> B isi: IsInjective m b: B x: A p: m x = b y: A q: m y = b
x = y
exact (isi x y (p @ q^)).Defined.
H: Funext X, Y: Type f: X -> Y
IsInjective f -> ismono f
H: Funext X, Y: Type f: X -> Y
IsInjective f -> ismono f
H: Funext X, Y: Type f: X -> Y X0: IsInjective f Z: HSet g, h: Z -> X H': (funx : Z => f (g x)) = (funx : Z => f (h x))
g = h
H: Funext X, Y: Type f: X -> Y X0: IsInjective f Z: HSet g, h: Z -> X H': (funx : Z => f (g x)) = (funx : Z => f (h x))
g == h
H: Funext X, Y: Type f: X -> Y X0: IsInjective f Z: HSet g, h: Z -> X H': (funx : Z => f (g x)) == (funx : Z => f (h x))
g == h
H: Funext X, Y: Type f: X -> Y X0: forallxy : X, f x = f y -> x = y Z: HSet g, h: Z -> X H': forallx : Z, f (g x) = f (h x)