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.From HoTT Require Import Basics.Require Import Types.From HoTT.WildCat Require Import Core UniversePointedCat NatTrans Yoneda.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
(funp0 : functor_susp f South = functor_susp g South => p0 = 1)
(internal_paths_rew_r
(funp0 : functor_susp f South = functor_susp f North =>
p0 @ ap (functor_susp g) (merid x) = 1)
(internal_paths_rew_r
(funp0 : Susp_rec North South (funx0 : X => merid (f x0)) North =
Susp_rec North South (funx0 : X => merid (f x0)) South =>
p0^ @ ap (functor_susp g) (merid x) = 1)
(internal_paths_rew_r
(funp0 : Susp_rec North South (funx0 : X => merid (g x0))
North =
Susp_rec North South (funx0 : X => merid (g x0))
South =>
(merid (f x))^ @ p0 = 1)
(letp0 := p x inlety := g x inmatch
p0 in (_ = y0) return ((merid (f x))^ @ 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 (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
((ap (functor_susp (funx0 : a => g (f x0))) (merid x))^ @ 1) @
ap (funx0 : Susp a => functor_susp g (functor_susp f x0)) (merid x) = 1
a, b, c: Type f: a -> b g: b -> c x: a
ap (funx0 : Susp a => functor_susp g (functor_susp f x0)) (merid x) =
ap (functor_susp (funx0 : a => g (f x0))) (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 (funx0 : b => merid (g x0))
North =
Susp_rec North South (funx0 : b => merid (g x0))
South =>
p =
ap (functor_susp (funx0 : a => g (f x0))) (merid x))
(internal_paths_rew_r
(funp : Susp_rec North South
(funx0 : a => merid (g (f x0))) North =
Susp_rec North South
(funx0 : a => merid (g (f x0))) South =>
merid (g (f x)) = 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 (funp0 : point0 = point0 => 1 @ (ap f p0 @ 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 (funp0 : point0 = point0 => 1 @ (ap f p0 @ 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 (funp0 : point0 = point0 => 1 @ (ap f p0 @ 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 @ (ap f x0 @ 1)))
North =
Susp_rec North South
(funx0 : point0 = point0 =>
merid (1 @ (ap f x0 @ 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 (funx0 : X => merid x0 @ (merid pt)^) y) =
y)
(merid x) 1 =
merid pt
X: pType x: X
((ap (Susp_rec ispointed_susp ispointed_susp idmap)
(ap (functor_susp (funx0 : X => merid x0 @ (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
(phomotopy_transitive'
(fmap loops (loop_susp_counit B o* fmap psusp g) o* loop_susp_unit A)
(fmap loops (loop_susp_counit B) $o fmap loops (fmap psusp g)
o* loop_susp_unit A)
g
(pmap_prewhisker (loop_susp_unit A)
(fmap_comp loops (fmap psusp g) (loop_susp_counit B)))
(phomotopy_transitive'
(fmap loops (loop_susp_counit B) $o fmap loops (fmap psusp g)
o* loop_susp_unit A)
(fmap loops (loop_susp_counit B)
o* (fmap loops (fmap psusp g) o* loop_susp_unit A))
g
(pmap_compose_assoc (fmap loops (loop_susp_counit B))
(fmap loops (fmap psusp g)) (loop_susp_unit A))
(phomotopy_transitive'
(fmap loops (loop_susp_counit B)
o* (fmap loops (fmap psusp g) o* loop_susp_unit A))
(fmap loops (loop_susp_counit B)
o* (loop_susp_unit (loops B) o* g))
g
(pmap_postwhisker (fmap loops (loop_susp_counit B))
(loop_susp_unit_natural g)^*)
(phomotopy_transitive'
(fmap loops (loop_susp_counit B)
o* (loop_susp_unit (loops B) o* g))
(fmap loops (loop_susp_counit B)
o* loop_susp_unit (loops B) o* g)
g
(phomotopy_symmetric'
(fmap loops (loop_susp_counit B)
o* loop_susp_unit (loops B) o* g)
(fmap loops (loop_susp_counit B)
o* (loop_susp_unit (loops B) o* g))
(pmap_compose_assoc (fmap loops (loop_susp_counit B))
(loop_susp_unit (loops B)) g))
(phomotopy_transitive'
(fmap loops (loop_susp_counit B)
o* loop_susp_unit (loops B) o* g)
(pmap_idmap o* g) 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
(phomotopy_transitive'
(loop_susp_counit B o* fmap psusp (fmap loops f o* loop_susp_unit A))
(loop_susp_counit B
o* (fmap psusp (fmap loops f) $o fmap psusp (loop_susp_unit A)))
f
(pmap_postwhisker (loop_susp_counit B)
(fmap_comp psusp (loop_susp_unit A) (fmap loops f)))
(phomotopy_transitive'
(loop_susp_counit B
o* (fmap psusp (fmap loops f) $o fmap psusp (loop_susp_unit A)))
(loop_susp_counit B o* fmap psusp (fmap loops f)
o* fmap psusp (loop_susp_unit A))
f
(phomotopy_symmetric'
(loop_susp_counit B o* fmap psusp (fmap loops f)
o* fmap psusp (loop_susp_unit A))
(loop_susp_counit B
o* (fmap psusp (fmap loops f) $o
fmap psusp (loop_susp_unit A)))
(pmap_compose_assoc (loop_susp_counit B)
(fmap psusp (fmap loops f)) (fmap psusp (loop_susp_unit A))))
(phomotopy_transitive'
(loop_susp_counit B o* fmap psusp (fmap loops f)
o* fmap psusp (loop_susp_unit A))
(f o* loop_susp_counit (psusp A)
o* fmap psusp (loop_susp_unit A))
f
(pmap_prewhisker (fmap psusp (loop_susp_unit A))
(loop_susp_counit_natural f)^*)
(phomotopy_transitive'
(f o* loop_susp_counit (psusp A)
o* fmap psusp (loop_susp_unit A))
(f
o* (loop_susp_counit (psusp A)
o* fmap psusp (loop_susp_unit A)))
f
(pmap_compose_assoc f (loop_susp_counit (psusp A))
(fmap psusp (loop_susp_unit A)))
(phomotopy_transitive'
(f
o* (loop_susp_counit (psusp A)
o* fmap psusp (loop_susp_unit A)))
(f o* pmap_idmap) f
(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
(phomotopy_transitive'
(fmap loops (loop_susp_counit B o* fmap psusp g) o* loop_susp_unit A)
(fmap loops (loop_susp_counit B) $o fmap loops (fmap psusp g)
o* loop_susp_unit A)
g
(pmap_prewhisker (loop_susp_unit A)
(fmap_comp loops (fmap psusp g) (loop_susp_counit B)))
(phomotopy_transitive'
(fmap loops (loop_susp_counit B) $o fmap loops (fmap psusp g)
o* loop_susp_unit A)
(fmap loops (loop_susp_counit B)
o* (fmap loops (fmap psusp g) o* loop_susp_unit A))
g
(pmap_compose_assoc (fmap loops (loop_susp_counit B))
(fmap loops (fmap psusp g)) (loop_susp_unit A))
(phomotopy_transitive'
(fmap loops (loop_susp_counit B)
o* (fmap loops (fmap psusp g) o* loop_susp_unit A))
(fmap loops (loop_susp_counit B)
o* (loop_susp_unit (loops B) o* g))
g
(pmap_postwhisker (fmap loops (loop_susp_counit B))
(loop_susp_unit_natural g)^*)
(phomotopy_transitive'
(fmap loops (loop_susp_counit B)
o* (loop_susp_unit (loops B) o* g))
(fmap loops (loop_susp_counit B) o* loop_susp_unit (loops B)
o* g)
g
(phomotopy_symmetric'
(fmap loops (loop_susp_counit B)
o* loop_susp_unit (loops B) o* g)
(fmap loops (loop_susp_counit B)
o* (loop_susp_unit (loops B) o* g))
(pmap_compose_assoc (fmap loops (loop_susp_counit B))
(loop_susp_unit (loops B)) g))
(phomotopy_transitive'
(fmap loops (loop_susp_counit B)
o* loop_susp_unit (loops B) o* g)
(pmap_idmap o* g) g
(pmap_prewhisker g (loop_susp_triangle1 B))
(pmap_postcompose_idmap g)))))))
(funf : psusp A $-> B =>
path_pforall
(phomotopy_transitive'
(loop_susp_counit B o* fmap psusp (fmap loops f o* loop_susp_unit A))
(loop_susp_counit B
o* (fmap psusp (fmap loops f) $o fmap psusp (loop_susp_unit A)))
f
(pmap_postwhisker (loop_susp_counit B)
(fmap_comp psusp (loop_susp_unit A) (fmap loops f)))
(phomotopy_transitive'
(loop_susp_counit B
o* (fmap psusp (fmap loops f) $o fmap psusp (loop_susp_unit A)))
(loop_susp_counit B o* fmap psusp (fmap loops f)
o* fmap psusp (loop_susp_unit A))
f
(phomotopy_symmetric'
(loop_susp_counit B o* fmap psusp (fmap loops f)
o* fmap psusp (loop_susp_unit A))
(loop_susp_counit B
o* (fmap psusp (fmap loops f) $o fmap psusp (loop_susp_unit A)))
(pmap_compose_assoc (loop_susp_counit B)
(fmap psusp (fmap loops f)) (fmap psusp (loop_susp_unit A))))
(phomotopy_transitive'
(loop_susp_counit B o* fmap psusp (fmap loops f)
o* fmap psusp (loop_susp_unit A))
(f o* loop_susp_counit (psusp A)
o* fmap psusp (loop_susp_unit A))
f
(pmap_prewhisker (fmap psusp (loop_susp_unit A))
(loop_susp_counit_natural f)^*)
(phomotopy_transitive'
(f o* loop_susp_counit (psusp A)
o* fmap psusp (loop_susp_unit A))
(f
o* (loop_susp_counit (psusp A)
o* fmap psusp (loop_susp_unit A)))
f
(pmap_compose_assoc f (loop_susp_counit (psusp A))
(fmap psusp (loop_susp_unit A)))
(phomotopy_transitive'
(f
o* (loop_susp_counit (psusp A)
o* fmap psusp (loop_susp_unit A)))
(f o* pmap_idmap) f
(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