Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.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 Pointed.Core. Require Import Pointed.Loops. Require Import Pointed.pTrunc. Require Import Pointed.pEquiv. Require Import Homotopy.Suspension. Require Import Homotopy.Freudenthal. Require Import Truncations. Require Import WildCat. Generalizable Variables X A B f g n. Local Open Scope path_scope. Local Open Scope pointed_scope. (** ** Pointedness of [Susp] and path spaces thereof *) (** We arbitrarily choose [North] to be the point. *) Global Instance ispointed_susp {X : Type} : IsPointed (Susp X) | 0 := North. Global Instance ispointed_path_susp `{IsPointed X} : IsPointed (North = South :> Susp X) | 0 := merid (point X). Global Instance ispointed_path_susp' `{IsPointed X} : IsPointed (South = North :> Susp X) | 0 := (merid (point X))^. Definition psusp (X : Type) : pType := [Susp X, _]. (** ** Suspension Functor *) (** [psusp] has a functorial action. *) (** TODO: make this a displayed functor *) Global Instance is0functor_psusp : Is0Functor psusp := Build_Is0Functor _ _ _ _ psusp (fun X Y f => Build_pMap (psusp X) (psusp Y) (functor_susp f) 1). (** [psusp] is a 1-functor. *)

Is1Functor psusp

Is1Functor psusp

forall (a b : Type) (f g : a $-> b), f $== g -> fmap psusp f $== fmap psusp g

forall a : Type, fmap psusp (Id a) $== Id (psusp a)

forall (a b c : Type) (f : a $-> b) (g : b $-> c), fmap psusp (g $o f) $== fmap psusp g $o fmap psusp f
(** Action on 2-cells *)

forall (a b : Type) (f g : a $-> b), f $== g -> fmap psusp f $== fmap psusp g
X, Y: Type
f, g: X $-> Y
p: f $== g

fmap psusp f $== fmap psusp g
X, Y: Type
f, g: X -> Y
p: f == g

Build_pMap (psusp X) (psusp Y) (functor_susp f) 1 ==* Build_pMap (psusp X) (psusp Y) (functor_susp g) 1
X, Y: Type
f, g: X -> Y
p: f == g

Build_pMap (psusp X) (psusp Y) (functor_susp f) 1 == Build_pMap (psusp X) (psusp Y) (functor_susp g) 1
X, Y: Type
f, g: X -> Y
p: f == g
?p pt = dpoint_eq (Build_pMap (psusp X) (psusp Y) (functor_susp f) 1) @ (dpoint_eq (Build_pMap (psusp X) (psusp Y) (functor_susp g) 1))^
X, Y: Type
f, g: X -> Y
p: f == g

Build_pMap (psusp X) (psusp Y) (functor_susp f) 1 == Build_pMap (psusp X) (psusp Y) (functor_susp g) 1
X, Y: Type
f, g: X -> Y
p: f == g

functor_susp f == functor_susp g
X, Y: Type
f, g: X -> Y
p: f == g

(fun y : Susp X => functor_susp f y = functor_susp g y) North
X, Y: Type
f, g: X -> Y
p: f == g
(fun y : Susp X => functor_susp f y = functor_susp g y) South
X, Y: Type
f, g: X -> Y
p: f == g
forall x : X, transport (fun y : Susp X => functor_susp f y = functor_susp g y) (merid x) ?H_N = ?H_S
X, Y: Type
f, g: X -> Y
p: f == g

forall x : X, transport (fun y : Susp X => functor_susp f y = functor_susp g y) (merid x) 1 = 1
X, Y: Type
f, g: X -> Y
p: f == g
x: X

transport (fun y : Susp X => functor_susp f y = functor_susp g y) (merid x) 1 = 1
X, Y: Type
f, g: X -> Y
p: f == g
x: X

((ap (functor_susp f) (merid x))^ @ 1) @ ap (functor_susp g) (merid x) = 1
X, Y: Type
f, g: X -> Y
p: f == g
x: X

