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.Require Import WildCat.Require Import Pointed.Core.Require Import Pointed.Loops.Require Import Pointed.pTrunc.Require Import Pointed.pEquiv.Require Import Homotopy.Suspension.Require Import Homotopy.BlakersMassey.Require Import Truncations.Generalizable VariablesX A B f g n.LocalOpen Scope path_scope.LocalOpen Scope pointed_scope.(** ** Pointedness of [Susp] and path spaces thereof *)(** We arbitrarily choose [North] to be the point. *)Instanceispointed_susp {X : Type} : IsPointed (Susp X) | 0
:= North.Instanceispointed_path_susp `{IsPointed X}
: IsPointed (North = South :> Susp X) | 0 := merid (point X).Instanceispointed_path_susp' `{IsPointed X}
: IsPointed (South = North :> Susp X) | 0 := (merid (point X))^.Definitionpsusp (X : Type) : pType
:= [Susp X, _].(** ** Suspension Functor *)(** [psusp] has a functorial action. *)(** TODO: make this a displayed functor *)Instanceis0functor_psusp : Is0Functor psusp
:= Build_Is0Functor _ _ _ _ psusp (funXYf
=> Build_pMap (functor_susp f) 1).(** [psusp] is a 1-functor. *)
Is1Functor psusp
Is1Functor psusp
forall (ab : Type) (fg : a $-> b),
f $== g -> fmap psusp f $== fmap psusp g
foralla : Type, fmap psusp (Id a) $== Id (psusp a)
forall (abc : Type) (f : a $-> b) (g : b $-> c),
fmap psusp (g $o f) $== fmap psusp g $o fmap psusp f
(** Action on 2-cells *)
forall (ab : Type) (fg : a $-> b),
f $== g -> fmap psusp f $== fmap psusp g
(ap (functor_susp f) (merid x))^ @
ap (functor_susp g) (merid x) = 1
X, Y: Type f, g: X -> Y p: f == g x: X
(merid (f x))^ @ merid (g x) = 1
X, Y: Type f, g: X -> Y p: f == g x: X
(merid (f x))^ @ merid (f x) = 1
apply concat_Vp.
X, Y: Type f, g: X -> Y p: f == g
(Susp_ind
(funy : Susp X =>
functor_susp f y = functor_susp g y) 11
(funx : X =>
internal_paths_rew_r
(funp : functor_susp f South =
functor_susp g South => p = 1)
(internal_paths_rew_r
(funp : functor_susp f South =
functor_susp f North =>
p @ ap (functor_susp g) (merid x) = 1)
(internal_paths_rew_r
(funp : Susp_rec North South
(funx0 : X => merid (f x0))
North =
Susp_rec North South
(funx0 : X => merid (f x0))
South =>
p^ @ ap (functor_susp g) (merid x) = 1)
(internal_paths_rew_r
(funp : Susp_rec North South
(funx0 : X => merid (g x0))
North =
Susp_rec North South
(funx0 : X => merid (g x0))
South =>
(merid (f x))^ @ p = 1)
(letp0 := p x inlety := g x inmatch
p0 in (_ = y0)
return ((merid ...)^ @ merid y0 = 1)
with
| 1 => concat_Vp (merid (f x))
end) (Susp_rec_beta_merid x))
(Susp_rec_beta_merid x))
(concat_p1 (ap (functor_susp f) (merid x))^))
(transport_paths_FlFr (merid x) 1)
:
transport
(funy : Susp X =>
functor_susp f y = functor_susp g y) (merid x)
1 = 1)
:
Build_pMap (functor_susp f) 1 ==
Build_pMap (functor_susp g) 1) pt =
dpoint_eq (Build_pMap (functor_susp f) 1) @
(dpoint_eq (Build_pMap (functor_susp g) 1))^
reflexivity.(** Preservation of identity. *)
foralla : Type, fmap psusp (Id a) $== Id (psusp a)
X: Type
fmap psusp (Id X) $== Id (psusp X)
X: Type
fmap psusp (Id X) == Id (psusp X)
X: Type
?p pt =
dpoint_eq (fmap psusp (Id X)) @
(dpoint_eq (Id (psusp X)))^
X: Type
fmap psusp (Id X) == Id (psusp X)
X: Type
forallx : X,
transport
(funy : Susp X =>
fmap psusp (Id X) y = Id (psusp X) y) (merid x) 1 =
1
X: Type x: X
transport
(funy : Susp X =>
fmap psusp (Id X) y = Id (psusp X) y) (merid x) 1 =
1
X: Type x: X
((ap (fmap psusp (Id X)) (ap idmap (merid x)))^ @ 1) @
merid x = 1
Susp_ind
(funy : Susp X =>
fmap psusp (Id X) y = Id (psusp X) y) 11
(funx : X =>
transport_paths_FFlr (merid x) 1 @
internal_paths_rew_r
(funp : North = Id (psusp X) South =>
((ap (fmap psusp (Id X)) p)^ @ 1) @ merid x = 1)
(internal_paths_rew_r
(funp : Susp_rec North South
(funx0 : X => merid (Id X x0)) North =
Susp_rec North South
(funx0 : X => merid (Id X x0)) South
=> (p^ @ 1) @ merid x = 1)
(internal_paths_rew_r
(funp : fmap psusp (Id X)
(Id (psusp X) South) =
fmap psusp (Id X) North =>
p @ merid x = 1)
(internal_paths_rew_r
(funp : fmap psusp (Id X)
(Id (psusp X) South) =
fmap psusp (Id X)
(Id (psusp X) South) => p = 1)
1 (concat_Vp (merid x)))
(concat_p1 (merid (Id X x))^))
(Susp_rec_beta_merid x)) (ap_idmap (merid x)))
pt =
dpoint_eq (fmap psusp (Id X)) @
(dpoint_eq (Id (psusp X)))^
reflexivity.(** Preservation of composition. *)
forall (abc : Type) (f : a $-> b) (g : b $-> c),
fmap psusp (g $o f) $== fmap psusp g $o fmap psusp f
a, b, c: Type f: a -> b g: b -> c
functor_susp (funx : a => g (f x)) ==
(funx : Susp a => functor_susp g (functor_susp f x))
a, b, c: Type f: a -> b g: b -> c
?Goal ispointed_susp = 1
a, b, c: Type f: a -> b g: b -> c
functor_susp (funx : a => g (f x)) ==
(funx : Susp a => functor_susp g (functor_susp f x))
a, b, c: Type f: a -> b g: b -> c
forallx : a,
transport
(funy : Susp a =>
functor_susp (funx0 : a => g (f x0)) y =
functor_susp g (functor_susp f y)) (merid x) 1 = 1
a, b, c: Type f: a -> b g: b -> c x: a
transport
(funy : Susp a =>
functor_susp (funx : a => g (f x)) y =
functor_susp g (functor_susp f y)) (merid x) 1 = 1
a, b, c: Type f: a -> b g: b -> c x: a
((ap (functor_susp (funx : a => g (f x))) (merid x))^ @
1) @
ap
(funx : Susp a => functor_susp g (functor_susp f x))
(merid x) = 1
a, b, c: Type f: a -> b g: b -> c x: a
ap
(funx : Susp a => functor_susp g (functor_susp f x))
(merid x) =
ap (functor_susp (funx : a => g (f x))) (merid x) @ 1
Susp_ind
(funy : Susp a =>
functor_susp (funx : a => g (f x)) y =
(funx : Susp a =>
functor_susp g (functor_susp f x)) y) 11
((funx : a =>
transport_paths_FlFr (merid x) 1 @
internal_paths_rew_r
(funp : functor_susp (funx0 : a => g (f x0))
South =
functor_susp (funx0 : a => g (f x0))
North =>
p @
ap
(funx0 : Susp a =>
functor_susp g (functor_susp f x0))
(merid x) = 1)
(moveR_Vp
(ap
(funx0 : Susp a =>
functor_susp g (functor_susp f x0))
(merid x)) 1
(ap (functor_susp (funx0 : a => g (f x0)))
(merid x))
(internal_paths_rew_r
(funp : functor_susp g
(functor_susp f North) =
functor_susp
(funx0 : a => g (f x0)) South =>
ap
(funx0 : Susp a =>
functor_susp g (functor_susp f x0))
(merid x) = p)
(internal_paths_rew_r
(funp : functor_susp g
(functor_susp f North) =
functor_susp g
(functor_susp f South) =>
p =
ap
(functor_susp
(funx0 : a => g (f x0)))
(merid x))
(internal_paths_rew_r
(funp : Susp_rec North South
(funx0 : a => merid (f x0))
North =
Susp_rec North South
(funx0 : a => merid (f x0))
South =>
ap (functor_susp g) p =
ap
(functor_susp
(funx0 : a => g (f x0)))
(merid x))
(internal_paths_rew_r
(funp : Susp_rec North South
(fun ... => merid ...)
North =
Susp_rec North South
(fun ... => merid ...)
South =>
p =
ap
(functor_susp
(fun ... => g ...))
(merid x))
(internal_paths_rew_r
(funp : Susp_rec North South
(...) North =
Susp_rec North South
(...) South =>
merid (g (...)) = p) 1
(Susp_rec_beta_merid x))
(Susp_rec_beta_merid (f x)))
(Susp_rec_beta_merid x))
(ap_compose (functor_susp f)
(functor_susp g) (merid x)))
(concat_p1
(ap
(functor_susp
(funx0 : a => g (f x0)))
(merid x)))))
(concat_p1
(ap (functor_susp (funx0 : a => g (f x0)))
(merid x))^))
:
forallx : a,
transport
(funy : Susp a =>
functor_susp (funx0 : a => g (f x0)) y =
(funx0 : Susp a =>
functor_susp g (functor_susp f x0)) y)
(merid x) 1 = 1) ispointed_susp = 1
reflexivity.Defined.(** ** Loop-Suspension Adjunction *)ModuleBook_Loop_Susp_Adjunction.(** Here is the proof of the adjunction isomorphism given in the book (6.5.4); we put it in a non-exported module for reasons discussed below. *)
H: Funext A, B: pType
(psusp A ->* B) <~> (A ->* loops B)
H: Funext A, B: pType
(psusp A ->* B) <~> (A ->* loops B)
H: Funext A, B: pType
{f : psusp A -> B & f pt = pt} <~> (A ->* loops B)
H: Funext A, B: pType
{NSm : {NS : B * B & A -> fst NS = snd NS} &
fst NSm.1 = pt} <~> (A ->* loops B)
H: Funext A, B: pType
{NSm : {NS : B * B & A -> fst NS = snd NS} &
fst NSm.1 = pt} <~>
{bp : {b : B & b = pt} & {b : B & A -> bp.1 = b}}
H: Funext A, B: pType
{bp : {b : B & b = pt} & {b : B & A -> bp.1 = b}} <~>
(A ->* loops B)
H: Funext A, B: pType
{bp : {b : B & b = pt} & {b : B & A -> bp.1 = b}} <~>
(A ->* loops B)
H: Funext A, B: pType
{b : B & A -> pt = b} <~> (A ->* loops B)
H: Funext A, B: pType
{pm : {p : B & A -> pt = p} &
{q : pt = pm.1 & pm.2 pt = q}} <~> (A ->* loops B)
make_equiv_contr_basedpaths.Defined.(** Unfortunately, with this definition it seems to be quite hard to prove that the isomorphism is natural on pointed maps. The following proof gets partway there, but ends with a pretty intractable goal. It's also quite slow, so we don't want to compile it all the time. *)(**<< Definition loop_susp_adjoint_nat_r `{Funext} (A B B' : pType) (f : psusp A ->* B) (g : B ->* B') : loop_susp_adjoint A B' (g o* f) ==* fmap loops g o* loop_susp_adjoint A B f. Proof. pointed_reduce. (* Very slow for some reason. *) exact (Build_pHomotopy _ _). - intros a. simpl. exact (_ @ (concat_1p _)^). exact (_ @ (concat_p1 _)^). rewrite !transport_sigma. simpl. rewrite !(transport_arrow_fromconst (B := A)). rewrite !transport_paths_Fr. rewrite !ap_V, !ap_pr1_path_basedpaths. Fail rewrite ap_pp, !(ap_compose f g), ap_V. (* This line fails with current versions of the library. *) Fail reflexivity. admit. - cbn. Fail reflexivity. Abort.>> *)EndBook_Loop_Susp_Adjunction.(** Thus, instead we will construct the adjunction in terms of a unit and counit natural transformation. *)Definitionloop_susp_unit (X : pType) : X ->* loops (psusp X)
:= Build_pMap (funx => merid x @ (merid (point X))^) (concat_pV _).(** By Freudenthal, we have that this map is (2n+2)-connected when [X] is (n+1)-connected. *)
f o* loop_susp_counit X ==*
loop_susp_counit Y o* fmap psusp (fmap loops f)
X, Y: pType f: X ->* Y
f o* loop_susp_counit X ==*
loop_susp_counit Y o* fmap psusp (fmap loops f)
X: Type point0: IsPointed X Y: Type f: X -> Y
{| pointed_fun := f; dpoint_eq := 1 |}
o* loop_susp_counit [X, point0] ==*
loop_susp_counit [Y, f point0]
o* Build_pMap
(functor_susp
(funp : point0 = point0 => 1 @ (ap f p @ 1)))
1
X: Type point0: IsPointed X Y: Type f: X -> Y
(funx : Susp (point0 = point0) =>
f (Susp_rec pt pt idmap x)) ==
(funx : Susp (point0 = point0) =>
Susp_rec pt pt idmap
(functor_susp
(funp : point0 = point0 => 1 @ (ap f p @ 1)) x))
X: Type point0: IsPointed X Y: Type f: X -> Y
?Goal pt = 1
X: Type point0: IsPointed X Y: Type f: X -> Y
(funx : Susp (point0 = point0) =>
f (Susp_rec pt pt idmap x)) ==
(funx : Susp (point0 = point0) =>
Susp_rec pt pt idmap
(functor_susp
(funp : point0 = point0 => 1 @ (ap f p @ 1)) x))
X: Type point0: IsPointed X Y: Type f: X -> Y p: point0 = point0
transport
(funy : Susp (point0 = point0) =>
f (Susp_rec pt pt idmap y) =
Susp_rec pt pt idmap
(functor_susp
(funp : point0 = point0 => 1 @ (ap f p @ 1))
y)) (merid p) 1 = 1
X: Type point0: IsPointed X Y: Type f: X -> Y p: point0 = point0
(ap f (ap (Susp_rec pt pt idmap) (merid p)))^ @
ap
(funx : Susp (point0 = point0) =>
Susp_rec pt pt idmap
(functor_susp
(funp : point0 = point0 => 1 @ (ap f p @ 1))
x)) (merid p) = 1
X: Type point0: IsPointed X Y: Type f: X -> Y p: point0 = point0
ap
(funx : Susp (point0 = point0) =>
Susp_rec pt pt idmap
(functor_susp
(funp : point0 = point0 => 1 @ (ap f p @ 1))
x)) (merid p) =
ap f (ap (Susp_rec pt pt idmap) (merid p)) @ 1
X: Type point0: IsPointed X Y: Type f: X -> Y p: point0 = point0
ap (Susp_rec pt pt idmap)
(ap
(Susp_rec North South
(funx0 : point0 = point0 =>
merid (1 @ (ap f x0 @ 1))))
(merid p)) =
ap f (ap (Susp_rec pt pt idmap) (merid p)) @ 1
X: Type point0: IsPointed X Y: Type f: X -> Y p: point0 = point0
1 @ (ap f p @ 1) =
ap f (ap (Susp_rec pt pt idmap) (merid p)) @ 1
X: Type point0: IsPointed X Y: Type f: X -> Y p: point0 = point0
ap f p @ 1 =
ap f (ap (Susp_rec pt pt idmap) (merid p)) @ 1
X: Type point0: IsPointed X Y: Type f: X -> Y p: point0 = point0
ap f p = ap f (ap (Susp_rec pt pt idmap) (merid p))
X: Type point0: IsPointed X Y: Type f: X -> Y p: point0 = point0
p = ap (Susp_rec pt pt idmap) (merid p)
X: Type point0: IsPointed X Y: Type f: X -> Y p: point0 = point0
ap (Susp_rec pt pt idmap) (merid p) = p
exact (Susp_rec_beta_merid _).
X: Type point0: IsPointed X Y: Type f: X -> Y
Susp_ind
(funy : Susp (point0 = point0) =>
(funx : Susp (point0 = point0) =>
f (Susp_rec pt pt idmap x)) y =
(funx : Susp (point0 = point0) =>
Susp_rec pt pt idmap
(functor_susp
(funp : point0 = point0 => 1 @ (ap f p @ 1))
x)) y)
(1
:
(funy : Susp (point0 = point0) =>
(funx : Susp (point0 = point0) =>
f (Susp_rec pt pt idmap x)) y =
(funx : Susp (point0 = point0) =>
Susp_rec pt pt idmap
(functor_susp
(funp : point0 = point0 => 1 @ (ap f p @ 1))
x)) y) North)
(1
:
(funy : Susp (point0 = point0) =>
(funx : Susp (point0 = point0) =>
f (Susp_rec pt pt idmap x)) y =
(funx : Susp (point0 = point0) =>
Susp_rec pt pt idmap
(functor_susp
(funp : point0 = point0 => 1 @ (ap f p @ 1))
x)) y) South)
((funp : point0 = point0 =>
internal_paths_rew_r
(funp0 : f (Susp_rec pt pt idmap South) =
Susp_rec pt pt idmap
(functor_susp
(funp0 : point0 = point0 =>
1 @ (ap f p0 @ 1)) South) =>
p0 = 1)
(internal_paths_rew_r
(funp0 : f (Susp_rec pt pt idmap North) =
f (Susp_rec pt pt idmap South) =>
(p0^ @ 1) @
ap
(funx : Susp (point0 = point0) =>
Susp_rec pt pt idmap
(functor_susp
(funp1 : point0 = point0 =>
1 @ (ap f p1 @ 1)) x))
(merid p) = 1)
(internal_paths_rew_r
(funp0 : f (Susp_rec pt pt idmap South) =
f (Susp_rec pt pt idmap North) =>
p0 @
ap
(funx : Susp (point0 = point0) =>
Susp_rec pt pt idmap
(functor_susp
(funp1 : point0 = point0 =>
1 @ (ap f p1 @ 1)) x))
(merid p) = 1)
(moveR_Vp
(ap
(funx : Susp (point0 = point0) =>
Susp_rec pt pt idmap
(functor_susp
(funp0 : point0 = point0 =>
1 @ (ap f p0 @ 1)) x))
(merid p)) 1
(ap f
(ap (Susp_rec pt pt idmap) (merid p)))
(ap_compose
(Susp_rec North South
(funx0 : point0 = point0 =>
merid (1 @ (ap f x0 @ 1))))
(Susp_rec pt pt idmap)
(merid p) @
internal_paths_rew_r
(funp0 :
Susp_rec North South
(funx0 : point0 = point0 =>
merid (1 @ ...)) North =
Susp_rec North South
(funx0 : point0 = point0 =>
merid (1 @ ...)) South =>
ap (Susp_rec pt pt idmap) p0 =
ap f
(ap
(Susp_rec pt pt idmap)
(merid p)) @ 1)
(internal_paths_rew_r
(funp0 :
Susp_rec pt pt idmap North =
Susp_rec pt pt idmap South =>
p0 =
ap f
(ap
(Susp_rec pt pt idmap)
(merid p)) @ 1)
(concat_1p (ap f p @ 1) @
ap11
(ap11 1
(ap11 1
(Susp_rec_beta_merid p)^)) 1)
(Susp_rec_beta_merid
(1 @ (ap f p @ 1))))
(Susp_rec_beta_merid p)))
(concat_p1
(ap f
(ap (Susp_rec pt pt idmap) (merid p)))^))
(ap_compose (Susp_rec pt pt idmap) f
(merid p)))
(transport_paths_FlFr (merid p) 1))
:
forallx : point0 = point0,
transport
(funy : Susp (point0 = point0) =>
(funx0 : Susp (point0 = point0) =>
f (Susp_rec pt pt idmap x0)) y =
(funx0 : Susp (point0 = point0) =>
Susp_rec pt pt idmap
(functor_susp
(funp : point0 = point0 =>
1 @ (ap f p @ 1)) x0)) y)
(merid x)
(1
:
(funy : Susp (point0 = point0) =>
(funx0 : Susp (point0 = point0) =>
f (Susp_rec pt pt idmap x0)) y =
(funx0 : Susp (point0 = point0) =>
Susp_rec pt pt idmap
(functor_susp
(funp : point0 = point0 =>
1 @ (ap f p @ 1)) x0)) y) North) =
(1
:
(funy : Susp (point0 = point0) =>
(funx0 : Susp (point0 = point0) =>
f (Susp_rec pt pt idmap x0)) y =
(funx0 : Susp (point0 = point0) =>
Susp_rec pt pt idmap
(functor_susp
(funp : point0 = point0 =>
1 @ (ap f p @ 1)) x0)) y) South)) pt = 1
reflexivity.Qed.(** Now the triangle identities *)
transport
(funy : Susp X =>
Susp_rec ispointed_susp ispointed_susp idmap
(functor_susp
(funx : X => merid x @ (merid pt)^) y) = y)
(merid x) 1 = merid pt
X: pType x: X
((ap (Susp_rec ispointed_susp ispointed_susp idmap)
(ap
(functor_susp
(funx : X => merid x @ (merid pt)^))
(merid x)))^ @ 1) @ merid x = merid pt
X: pType x: X
((ap (Susp_rec ispointed_susp ispointed_susp idmap)
(merid (merid x @ (merid pt)^)))^ @ 1) @ merid x =
merid pt
X: pType x: X
(ap (Susp_rec ispointed_susp ispointed_susp idmap)
(merid (merid x @ (merid pt)^)))^ =
merid pt @ (merid x)^
X: pType x: X
(merid x @ (merid pt)^)^ = merid pt @ (merid x)^
rewrite inv_pp, inv_V; reflexivity.Qed.(** Now we can finally construct the adjunction equivalence. *)
H: Funext A, B: pType
(psusp A ->** B) <~>* (A ->** loops B)
H: Funext A, B: pType
(psusp A ->** B) <~>* (A ->** loops B)
H: Funext A, B: pType
(psusp A ->** B) <~> (A ->** loops B)
H: Funext A, B: pType
?f pt = pt
H: Funext A, B: pType
(psusp A ->** B) <~> (A ->** loops B)
H: Funext A, B: pType
(funx : A ->* loops B =>
fmap loops (loop_susp_counit B o* fmap psusp x)
o* loop_susp_unit A) == idmap
H: Funext A, B: pType
(funx : psusp A $-> B =>
loop_susp_counit B
o* fmap psusp (fmap loops x o* loop_susp_unit A)) ==
idmap
H: Funext A, B: pType
(funx : A ->* loops B =>
fmap loops (loop_susp_counit B o* fmap psusp x)
o* loop_susp_unit A) == idmap
H: Funext A, B: pType g: A ->* loops B
fmap loops (loop_susp_counit B o* fmap psusp g)
o* loop_susp_unit A = g
H: Funext A, B: pType g: A ->* loops B
fmap loops (loop_susp_counit B o* fmap psusp g)
o* loop_susp_unit A ==* g
H: Funext A, B: pType g: A ->* loops B
fmap loops (loop_susp_counit B) $o
fmap loops (fmap psusp g) o* loop_susp_unit A ==* g
H: Funext A, B: pType g: A ->* loops B
fmap loops (loop_susp_counit B)
o* (fmap loops (fmap psusp g) o* loop_susp_unit A) ==*
g
H: Funext A, B: pType g: A ->* loops B
fmap loops (loop_susp_counit B)
o* (loop_susp_unit (loops B) o* g) ==* g
H: Funext A, B: pType g: A ->* loops B
fmap loops (loop_susp_counit B)
o* loop_susp_unit (loops B) o* g ==* g
H: Funext A, B: pType g: A ->* loops B
pmap_idmap o* g ==* g
apply pmap_postcompose_idmap.
H: Funext A, B: pType
(funx : psusp A $-> B =>
loop_susp_counit B
o* fmap psusp (fmap loops x o* loop_susp_unit A)) ==
idmap
H: Funext A, B: pType f: psusp A $-> B
loop_susp_counit B
o* fmap psusp (fmap loops f o* loop_susp_unit A) = f
H: Funext A, B: pType f: psusp A $-> B
loop_susp_counit B
o* fmap psusp (fmap loops f o* loop_susp_unit A) ==* f
H: Funext A, B: pType f: psusp A $-> B
loop_susp_counit B
o* (fmap psusp (fmap loops f) $o
fmap psusp (loop_susp_unit A)) ==* f
H: Funext A, B: pType f: psusp A $-> B
loop_susp_counit B o* fmap psusp (fmap loops f)
o* fmap psusp (loop_susp_unit A) ==* f
H: Funext A, B: pType f: psusp A $-> B
f o* loop_susp_counit (psusp A)
o* fmap psusp (loop_susp_unit A) ==* f
H: Funext A, B: pType f: psusp A $-> B
f
o* (loop_susp_counit (psusp A)
o* fmap psusp (loop_susp_unit A)) ==* f
H: Funext A, B: pType f: psusp A $-> B
f o* pmap_idmap ==* f
apply pmap_precompose_idmap.
H: Funext A, B: pType
equiv_adjointify
(funf : psusp A $-> B =>
fmap loops f o* loop_susp_unit A)
(fung : A ->* loops B =>
loop_susp_counit B o* fmap psusp g)
((fung : A ->* loops B =>
path_pforall
(pmap_prewhisker (loop_susp_unit A)
(fmap_comp loops (fmap psusp g)
(loop_susp_counit B)) @*
(pmap_compose_assoc
(fmap loops (loop_susp_counit B))
(fmap loops (fmap psusp g))
(loop_susp_unit A) @*
(pmap_postwhisker
(fmap loops (loop_susp_counit B))
(loop_susp_unit_natural g)^* @*
((pmap_compose_assoc
(fmap loops (loop_susp_counit B))
(loop_susp_unit (loops B)) g)^* @*
(pmap_prewhisker g (loop_susp_triangle1 B) @*
pmap_postcompose_idmap g))))))
:
(funx : A ->* loops B =>
fmap loops (loop_susp_counit B o* fmap psusp x)
o* loop_susp_unit A) == idmap)
((funf : psusp A $-> B =>
path_pforall
(pmap_postwhisker (loop_susp_counit B)
(fmap_comp psusp (loop_susp_unit A)
(fmap loops f)) @*
((pmap_compose_assoc (loop_susp_counit B)
(fmap psusp (fmap loops f))
(fmap psusp (loop_susp_unit A)))^* @*
(pmap_prewhisker
(fmap psusp (loop_susp_unit A))
(loop_susp_counit_natural f)^* @*
(pmap_compose_assoc f
(loop_susp_counit (psusp A))
(fmap psusp (loop_susp_unit A)) @*
(pmap_postwhisker f (loop_susp_triangle2 A) @*
pmap_precompose_idmap f))))))
:
(funx : psusp A $-> B =>
loop_susp_counit B
o* fmap psusp (fmap loops x o* loop_susp_unit A)) ==
idmap) pt = pt
H: Funext A, B: pType
equiv_adjointify
(funf : psusp A $-> B =>
fmap loops f o* loop_susp_unit A)
(fung : A ->* loops B =>
loop_susp_counit B o* fmap psusp g)
(fung : A ->* loops B =>
path_pforall
(pmap_prewhisker (loop_susp_unit A)
(fmap_comp loops (fmap psusp g)
(loop_susp_counit B)) @*
(pmap_compose_assoc
(fmap loops (loop_susp_counit B))
(fmap loops (fmap psusp g))
(loop_susp_unit A) @*
(pmap_postwhisker
(fmap loops (loop_susp_counit B))
(loop_susp_unit_natural g)^* @*
((pmap_compose_assoc
(fmap loops (loop_susp_counit B))
(loop_susp_unit (loops B)) g)^* @*
(pmap_prewhisker g (loop_susp_triangle1 B) @*
pmap_postcompose_idmap g))))))
(funf : psusp A $-> B =>
path_pforall
(pmap_postwhisker (loop_susp_counit B)
(fmap_comp psusp (loop_susp_unit A)
(fmap loops f)) @*
((pmap_compose_assoc (loop_susp_counit B)
(fmap psusp (fmap loops f))
(fmap psusp (loop_susp_unit A)))^* @*
(pmap_prewhisker
(fmap psusp (loop_susp_unit A))
(loop_susp_counit_natural f)^* @*
(pmap_compose_assoc f
(loop_susp_counit (psusp A))
(fmap psusp (loop_susp_unit A)) @*
(pmap_postwhisker f (loop_susp_triangle2 A) @*
pmap_precompose_idmap f)))))) pt ==* pt
H: Funext A, B: pType
fmap loops pt o* loop_susp_unit A ==* pt
H: Funext A, B: pType
pconst o* loop_susp_unit A ==* pt
tapply cat_zero_l.Defined.(** And its naturality is easy. *)
H: Funext A, B, B': pType f: psusp A ->* B g: B ->* B'
loop_susp_adjoint A B' (g o* f) ==*
fmap loops g o* loop_susp_adjoint A B f
H: Funext A, B, B': pType f: psusp A ->* B g: B ->* B'
loop_susp_adjoint A B' (g o* f) ==*
fmap loops g o* loop_susp_adjoint A B f
H: Funext A, B, B': pType f: psusp A ->* B g: B ->* B'
Build_pMap
(funp : ispointed_susp = ispointed_susp =>
(ap g (point_eq f) @ point_eq g)^ @
(ap (funx : Susp A => g (f x)) p @
(ap g (point_eq f) @ point_eq g)))
(whiskerL (ap g (point_eq f) @ point_eq g)^
(concat_1p (ap g (point_eq f) @ point_eq g)) @
concat_Vp (ap g (point_eq f) @ point_eq g))
o* loop_susp_unit A ==*
Build_pMap
(funp : pt = pt =>
(point_eq g)^ @ (ap g p @ point_eq g))
(whiskerL (point_eq g)^ (concat_1p (point_eq g)) @
concat_Vp (point_eq g))
o* (Build_pMap
(funp : ispointed_susp = ispointed_susp =>
(point_eq f)^ @ (ap f p @ point_eq f))
(whiskerL (point_eq f)^ (concat_1p (point_eq f)) @
concat_Vp (point_eq f)) o* loop_susp_unit A)
H: Funext A, B, B': pType f: psusp A ->* B g: B ->* B'
Build_pMap
(funp : ispointed_susp = ispointed_susp =>
(ap g (point_eq f) @ point_eq g)^ @
(ap (funx : Susp A => g (f x)) p @
(ap g (point_eq f) @ point_eq g)))
(whiskerL (ap g (point_eq f) @ point_eq g)^
(concat_1p (ap g (point_eq f) @ point_eq g)) @
concat_Vp (ap g (point_eq f) @ point_eq g))
o* loop_susp_unit A ==*
Build_pMap
(funp : pt = pt =>
(point_eq g)^ @ (ap g p @ point_eq g))
(whiskerL (point_eq g)^ (concat_1p (point_eq g)) @
concat_Vp (point_eq g))
o* Build_pMap
(funp : ispointed_susp = ispointed_susp =>
(point_eq f)^ @ (ap f p @ point_eq f))
(whiskerL (point_eq f)^ (concat_1p (point_eq f)) @
concat_Vp (point_eq f)) o* loop_susp_unit A
H: Funext A, B, B': pType f: psusp A ->* B g: B ->* B'
Build_pMap
(funp : ispointed_susp = ispointed_susp =>
(ap g (point_eq f) @ point_eq g)^ @
(ap (funx : Susp A => g (f x)) p @
(ap g (point_eq f) @ point_eq g)))
(whiskerL (ap g (point_eq f) @ point_eq g)^
(concat_1p (ap g (point_eq f) @ point_eq g)) @
concat_Vp (ap g (point_eq f) @ point_eq g)) ==*
Build_pMap
(funp : pt = pt =>
(point_eq g)^ @ (ap g p @ point_eq g))
(whiskerL (point_eq g)^ (concat_1p (point_eq g)) @
concat_Vp (point_eq g))
o* Build_pMap
(funp : ispointed_susp = ispointed_susp =>
(point_eq f)^ @ (ap f p @ point_eq f))
(whiskerL (point_eq f)^ (concat_1p (point_eq f)) @
concat_Vp (point_eq f))
exact (fmap_comp loops f g).Defined.
H: Funext A, A', B: pType f: A ->* loops B g: A' ->* A
(loop_susp_adjoint A' B)^-1 (f o* g) ==*
(loop_susp_adjoint A B)^-1 f o* fmap psusp g
H: Funext A, A', B: pType f: A ->* loops B g: A' ->* A
(loop_susp_adjoint A' B)^-1 (f o* g) ==*
(loop_susp_adjoint A B)^-1 f o* fmap psusp g
H: Funext A, A', B: pType f: A ->* loops B g: A' ->* A
loop_susp_counit B
o* Build_pMap (functor_susp (funx : A' => f (g x))) 1 ==*
loop_susp_counit B o* Build_pMap (functor_susp f) 1
o* Build_pMap (functor_susp g) 1
H: Funext A, A', B: pType f: A ->* loops B g: A' ->* A
loop_susp_counit B
o* Build_pMap (functor_susp (funx : A' => f (g x))) 1 ==*
loop_susp_counit B
o* (Build_pMap (functor_susp f) 1
o* Build_pMap (functor_susp g) 1)
H: Funext A, A', B: pType f: A ->* loops B g: A' ->* A
Build_pMap (functor_susp (funx : A' => f (g x))) 1 ==*
Build_pMap (functor_susp f) 1
o* Build_pMap (functor_susp g) 1
exact (fmap_comp psusp g f).Defined.
H: Funext A: pType
Is1Natural (opyon (psusp A)) (opyon A o loops)
(funB : pType => loop_susp_adjoint A B)
H: Funext A: pType
Is1Natural (opyon (psusp A)) (opyon A o loops)
(funB : pType => loop_susp_adjoint A B)
H: Funext A: pType
forall (aa' : pType) (f : a $-> a'),
(funB : pType => pointed_fun (loop_susp_adjoint A B))
a' $o fmap (opyon (psusp A)) f $==
fmap (opyon A o loops) f $o
(funB : pType => pointed_fun (loop_susp_adjoint A B))
a
H: Funext A, B, B': pType g: B $-> B' f: opyon (psusp A) B
(loop_susp_adjoint A B' $o fmap (opyon (psusp A)) g) f =
(fmap (opyon A o loops) g $o loop_susp_adjoint A B) f
H: Funext A, B, B': pType g: B $-> B' f: opyon (psusp A) B
(loop_susp_adjoint A B' $o fmap (opyon (psusp A)) g) f =
fmap loops g $o fmap loops f $o loop_susp_unit A
H: Funext A, B, B': pType g: B $-> B' f: opyon (psusp A) B
fmap loops (fmap (opyon (psusp A)) g f) =
fmap loops g $o fmap loops f
H: Funext A, B, B': pType g: B $-> B' f: opyon (psusp A) B
fmap loops (fmap (opyon (psusp A)) g f) ==*
fmap loops g $o fmap loops f