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]
LocalOpen Scope pointed_scope.(** * Modalities, reflective subuniverses and pointed types *)(** So far, everything is about general reflective subuniverses, but in the future results about modalities can be placed here as well. *)#[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 universal property. *)
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
([O P, ispointed_O P] ->** Q) <~>* (P ->** Q)
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
IsEquiv ?pointed_equiv_fun
(* We could just use the map [e] defined in the next bullet, but we want Coq to immediately unfold the underlying map to this. *)
H: Funext O: ReflectiveSubuniverse P, Q: pType H0: In O Q
([O P, ispointed_O P] ->** Q) ->* (P ->** Q)
exact (Build_pMap (funf => f o* pto O P) 1).(* We'll give an equivalence that definitionally has the same underlying map. *)
H: Funext O: ReflectiveSubuniverse P, Q: pType H0: In O Q
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
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.(** ** 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]. *)
O: ReflectiveSubuniverse X, Y: pType f: X ->* Y
O_pfunctor O f o* pto O X ==* pto O Y o* f
O: ReflectiveSubuniverse X, Y: pType f: X ->* Y
O_pfunctor O f o* pto O X ==* pto O Y o* f
napply pO_rec_beta.Defined.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) _.