(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 (fun y : Susp X => functor_susp f y = functor_susp g y) 1 1 (fun x : X => internal_paths_rew_r (fun p : functor_susp f South = functor_susp g South => p = 1) (internal_paths_rew_r (fun p : functor_susp f South = functor_susp f North => p @ ap (functor_susp g) (merid x) = 1) (internal_paths_rew_r (fun p : Susp_rec North South (fun x0 : X => merid (f x0)) North = Susp_rec North South (fun x0 : X => merid (f x0)) South => p^ @ ap (functor_susp g) (merid x) = 1) (internal_paths_rew_r (fun p : Susp_rec North South (fun x0 : X => merid (g x0)) North = Susp_rec North South (fun x0 : X => merid (g x0)) South => (merid (f x))^ @ p = 1) (let p0 := p x in let y := g x in match 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 (fun y : Susp X => functor_susp f y = functor_susp g y) (merid x) 1 = 1) : Build_pMap (psusp X) (psusp Y) (functor_susp f) 1 == Build_pMap (psusp X) (psusp Y) (functor_susp g) 1) pt = dpoint_eq (Build_pMap (psusp X) (psusp Y) (functor_susp f) 1) @ (dpoint_eq (Build_pMap (psusp X) (psusp Y) (functor_susp g) 1))^
reflexivity. (** Preservation of identity. *)

forall a : 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

forall x : X, transport (fun y : Susp X => fmap psusp (Id X) y = Id (psusp X) y) (merid x) 1 = 1
X: Type
x: X

transport (fun y : 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
by rewrite ap_idmap, Susp_rec_beta_merid, concat_p1, concat_Vp.
X: Type

Susp_ind (fun y : Susp X => fmap psusp (Id X) y = Id (psusp X) y) 1 1 (fun x : X => transport_paths_FFlr (merid x) 1 @ internal_paths_rew_r (fun p : North = Id (psusp X) South => ((ap (fmap psusp (Id X)) p)^ @ 1) @ merid x = 1) (internal_paths_rew_r (fun p : Susp_rec North South (fun x0 : X => merid (Id X x0)) North = Susp_rec North South (fun x0 : X => merid (Id X x0)) South => (p^ @ 1) @ merid x = 1) (internal_paths_rew_r (fun p : fmap psusp (Id X) (Id (psusp X) South) = fmap psusp (Id X) North => p @ merid x = 1) (internal_paths_rew_r (fun p : 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 (a b c : 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 (fun x : a => g (f x)) == (fun x : 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 (fun x : a => g (f x)) == (fun x : Susp a => functor_susp g (functor_susp f x))
a, b, c: Type
f: a -> b
g: b -> c

forall x : a, transport (fun y : Susp a => functor_susp (fun x0 : 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 (fun y : Susp a => functor_susp (fun x : 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 (fun x : a => g (f x))) (merid x))^ @ 1) @ ap (fun x : 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 (fun x : Susp a => functor_susp g (functor_susp f x)) (merid x) = ap (functor_susp (fun x : a => g (f x))) (merid x) @ 1
by rewrite concat_p1, ap_compose, !Susp_rec_beta_merid.
a, b, c: Type
f: a -> b
g: b -> c

Susp_ind (fun y : Susp a => functor_susp (fun x : a => g (f x)) y = (fun x : Susp a => functor_susp g (functor_susp f x)) y) 1 1 ((fun x : a => transport_paths_FlFr (merid x) 1 @ internal_paths_rew_r (fun p : functor_susp (fun x0 : a => g (f x0)) South = functor_susp (fun x0 : a => g (f x0)) North => p @ ap (fun x0 : Susp a => functor_susp g (functor_susp f x0)) (merid x) = 1) (moveR_Vp (ap (fun x0 : Susp a => functor_susp g (functor_susp f x0)) (merid x)) 1 (ap (functor_susp (fun x0 : a => g (f x0))) (merid x)) (internal_paths_rew_r (fun p : functor_susp g (functor_susp f North) = functor_susp (fun x0 : a => g (f x0)) South => ap (fun x0 : Susp a => functor_susp g (functor_susp f x0)) (merid x) = p) (internal_paths_rew_r (fun p : functor_susp g (functor_susp f North) = functor_susp g (functor_susp f South) => p = ap (functor_susp (fun x0 : a => g (f x0))) (merid x)) (internal_paths_rew_r (fun p : Susp_rec North South (fun x0 : a => merid (f x0)) North = Susp_rec North South (fun x0 : a => merid (f x0)) South => ap (functor_susp g) p = ap (functor_susp (fun x0 : a => g (f x0))) (merid x)) (internal_paths_rew_r (fun p : 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 (fun p : 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 (fun x0 : a => g (f x0))) (merid x))))) (concat_p1 (ap (functor_susp (fun x0 : a => g (f x0))) (merid x))^)) : forall x : a, transport (fun y : Susp a => functor_susp (fun x0 : a => g (f x0)) y = (fun x0 : Susp a => functor_susp g (functor_susp f x0)) y) (merid x) 1 = 1) ispointed_susp = 1
reflexivity. Defined. (** ** Loop-Suspension Adjunction *) Module Book_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. *) srefine (Build_pHomotopy _ _). - intros a. simpl. refine (_ @ (concat_1p _)^). refine (_ @ (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. >> *) End Book_Loop_Susp_Adjunction. (** Thus, instead we will construct the adjunction in terms of a unit and counit natural transformation. *) Definition loop_susp_unit (X : pType) : X ->* loops (psusp X) := Build_pMap X (loops (psusp X)) (fun x => merid x @ (merid (point X))^) (concat_pV _). (** By Freudenthal, we have that this map is (2n+2)-connected when [X] is (n+1)-connected. *)
H: Univalence
n: trunc_index
X: pType
H0: IsConnected (Tr n.+1) X

IsConnMap (Tr (n +2+ n)) (loop_susp_unit X)
H: Univalence
n: trunc_index
X: pType
H0: IsConnected (Tr n.+1) X

IsConnMap (Tr (n +2+ n)) (loop_susp_unit X)
refine (conn_map_compose _ merid (equiv_concat_r (merid pt)^ _)). Defined. (** We also have this corollary: *)
H: Univalence
X: pType
n: trunc_index
H0: IsConnected (Tr n.+1) X

pTr (n +2+ n) X <~>* pTr (n +2+ n) (loops (psusp X))
H: Univalence
X: pType
n: trunc_index
H0: IsConnected (Tr n.+1) X

pTr (n +2+ n) X <~>* pTr (n +2+ n) (loops (psusp X))
H: Univalence
X: pType
n: trunc_index
H0: IsConnected (Tr n.+1) X

pTr (n +2+ n) X ->* pTr (n +2+ n) (loops (psusp X))
H: Univalence
X: pType
n: trunc_index
H0: IsConnected (Tr n.+1) X
IsEquiv ?pointed_equiv_fun
H: Univalence
X: pType
n: trunc_index
H0: IsConnected (Tr n.+1) X

IsEquiv (fmap (pTr (n +2+ n)) (loop_susp_unit X))
rapply O_inverts_conn_map. Defined.
X, Y: pType
f: X ->* Y

loop_susp_unit Y o* f ==* fmap loops (fmap psusp f) o* loop_susp_unit X
X, Y: pType
f: X ->* Y

loop_susp_unit Y o* f ==* fmap loops (fmap psusp f) o* loop_susp_unit X
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

loop_susp_unit [Y, f point0] o* {| pointed_fun := f; dpoint_eq := 1 |} ==* Build_pMap (loops (psusp X)) (loops (psusp Y)) (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) 1 o* loop_susp_unit [X, point0]
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

(fun x : X => merid (f x) @ (merid (f point0))^) == (fun x : X => 1 @ (ap (functor_susp f) (merid x @ (merid point0)^) @ 1))
X: Type
point0: IsPointed X
Y: Type
f: X -> Y
?Goal point0 = (1 @ concat_pV (merid (f point0))) @ (ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) (concat_pV (merid point0)) @ 1)^
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

(fun x : X => merid (f x) @ (merid (f point0))^) == (fun x : X => 1 @ (ap (functor_susp f) (merid x @ (merid point0)^) @ 1))
X: Type
point0: IsPointed X
Y: Type
f: X -> Y
x: X

1 @ (ap (functor_susp f) (merid x @ (merid point0)^) @ 1) = merid (f x) @ (merid (f point0))^
X: Type
point0: IsPointed X
Y: Type
f: X -> Y
x: X

ap (functor_susp f) (merid x @ (merid point0)^) = merid (f x) @ (merid (f point0))^
X: Type
point0: IsPointed X
Y: Type
f: X -> Y
x: X

ap (Susp_rec North South (fun x : X => merid (f x))) (merid x) @ ap (Susp_rec North South (fun x : X => merid (f x))) (merid pt)^ = merid (f x) @ (merid (f point0))^
X: Type
point0: IsPointed X
Y: Type
f: X -> Y
x: X

ap (Susp_rec North South (fun x : X => merid (f x))) (merid x) @ (ap (Susp_rec North South (fun x : X => merid (f x))) (merid pt))^ = merid (f x) @ (merid (f point0))^
refine (Susp_rec_beta_merid _ @@ inverse2 (Susp_rec_beta_merid _)).
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

((fun x : X => (concat_1p (ap (functor_susp f) (merid x @ (merid point0)^) @ 1) @ (concat_p1 (ap (functor_susp f) (merid x @ (merid point0)^)) @ (ap_pp (Susp_rec North South (merid o f)) (merid x) (merid pt)^ @ ((1 @@ ap_V (Susp_rec North South (fun x0 : X => merid (f x0))) (merid pt)) @ (Susp_rec_beta_merid x @@ inverse2 (Susp_rec_beta_merid pt))))))^) : (fun x : X => merid (f x) @ (merid (f point0))^) == (fun x : X => 1 @ (ap (functor_susp f) (merid x @ (merid point0)^) @ 1))) point0 = (1 @ concat_pV (merid (f point0))) @ (ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) (concat_pV (merid point0)) @ 1)^
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

(concat_1p (ap (functor_susp f) (merid point0 @ (merid point0)^) @ 1) @ (concat_p1 (ap (functor_susp f) (merid point0 @ (merid point0)^)) @ (ap_pp (Susp_rec North South (fun x : X => merid (f x))) (merid point0) (merid pt)^ @ ((1 @@ ap_V (Susp_rec North South (fun x : X => merid (f x))) (merid pt)) @ (Susp_rec_beta_merid point0 @@ inverse2 (Susp_rec_beta_merid pt))))))^ = (1 @ concat_pV (merid (f point0))) @ (ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) (concat_pV (merid point0)) @ 1)^
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

(concat_1p (ap (functor_susp f) (merid point0 @ (merid point0)^) @ 1) @ (concat_p1 (ap (functor_susp f) (merid point0 @ (merid point0)^)) @ (ap_pp (Susp_rec North South (fun x : X => merid (f x))) (merid point0) (merid pt)^ @ ((1 @@ ap_V (Susp_rec North South (fun x : X => merid (f x))) (merid pt)) @ (Susp_rec_beta_merid point0 @@ inverse2 (Susp_rec_beta_merid pt))))))^ @ (ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) (concat_pV (merid point0)) @ 1) = 1 @ concat_pV (merid (f point0))
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

concat_pV (merid (f point0)) = (Susp_rec_beta_merid point0 @@ inverse2 (Susp_rec_beta_merid pt))^ @ ((1 @@ ap_V (Susp_rec North South (fun x : X => merid (f x))) (merid pt))^ @ ((ap_pp (Susp_rec North South (fun x : X => merid (f x))) (merid point0) (merid pt)^)^ @ ((concat_p1 (ap (functor_susp f) (merid point0 @ (merid point0)^)))^ @ ((concat_1p (ap (functor_susp f) (merid point0 @ (merid point0)^) @ 1))^ @ (ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) (concat_pV (merid point0)) @ 1)))))
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

(Susp_rec_beta_merid point0 @@ inverse2 (Susp_rec_beta_merid pt)) @ concat_pV (merid (f point0)) = (1 @@ ap_V (Susp_rec North South (fun x : X => merid (f x))) (merid pt))^ @ ((ap_pp (Susp_rec North South (fun x : X => merid (f x))) (merid point0) (merid pt)^)^ @ ((concat_p1 (ap (functor_susp f) (merid point0 @ (merid point0)^)))^ @ ((concat_1p (ap (functor_susp f) (merid point0 @ (merid point0)^) @ 1))^ @ (ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) (concat_pV (merid point0)) @ 1))))
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

concat_pV (ap (Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x))) (merid pt)) = (1 @@ ap_V (Susp_rec North South (fun x : X => merid (f x))) (merid pt))^ @ ((ap_pp (Susp_rec North South (fun x : X => merid (f x))) (merid point0) (merid pt)^)^ @ ((concat_p1 (ap (functor_susp f) (merid point0 @ (merid point0)^)))^ @ ((concat_1p (ap (functor_susp f) (merid point0 @ (merid point0)^) @ 1))^ @ (ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) (concat_pV (merid point0)) @ 1))))
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

ap_pp (Susp_rec North South (fun x : X => merid (f x))) (merid point0) (merid pt)^ @ ((1 @@ ap_V (Susp_rec North South (fun x : X => merid (f x))) (merid pt)) @ concat_pV (ap (Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x))) (merid pt))) = (concat_p1 (ap (functor_susp f) (merid point0 @ (merid point0)^)))^ @ ((concat_1p (ap (functor_susp f) (merid point0 @ (merid point0)^) @ 1))^ @ (ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) (concat_pV (merid point0)) @ 1))
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

ap (ap (Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)))) (concat_pV (merid point0)) = (concat_p1 (ap (functor_susp f) (merid point0 @ (merid point0)^)))^ @ ((concat_1p (ap (functor_susp f) (merid point0 @ (merid point0)^) @ 1))^ @ (ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) (concat_pV (merid point0)) @ 1))
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

concat_1p (ap (functor_susp f) (merid point0 @ (merid point0)^) @ 1) @ (concat_p1 (ap (functor_susp f) (merid point0 @ (merid point0)^)) @ ap (ap (Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)))) (concat_pV (merid point0))) = ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) (concat_pV (merid point0)) @ 1
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

