{-# OPTIONS --without-K --rewriting #-}
open import HoTT
open import homotopy.PtdAdjoint
module homotopy.SuspAdjointLoop where
module Σ⊣Ω {i} where
SuspFunctor : PtdFunctor i i
SuspFunctor = record {
obj = ⊙Susp;
arr = ⊙Susp-fmap;
id = ⊙Susp-fmap-idf;
comp = ⊙Susp-fmap-∘}
LoopFunctor : PtdFunctor i i
LoopFunctor = record {
obj = ⊙Ω;
arr = ⊙Ω-fmap;
id = λ _ → ⊙Ω-fmap-idf;
comp = ⊙Ω-fmap-∘}
module _ (X : Ptd i) where
η : de⊙ X → Ω (⊙Susp X)
η x = merid x ∙ ! (merid (pt X))
module E = SuspRec (pt X) (pt X) (idf _)
ε : de⊙ (⊙Susp (⊙Ω X)) → de⊙ X
ε = E.f
⊙η : X ⊙→ ⊙Ω (⊙Susp X)
⊙η = (η , !-inv-r (merid (pt X)))
⊙ε : ⊙Susp (⊙Ω X) ⊙→ X
⊙ε = (ε , idp)
η-natural : {X Y : Ptd i} (f : X ⊙→ Y)
→ ⊙η Y ⊙∘ f == ⊙Ω-fmap (⊙Susp-fmap f) ⊙∘ ⊙η X
η-natural {X = X} (f , idp) = ⊙λ=
(λ x → ! $
ap-∙ (Susp-fmap f) (merid x) (! (merid (pt X)))
∙ SuspFmap.merid-β f x
∙2 (ap-! (Susp-fmap f) (merid (pt X))
∙ ap ! (SuspFmap.merid-β f (pt X))))
(pt-lemma (Susp-fmap f) (merid (pt X)) (SuspFmap.merid-β f (pt X)))
where
pt-lemma : ∀ {i j} {A : Type i} {B : Type j} (f : A → B)
{x y : A} (p : x == y) {q : f x == f y} (α : ap f p == q)
→ !-inv-r q == ap (ap f) (!-inv-r p) ∙ idp
[ _== idp ↓ ! (ap-∙ f p (! p) ∙ α ∙2 (ap-! f p ∙ ap ! α)) ]
pt-lemma f idp idp = idp
ε-natural : {X Y : Ptd i} (f : X ⊙→ Y)
→ ⊙ε Y ⊙∘ ⊙Susp-fmap (⊙Ω-fmap f) == f ⊙∘ ⊙ε X
ε-natural (f , idp) = ⊙λ=
(SuspElim.f idp idp
(λ p → ↓-='-from-square $ vert-degen-square $
ap-∘ (ε _) (Susp-fmap (ap f)) (merid p)
∙ ap (ap (ε _)) (SuspFmap.merid-β (ap f) p)
∙ E.merid-β _ (ap f p)
∙ ap (ap f) (! (E.merid-β _ p))
∙ ∘-ap f (ε _) (merid p)))
idp
εΣ-Ση : (X : Ptd i) → ⊙ε (⊙Susp X) ⊙∘ ⊙Susp-fmap (⊙η X) == ⊙idf _
εΣ-Ση X = ⊙λ=
(SuspElim.f
idp
(merid (pt X))
(λ x → ↓-='-from-square $
(ap-∘ (ε (⊙Susp X)) (Susp-fmap (η X)) (merid x)
∙ ap (ap (ε (⊙Susp X))) (SuspFmap.merid-β (η X) x)
∙ E.merid-β _ (merid x ∙ ! (merid (pt X))))
∙v⊡ square-lemma (merid x) (merid (pt X))
⊡v∙ ! (ap-idf (merid x))))
idp
where
square-lemma : ∀ {i} {A : Type i} {x y z : A}
(p : x == y) (q : z == y)
→ Square idp (p ∙ ! q) p q
square-lemma idp idp = ids
Ωε-ηΩ : (X : Ptd i) → ⊙Ω-fmap (⊙ε X) ⊙∘ ⊙η (⊙Ω X) == ⊙idf _
Ωε-ηΩ X = ⊙λ=
(λ p → ap-∙ (ε X) (merid p) (! (merid idp))
∙ (E.merid-β X p ∙2 (ap-! (ε X) (merid idp) ∙ ap ! (E.merid-β X idp)))
∙ ∙-unit-r _)
(pt-lemma (ε X) (merid idp) (E.merid-β X idp))
where
pt-lemma : ∀ {i j} {A : Type i} {B : Type j} (f : A → B)
{x y : A} (p : x == y) {q : f x == f y} (α : ap f p == q)
→ ap (ap f) (!-inv-r p) ∙ idp == idp
[ _== idp ↓ ap-∙ f p (! p) ∙ (α ∙2 (ap-! f p ∙ ap ! α)) ∙ !-inv-r q ]
pt-lemma f idp idp = idp
adj : CounitUnitAdjoint SuspFunctor LoopFunctor
adj = record {
η = ⊙η;
ε = ⊙ε;
η-natural = η-natural;
ε-natural = ε-natural;
εF-Fη = εΣ-Ση;
Gε-ηG = Ωε-ηΩ}