Built with Alectryon. 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.
From HoTT Require Import Basics Types ReflectiveSubuniverse Modality Pointed.Core Pointed.pMap.From HoTT Require Import Basics Types ReflectiveSubuniverse Modality Pointed.Core Pointed.pMap.LocalOpen Scope pointed_scope.(** * Modalities, reflective subuniverses and pointed types *)#[export] Instanceispointed_O `{O : ReflectiveSubuniverse} (X : Type)
`{IsPointed X} : IsPointed (O X) := to O _ (point X).Definitionpto (O : ReflectiveSubuniverse@{u}) (X : pType@{u})
: X ->* [O X, _]
:= Build_pMap (to O X) idpath.(** If [A] is already [O]-local, then Coq knows that [pto] is an equivalence, so we can simply define: *)Definitionpequiv_pto `{O : ReflectiveSubuniverse} {X : pType} `{In O X}
: X <~>* [O X, _] := Build_pEquiv (pto O X) _.(** Applying [O_rec] to a pointed map yields a pointed map. *)DefinitionpO_rec `{O : ReflectiveSubuniverse} {X Y : pType}
`{In O Y} (f : X ->* Y) : [O X, _] ->* Y
:= Build_pMap (O_rec f) (O_rec_beta _ _ @ point_eq f).
O: ReflectiveSubuniverse X, Y: pType H: In O Y f: X ->* Y
pO_rec f o* pto O X ==* f
O: ReflectiveSubuniverse X, Y: pType H: In O Y f: X ->* Y
pO_rec f o* pto O X ==* f
O: ReflectiveSubuniverse X, Y: pType H: In O Y f: X ->* Y
pO_rec f o* pto O X == f
O: ReflectiveSubuniverse X, Y: pType H: In O Y f: X ->* Y
?p pt = dpoint_eq (pO_rec f o* pto O X) @ (dpoint_eq f)^
O: ReflectiveSubuniverse X, Y: pType H: In O Y f: X ->* Y
O_rec_beta f pt = dpoint_eq (pO_rec f o* pto O X) @ (dpoint_eq f)^
O: ReflectiveSubuniverse X, Y: pType H: In O Y f: X ->* Y
O_rec_beta f pt = (1 @ (O_rec_beta f pt @ point_eq f)) @ (dpoint_eq f)^
O: ReflectiveSubuniverse X, Y: pType H: In O Y f: X ->* Y
O_rec_beta f pt @ dpoint_eq f = 1 @ (O_rec_beta f pt @ point_eq f)
exact (concat_1p _)^.Defined.(** A pointed version of the induction principle for a modality. *)DefinitionpO_ind `{O : Modality} {X : pType} {Y : pFam [O X, _]}
`{forallx, In O (Y x)} (f : pForall X (pfam_precompose Y (pto O X)))
: pForall [O X, _] Y
:= Build_pForall _ Y (O_ind Y f) (O_ind_beta Y f pt @ dpoint_eq f).
O: Modality X: pType Y: pFam [O X, ispointed_O X] H: forallx : [O X, ispointed_O X], In O (Y x) f: pForall X (pfam_precompose Y (pto O X))
functor_pforall_left (pO_ind f) (pto O X) ==* f
O: Modality X: pType Y: pFam [O X, ispointed_O X] H: forallx : [O X, ispointed_O X], In O (Y x) f: pForall X (pfam_precompose Y (pto O X))
functor_pforall_left (pO_ind f) (pto O X) ==* f
O: Modality X: pType Y: pFam [O X, ispointed_O X] H: forallx : [O X, ispointed_O X], In O (Y x) f: pForall X (pfam_precompose Y (pto O X))
functor_pforall_left (pO_ind f) (pto O X) == f
O: Modality X: pType Y: pFam [O X, ispointed_O X] H: forallx : [O X, ispointed_O X], In O (Y x) f: pForall X (pfam_precompose Y (pto O X))
O: Modality X: pType Y: pFam [O X, ispointed_O X] H: forallx : [O X, ispointed_O X], In O (Y x) f: pForall X (pfam_precompose Y (pto O X))
O_ind_beta Y f pt =
dpoint_eq (functor_pforall_left (pO_ind f) (pto O X)) @ (dpoint_eq f)^
O: Modality X: pType Y: pFam [O X, ispointed_O X] H: forallx : [O X, ispointed_O X], In O (Y x) f: pForall X (pfam_precompose Y (pto O X))
O_ind_beta Y f pt =
(1 @ ap (transport Y 1) (1 @ (O_ind_beta Y f pt @ dpoint_eq f))) @
(dpoint_eq f)^
O: Modality X: pType Y: pFam [O X, ispointed_O X] H: forallx : [O X, ispointed_O X], In O (Y x) f: pForall X (pfam_precompose Y (pto O X))
O_ind_beta Y f pt @ dpoint_eq f =
1 @ ap (transport Y 1) (1 @ (O_ind_beta Y f pt @ dpoint_eq f))
O: Modality X: pType Y: pFam [O X, ispointed_O X] H: forallx : [O X, ispointed_O X], In O (Y x) f: pForall X (pfam_precompose Y (pto O X))
ap (transport Y 1) (1 @ (O_ind_beta Y f pt @ dpoint_eq f)) =
O_ind_beta Y f pt @ dpoint_eq f
O: Modality X: pType Y: pFam [O X, ispointed_O X] H: forallx : [O X, ispointed_O X], In O (Y x) f: pForall X (pfam_precompose Y (pto O X))
1 @ (O_ind_beta Y f pt @ dpoint_eq f) = O_ind_beta Y f pt @ dpoint_eq f
apply concat_1p.Defined.(** To show two pointed maps out of [O X] into an [O]-local type are pointed homotopic, it is enough to compare their precomposites with [pto O X]. Unlike passing through [pequiv_ptr_rec], this needs no [Funext]. And note that it goes through without assuming that [O] is a modality. *)
O: ReflectiveSubuniverse X, Y: pType H: In O Y f, g: [O X, ispointed_O X] ->* Y h: f o* pto O X ==* g o* pto O X
f ==* g
O: ReflectiveSubuniverse X, Y: pType H: In O Y f, g: [O X, ispointed_O X] ->* Y h: f o* pto O X ==* g o* pto O X
f ==* g
O: ReflectiveSubuniverse X, Y: pType H: In O Y f, g: [O X, ispointed_O X] ->* Y h: f o* pto O X ==* g o* pto O X
f == g
O: ReflectiveSubuniverse X, Y: pType H: In O Y f, g: [O X, ispointed_O X] ->* Y h: f o* pto O X ==* g o* pto O X
?p pt = dpoint_eq f @ (dpoint_eq g)^
O: ReflectiveSubuniverse X, Y: pType H: In O Y f, g: [O X, ispointed_O X] ->* Y h: f o* pto O X ==* g o* pto O X
f == g
exact (O_indpaths _ _ h).
O: ReflectiveSubuniverse X, Y: pType H: In O Y f, g: [O X, ispointed_O X] ->* Y h: f o* pto O X ==* g o* pto O X
O_indpaths f g h pt = dpoint_eq f @ (dpoint_eq g)^
O: ReflectiveSubuniverse X, Y: pType H: In O Y f, g: [O X, ispointed_O X] ->* Y h: f o* pto O X ==* g o* pto O X
h pt = dpoint_eq f @ (dpoint_eq g)^
O: ReflectiveSubuniverse X, Y: pType H: In O Y f, g: [O X, ispointed_O X] ->* Y h: f o* pto O X ==* g o* pto O X
IsEquiv (Build_pMap (funf : [O P, ispointed_O P] ->** Q => f o* pto O P) 1)
H: Funext O: ReflectiveSubuniverse P, Q: pType H0: In O Q
([O P, ispointed_O P] ->* Q) <~> (P ->* Q)
H: Funext O: ReflectiveSubuniverse P, Q: pType H0: In O Q
{f : [O P, ispointed_O P] -> Q & f pt = pt} <~> {f : P -> Q & f pt = pt}
H: Funext O: ReflectiveSubuniverse P, Q: pType H0: In O Q
([O P, ispointed_O P] -> Q) <~> (P -> Q)
H: Funext O: ReflectiveSubuniverse P, Q: pType H0: In O Q
foralla : [O P, ispointed_O P] -> Q,
(funf : [O P, ispointed_O P] -> Q => f pt = pt) a <~>
(funf : P -> Q => f pt = pt) (?f a)
H: Funext O: ReflectiveSubuniverse P, Q: pType H0: In O Q
([O P, ispointed_O P] -> Q) <~> (P -> Q)
rapply equiv_o_to_O.
H: Funext O: ReflectiveSubuniverse P, Q: pType H0: In O Q
foralla : [O P, ispointed_O P] -> Q,
(funf : [O P, ispointed_O P] -> Q => f pt = pt) a <~>
(funf : P -> Q => f pt = pt) (equiv_o_to_O O P Q a)
H: Funext O: ReflectiveSubuniverse P, Q: pType H0: In O Q f: [O P, ispointed_O P] -> Q
f (ispointed_O P) = pt <~> f (to O P pt) = pt
(* [reflexivity] works here, but then the underlying map won't agree definitionally with precomposition by [pto P], since pointed composition inserts a reflexivity path here. *)apply (equiv_concat_l 1).
H: Funext O: ReflectiveSubuniverse P, Q: pType H0: In O Q e:= issig_pmap P Q
oE equiv_functor_sigma' (equiv_o_to_O O P Q)
(funf : [O P, ispointed_O P] -> Q =>
equiv_concat_l 1 pt
:
(funf0 : [O P, ispointed_O P] -> Q => f0 pt = pt) f <~>
(funf0 : P -> Q => f0 pt = pt) (equiv_o_to_O O P Q f))
oE (issig_pmap [O P, ispointed_O P] Q)^-1: ([O P, ispointed_O P] ->* Q) <~> (P ->* Q)
IsEquiv (Build_pMap (funf : [O P, ispointed_O P] ->** Q => f o* pto O P) 1)
exact (equiv_isequiv e).Defined.(** Precomposition with an [O]-connected pointed map is an equivalence on pointed mapping spaces into an [O]-local type. This is a pointed version of [equiv_o_conn_map]. Note that it does not subsume [pequiv_o_pto_O], since [to O X] is only known to be [O]-connected when [O] is a modality. *)
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y
(B ->** Y) <~>* (A ->** Y)
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y
(B ->** Y) <~>* (A ->** Y)
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y
(B ->** Y) ->* (A ->** Y)
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y
IsEquiv ?pointed_equiv_fun
(* As in [pequiv_o_pto_O], we give the underlying map first so that Coq unfolds it to precomposition with [f]. *)
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y
(B ->** Y) ->* (A ->** Y)
exact (Build_pMap (fung => g o* f) (path_pforall (postcompose_pconst f))).
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y
IsEquiv
(Build_pMap (fung : B ->** Y => g o* f)
(path_pforall (postcompose_pconst f)))
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y
(B ->* Y) <~> (A ->* Y)
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y e:= ?Goal: (B ->* Y) <~> (A ->* Y)
IsEquiv
(Build_pMap (fung : B ->** Y => g o* f)
(path_pforall (postcompose_pconst f)))
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y
(B ->* Y) <~> (A ->* Y)
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y
{f0 : B -> Y & f0 pt = pt} <~> {f0 : A -> Y & f0 pt = pt}
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y
(B -> Y) <~> (A -> Y)
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y
foralla : B -> Y,
(funf0 : B -> Y => f0 pt = pt) a <~> (funf0 : A -> Y => f0 pt = pt) (?f a)
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y
(B -> Y) <~> (A -> Y)
rapply (equiv_o_conn_map O f (fun_ => Y)).
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y
foralla : B -> Y,
(funf0 : B -> Y => f0 pt = pt) a <~>
(funf0 : A -> Y => f0 pt = pt) (equiv_o_conn_map O f (fun_ : B => Y) a)
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y g: B -> Y
g pt = pt <~> (g oD f) pt = pt
(* This is the path that pointed composition inserts, so the underlying map agrees definitionally with precomposition by [f]. *)exact (equiv_concat_l (ap g (point_eq f)) _).
H: Funext O: ReflectiveSubuniverse A, B: pType f: A ->* B H0: IsConnMap O f Y: pType H1: In O Y e:= issig_pmap A Y
oE equiv_functor_sigma' (equiv_o_conn_map O f (fun_ : B => Y))
(fung : B -> Y =>
equiv_concat_l (ap g (point_eq f)) pt
:
(funf0 : B -> Y => f0 pt = pt) g <~>
(funf0 : A -> Y => f0 pt = pt)
(equiv_o_conn_map O f (fun_ : B => Y) g))
oE (issig_pmap B Y)^-1: (B ->* Y) <~> (A ->* Y)
IsEquiv
(Build_pMap (fung : B ->** Y => g o* f)
(path_pforall (postcompose_pconst f)))
exact (equiv_isequiv e).Defined.(** ** Pointed functoriality *)DefinitionO_pfunctor `(O : ReflectiveSubuniverse) {X Y : pType}
(f : X ->* Y) : [O X, _] ->* [O Y, _]
:= pO_rec (pto O Y o* f).(** Coq knows that [O_pfunctor O f] is an equivalence whenever [f] is. *)Definitionequiv_O_pfunctor `(O : ReflectiveSubuniverse) {X Y : pType}
(f : X ->* Y) `{IsEquiv _ _ f} : [O X, _] <~>* [O Y, _]
:= Build_pEquiv (O_pfunctor O f) _.(** Pointed naturality of [O_pfunctor]. *)Definitionpto_O_natural `(O : ReflectiveSubuniverse) {X Y : pType}
(f : X ->* Y) : O_pfunctor O f o* pto O X ==* pto O Y o* f
:= pO_rec_beta _.Definitionpequiv_O_inverts `(O : ReflectiveSubuniverse) {X Y : pType}
(f : X ->* Y) `{O_inverts O f}
: [O X, _] <~>* [O Y, _]
:= Build_pEquiv (O_pfunctor O f) _.