ap (fun p' : Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North = Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North => 1 @ p') (ap (fun p' : Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North = Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North => p' @ 1) (ap (ap (Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)))) (concat_pV (merid point0)))) = ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) (concat_pV (merid point0)) @ 1
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) (concat_pV (merid point0)) @ 1 = ap (fun p' : Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North = Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North => 1 @ p') (ap (fun p' : Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North = Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North => p' @ 1) (ap (ap (Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)))) (concat_pV (merid point0))))
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (functor_susp f) p @ 1)) (concat_pV (merid point0)) = ap (fun p' : Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North = Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North => 1 @ p') (ap (fun p' : Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North = Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North => p' @ 1) (ap (ap (Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)))) (concat_pV (merid point0))))
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

ap (fun p' : Susp_rec North South (fun x : X => merid (f x)) North = Susp_rec North South (fun x : X => merid (f x)) North => 1 @ p') (ap (fun p' : North = North => ap (Susp_rec North South (fun x : X => merid (f x))) p' @ 1) (concat_pV (merid pt))) = ap (fun p' : Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North = Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North => 1 @ p') (ap (fun p' : Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North = Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North => p' @ 1) (ap (ap (Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)))) (concat_pV (merid point0))))
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

ap (fun p' : North = North => ap (Susp_rec North South (fun x : X => merid (f x))) p' @ 1) (concat_pV (merid pt)) = ap (fun p' : Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North = Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)) North => p' @ 1) (ap (ap (Susp_rec (GraphQuotient.GraphQuotient.gq (inl tt)) South (fun x : X => merid (f x)))) (concat_pV (merid point0)))
refine (ap_compose (ap (Susp_rec North South (merid o f))) (fun p' => p' @ 1) _). Qed. Definition loop_susp_counit (X : pType) : psusp (loops X) ->* X := Build_pMap (psusp (loops X)) X (Susp_rec (point X) (point X) idmap) 1.
X, Y: pType
f: X ->* Y

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 (psusp (point0 = point0)) (psusp (f point0 = f point0)) (functor_susp (fun p : point0 = point0 => 1 @ (ap f p @ 1))) 1
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

(fun x : Susp (point0 = point0) => f (Susp_rec pt pt idmap x)) == (fun x : Susp (point0 = point0) => Susp_rec pt pt idmap (functor_susp (fun p : 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

(fun x : Susp (point0 = point0) => f (Susp_rec pt pt idmap x)) == (fun x : Susp (point0 = point0) => Susp_rec pt pt idmap (functor_susp (fun p : point0 = point0 => 1 @ (ap f p @ 1)) x))
X: Type
point0: IsPointed X
Y: Type
f: X -> Y
p: point0 = point0

transport (fun y : Susp (point0 = point0) => f (Susp_rec pt pt idmap y) = Susp_rec pt pt idmap (functor_susp (fun p : 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 (fun x : Susp (point0 = point0) => Susp_rec pt pt idmap (functor_susp (fun p : 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 (fun x : Susp (point0 = point0) => Susp_rec pt pt idmap (functor_susp (fun p : 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 (fun x0 : 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
refine (Susp_rec_beta_merid _).
X: Type
point0: IsPointed X
Y: Type
f: X -> Y

Susp_ind (fun y : Susp (point0 = point0) => (fun x : Susp (point0 = point0) => f (Susp_rec pt pt idmap x)) y = (fun x : Susp (point0 = point0) => Susp_rec pt pt idmap (functor_susp (fun p : point0 = point0 => 1 @ (ap f p @ 1)) x)) y) (1 : (fun y : Susp (point0 = point0) => (fun x : Susp (point0 = point0) => f (Susp_rec pt pt idmap x)) y = (fun x : Susp (point0 = point0) => Susp_rec pt pt idmap (functor_susp (fun p : point0 = point0 => 1 @ (ap f p @ 1)) x)) y) North) (1 : (fun y : Susp (point0 = point0) => (fun x : Susp (point0 = point0) => f (Susp_rec pt pt idmap x)) y = (fun x : Susp (point0 = point0) => Susp_rec pt pt idmap (functor_susp (fun p : point0 = point0 => 1 @ (ap f p @ 1)) x)) y) South) ((fun p : point0 = point0 => internal_paths_rew_r (fun p0 : f (Susp_rec pt pt idmap South) = Susp_rec pt pt idmap (functor_susp (fun p0 : point0 = point0 => 1 @ (ap f p0 @ 1)) South) => p0 = 1) (internal_paths_rew_r (fun p0 : f (Susp_rec pt pt idmap North) = f (Susp_rec pt pt idmap South) => (p0^ @ 1) @ ap (fun x : Susp (point0 = point0) => Susp_rec pt pt idmap (functor_susp (fun p1 : point0 = point0 => 1 @ (ap f p1 @ 1)) x)) (merid p) = 1) (internal_paths_rew_r (fun p0 : f (Susp_rec pt pt idmap South) = f (Susp_rec pt pt idmap North) => p0 @ ap (fun x : Susp (point0 = point0) => Susp_rec pt pt idmap (functor_susp (fun p1 : point0 = point0 => 1 @ (ap f p1 @ 1)) x)) (merid p) = 1) (moveR_Vp (ap (fun x : Susp (point0 = point0) => Susp_rec pt pt idmap (functor_susp (fun p0 : 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 (fun x0 : point0 = point0 => merid (1 @ (ap f x0 @ 1)))) (Susp_rec pt pt idmap) (merid p) @ internal_paths_rew_r (fun p0 : Susp_rec North South (fun x0 : point0 = point0 => merid (1 @ ...)) North = Susp_rec North South (fun x0 : 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 (fun p0 : 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)) : forall x : point0 = point0, transport (fun y : Susp (point0 = point0) => (fun x0 : Susp (point0 = point0) => f (Susp_rec pt pt idmap x0)) y = (fun x0 : Susp (point0 = point0) => Susp_rec pt pt idmap (functor_susp (fun p : point0 = point0 => 1 @ (ap f p @ 1)) x0)) y) (merid x) (1 : (fun y : Susp (point0 = point0) => (fun x0 : Susp (point0 = point0) => f (Susp_rec pt pt idmap x0)) y = (fun x0 : Susp (point0 = point0) => Susp_rec pt pt idmap (functor_susp (fun p : point0 = point0 => 1 @ (ap f p @ 1)) x0)) y) North) = (1 : (fun y : Susp (point0 = point0) => (fun x0 : Susp (point0 = point0) => f (Susp_rec pt pt idmap x0)) y = (fun x0 : Susp (point0 = point0) => Susp_rec pt pt idmap (functor_susp (fun p : point0 = point0 => 1 @ (ap f p @ 1)) x0)) y) South)) pt = 1
reflexivity. Qed. (** Now the triangle identities *)
X: pType

fmap loops (loop_susp_counit X) o* loop_susp_unit (loops X) ==* pmap_idmap
X: pType

fmap loops (loop_susp_counit X) o* loop_susp_unit (loops X) ==* pmap_idmap
X: pType

fmap loops (loop_susp_counit X) o* loop_susp_unit (loops X) == pmap_idmap
X: pType
?p pt = dpoint_eq (fmap loops (loop_susp_counit X) o* loop_susp_unit (loops X)) @ (dpoint_eq pmap_idmap)^
X: pType

fmap loops (loop_susp_counit X) o* loop_susp_unit (loops X) == pmap_idmap
X: pType
p: loops X

1 @ (ap (Susp_rec pt pt idmap) (merid p @ (merid 1)^) @ 1) = p
X: pType
p: loops X

ap (Susp_rec pt pt idmap) (merid p @ (merid 1)^) = p
X: pType
p: loops X

ap (Susp_rec pt pt idmap) (merid p) @ ap (Susp_rec pt pt idmap) (merid pt)^ = p
X: pType
p: loops X

ap (Susp_rec pt pt idmap) (merid p) @ (ap (Susp_rec pt pt idmap) (merid pt))^ = p
X: pType
p: loops X

p @ pt^ = p
exact (concat_p1 _).
X: pType

((fun p : loops X => concat_1p (ap (Susp_rec pt pt idmap) (merid p @ (merid 1)^) @ 1) @ (concat_p1 (ap (Susp_rec pt pt idmap) (merid p @ (merid 1)^)) @ (ap_pp (Susp_rec pt pt idmap) (merid p) (merid pt)^ @ ((1 @@ ap_V (Susp_rec pt pt idmap) (merid pt)) @ ((Susp_rec_beta_merid p @@ inverse2 (Susp_rec_beta_merid pt)) @ concat_p1 p)))) : (fmap loops (loop_susp_counit X) o* loop_susp_unit (loops X)) p = pmap_idmap p) : fmap loops (loop_susp_counit X) o* loop_susp_unit (loops X) == pmap_idmap) pt = dpoint_eq (fmap loops (loop_susp_counit X) o* loop_susp_unit (loops X)) @ (dpoint_eq pmap_idmap)^
X: pType

(concat_1p (ap (Susp_rec pt pt idmap) (merid pt @ (merid 1)^) @ 1) @ (concat_p1 (ap (Susp_rec pt pt idmap) (merid pt @ (merid 1)^)) @ (ap_pp (Susp_rec pt pt idmap) (merid pt) (merid pt)^ @ ((1 @@ ap_V (Susp_rec pt pt idmap) (merid pt)) @ ((Susp_rec_beta_merid pt @@ inverse2 (Susp_rec_beta_merid pt)) @ concat_p1 pt))))) @ dpoint_eq pmap_idmap = dpoint_eq (fmap loops (loop_susp_counit X) o* loop_susp_unit (loops X))
X: Type
x: IsPointed X

(concat_1p (ap (Susp_rec x x idmap) (merid 1 @ (merid 1)^) @ 1) @ (concat_p1 (ap (Susp_rec x x idmap) (merid 1 @ (merid 1)^)) @ (ap_pp (Susp_rec x x idmap) (merid 1) (merid 1)^ @ ((1 @@ ap_V (Susp_rec x x idmap) (merid 1)) @ ((Susp_rec_beta_merid 1 @@ inverse2 (Susp_rec_beta_merid 1)) @ 1))))) @ 1 = ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (Susp_rec x x idmap) p @ 1)) (concat_pV (merid 1)) @ 1
X: Type
x: IsPointed X

concat_1p (ap (Susp_rec x x idmap) (merid 1 @ (merid 1)^) @ 1) @ (concat_p1 (ap (Susp_rec x x idmap) (merid 1 @ (merid 1)^)) @ (ap_pp (Susp_rec x x idmap) (merid 1) (merid 1)^ @ ((1 @@ ap_V (Susp_rec x x idmap) (merid 1)) @ ((Susp_rec_beta_merid 1 @@ inverse2 (Susp_rec_beta_merid 1)) @ 1)))) = ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (Susp_rec x x idmap) p @ 1)) (concat_pV (merid 1))
X: Type
x: IsPointed X

concat_1p (ap (Susp_rec x x idmap) (merid 1 @ (merid 1)^) @ 1) @ (concat_p1 (ap (Susp_rec x x idmap) (merid 1 @ (merid 1)^)) @ (ap_pp (Susp_rec x x idmap) (merid 1) (merid 1)^ @ ((1 @@ ap_V (Susp_rec x x idmap) (merid 1)) @ concat_pV (ap (Susp_rec x x idmap) (merid 1))))) = ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (Susp_rec x x idmap) p @ 1)) (concat_pV (merid 1))
X: Type
x: IsPointed X

concat_1p (ap (Susp_rec x x idmap) (merid 1 @ (merid 1)^) @ 1) @ (concat_p1 (ap (Susp_rec x x idmap) (merid 1 @ (merid 1)^)) @ ap (ap (Susp_rec x x idmap)) (concat_pV (merid 1))) = ap (fun p : ispointed_susp = ispointed_susp => 1 @ (ap (Susp_rec x x idmap) p @ 1)) (concat_pV (merid 1))
X: Type
x: IsPointed X

concat_1p (ap (Susp_rec x x idmap) (merid 1 @ (merid 1)^) @ 1) @ (concat_p1 (ap (Susp_rec x x idmap) (merid 1 @ (merid 1)^)) @ ap (ap (Susp_rec x x idmap)) (concat_pV (merid 1))) = ap (concat 1) (ap (fun p : Susp_rec x x idmap ispointed_susp = x => p @ 1) (ap (ap (Susp_rec x x idmap)) (concat_pV (merid 1))))
X: Type
x: IsPointed X

concat_p1 (ap (Susp_rec x x idmap) (merid 1 @ (merid 1)^)) @ ap (ap (Susp_rec x x idmap)) (concat_pV (merid 1)) = ap (fun p : Susp_rec x x idmap ispointed_susp = x => p @ 1) (ap (ap (Susp_rec x x idmap)) (concat_pV (merid 1)))
apply concat_p1_1. Qed.
X: pType

loop_susp_counit (psusp X) o* fmap psusp (loop_susp_unit X) ==* pmap_idmap
X: pType

loop_susp_counit (psusp X) o* fmap psusp (loop_susp_unit X) ==* pmap_idmap
X: pType

Susp_rec ispointed_susp ispointed_susp idmap (functor_susp (fun x : X => merid x @ (merid pt)^) South) = South
X: pType
forall x : X, transport (fun y : Susp X => Susp_rec ispointed_susp ispointed_susp idmap (functor_susp (fun x0 : X => merid x0 @ (merid pt)^) y) = y) (merid x) 1 = ?Goal
X: pType

Susp_rec ispointed_susp ispointed_susp idmap (functor_susp (fun x : X => merid x @ (merid pt)^) South) = South
exact (merid (point X)).
X: pType

forall x : X, transport (fun y : Susp X => Susp_rec ispointed_susp ispointed_susp idmap (functor_susp (fun x0 : X => merid x0 @ (merid pt)^) y) = y) (merid x) 1 = merid pt
X: pType
x: X

transport (fun y : Susp X => Susp_rec ispointed_susp ispointed_susp idmap (functor_susp (fun x : 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 (fun x : 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

(fun x : A ->* loops B => fmap loops (loop_susp_counit B o* fmap psusp x) o* loop_susp_unit A) == idmap
H: Funext
A, B: pType
(fun x : psusp A $-> B => loop_susp_counit B o* fmap psusp (fmap loops x o* loop_susp_unit A)) == idmap
H: Funext
A, B: pType

(fun x : 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

(fun x : 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 (fun f : psusp A $-> B => fmap loops f o* loop_susp_unit A) (fun g : A ->* loops B => loop_susp_counit B o* fmap psusp g) ((fun g : 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)))))) : (fun x : A ->* loops B => fmap loops (loop_susp_counit B o* fmap psusp x) o* loop_susp_unit A) == idmap) ((fun f : 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)))))) : (fun x : 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 (fun f : psusp A $-> B => fmap loops f o* loop_susp_unit A) (fun g : A ->* loops B => loop_susp_counit B o* fmap psusp g) (fun g : 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)))))) (fun f : 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
rapply 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 (loops (psusp A)) (loops B') (fun p : ispointed_susp = ispointed_susp => (ap g (point_eq f) @ point_eq g)^ @ (ap (fun x : 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 (loops B) (loops B') (fun p : 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 (loops (psusp A)) (loops B) (fun p : 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 (loops (psusp A)) (loops B') (fun p : ispointed_susp = ispointed_susp => (ap g (point_eq f) @ point_eq g)^ @ (ap (fun x : 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 (loops B) (loops B') (fun p : 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 (loops (psusp A)) (loops B) (fun p : 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 (loops (psusp A)) (loops B') (fun p : ispointed_susp = ispointed_susp => (ap g (point_eq f) @ point_eq g)^ @ (ap (fun x : 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 (loops B) (loops B') (fun p : 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 (loops (psusp A)) (loops B) (fun p : 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))
refine (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 (psusp A') (psusp (pt = pt)) (functor_susp (fun x : A' => f (g x))) 1 ==* loop_susp_counit B o* Build_pMap (psusp A) (psusp (pt = pt)) (functor_susp f) 1 o* Build_pMap (psusp A') (psusp A) (functor_susp g) 1
H: Funext
A, A', B: pType
f: A ->* loops B
g: A' ->* A

loop_susp_counit B o* Build_pMap (psusp A') (psusp (pt = pt)) (functor_susp (fun x : A' => f (g x))) 1 ==* loop_susp_counit B o* (Build_pMap (psusp A) (psusp (pt = pt)) (functor_susp f) 1 o* Build_pMap (psusp A') (psusp A) (functor_susp g) 1)
H: Funext
A, A', B: pType
f: A ->* loops B
g: A' ->* A

Build_pMap (psusp A') (psusp (pt = pt)) (functor_susp (fun x : A' => f (g x))) 1 ==* Build_pMap (psusp A) (psusp (pt = pt)) (functor_susp f) 1 o* Build_pMap (psusp A') (psusp A) (functor_susp g) 1
exact (fmap_comp psusp g f). Defined.
H: Funext
A: pType

Is1Natural (opyon (psusp A)) (opyon A o loops) (fun B : pType => loop_susp_adjoint A B)
H: Funext
A: pType

Is1Natural (opyon (psusp A)) (opyon A o loops) (fun B : pType => loop_susp_adjoint A B)
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
rapply (fmap_comp loops). Defined.
H: Funext
A: pType

NatEquiv (opyon (psusp A)) (opyon A o loops)
H: Funext
A: pType

NatEquiv (opyon (psusp A)) (opyon A o loops)
rapply Build_NatEquiv. Defined.