{-# OPTIONS --without-K --rewriting #-}

open import lib.Basics
open import lib.types.Paths
open import lib.types.TwoSemiCategory
open import lib.two-semi-categories.Functor

module lib.two-semi-categories.FunctorInverse where

module _ {k l} {B : Type k} {C : B  B  Type l}
  (comp : {b b' b'' : B}  C b b'  C b' b''  C b b'') where

  coe-C : {b₁ b₁' b₂ b₂' : B}
     b₁ == b₂
     b₁' == b₂'
     C b₁ b₁'
     C b₂ b₂'
  coe-C p p' = coe (ap2 C p p')

  coe-comp : {b₁ b₁' b₁'' b₂ b₂' b₂'' : B}
     (p : b₁ == b₂) (p' : b₁' == b₂') (p'' : b₁'' == b₂'')
     (r : C b₁ b₁') (s : C b₁' b₁'')
     coe-C p p'' (comp r s) == comp (coe-C p p' r) (coe-C p' p'' s)
  coe-comp idp idp idp r s = idp

  coe-comp-coh : {b₁ b₁' b₁'' b₁''' b₂ b₂' b₂'' b₂''' : B}
     (assoc : {b b' b'' b''' : B}
              (f : C b b') (g : C b' b'') (h : C b'' b''')
              comp (comp f g) h == comp f (comp g h))
     (p : b₁ == b₂) (p' : b₁' == b₂') (p'' : b₁'' == b₂'') (p''' : b₁''' == b₂''')
     (f : C b₁ b₁') (g : C b₁' b₁'') (h : C b₁'' b₁''')
     coe-comp p p'' p''' (comp f g) h ◃∙
      ap  s  comp s (coe-C p'' p''' h)) (coe-comp p p' p'' f g) ◃∙
      assoc (coe-C p p' f) (coe-C p' p'' g) (coe-C p'' p''' h) ◃∎
      =ₛ
      ap (coe-C p p''') (assoc f g h) ◃∙
      coe-comp p p' p''' f (comp g h) ◃∙
      ap (comp (coe-C p p' f)) (coe-comp p' p'' p''' g h) ◃∎
  coe-comp-coh assoc idp idp idp idp f g h = =ₛ-in $
    ! (ap-idf (assoc f g h))  ! (∙-unit-r (ap (coe-C idp idp) (assoc f g h)))

module FunctorInverse
  {i₁ j₁ i₂ j₂}
  {C : TwoSemiCategory i₁ j₁} {D : TwoSemiCategory i₂ j₂}
  (F : TwoSemiFunctor C D)
  (F₀-is-equiv : is-equiv (TwoSemiFunctor.F₀ F))
  (F₁-is-equiv :  x y  is-equiv (TwoSemiFunctor.F₁ F {x} {y})) where

  private

    module C = TwoSemiCategory C
    module D = TwoSemiCategory D
    module F = TwoSemiFunctor F

    module F₀-is-equiv = is-equiv F₀-is-equiv
    module F₁-is-equiv (x y : C.El) = is-equiv (F₁-is-equiv x y)

    F₀ = F.F₀
    F₁ = F.F₁

  G₀ : D.El  C.El
  G₀ = F₀-is-equiv.g

  D' : TwoSemiCategory i₂ j₂
  D' =
    record
    { El = D.El
    ; Arr = λ x y  D.Arr (F₀ (G₀ x)) (F₀ (G₀ y))
    ; Arr-level = λ x y  D.Arr-level (F₀ (G₀ x)) (F₀ (G₀ y))
    ; two-semi-cat-struct =
      record
      { comp = λ f g  D.comp f g
      ; assoc = λ f g h  D.assoc f g h
      ; pentagon-identity = λ f g h i  D.pentagon-identity f g h i
      }
    }

  N : TwoSemiFunctor D D'
  N =
    record
    { F₀ = idf D.El
    ; F₁ = λ {x} {y} f  coe (Arr-path x y) f
    ; pres-comp = λ {x} {y} {z} f g 
        coe-comp D.comp (F₀-η x) (F₀-η y) (F₀-η z) f g
    ; pres-comp-coh = λ {w} {x} {y} {z} f g h 
        coe-comp-coh D.comp D.assoc (F₀-η w) (F₀-η x) (F₀-η y) (F₀-η z) f g h
    }
    where
    F₀-η : (x : D.El)  x == F₀ (G₀ x)
    F₀-η x = ! (F₀-is-equiv.f-g x)
    Arr-path : (x y : D.El)  D.Arr x y == D.Arr (F₀ (G₀ x)) (F₀ (G₀ y))
    Arr-path x y = ap2 D.Arr (F₀-η x) (F₀-η y)

  module N = TwoSemiFunctor N

  G₁ : {x y : D.El}  D.Arr (F₀ (G₀ x)) (F₀ (G₀ y))  C.Arr (G₀ x) (G₀ y)
  G₁ {x} {y} f = F₁-is-equiv.g (G₀ x) (G₀ y) f

  F₁-β : {x y : D.El} (f : D.Arr (F₀ (G₀ x)) (F₀ (G₀ y)))
     F₁ (G₁ f) == f
  F₁-β {x} {y} f = F₁-is-equiv.f-g (G₀ x) (G₀ y) f

  F₁-η : {x y : D.El} (f : D.Arr (F₀ (G₀ x)) (F₀ (G₀ y)))
     f == F₁ (G₁ f)
  F₁-η f = ! (F₁-β f)

  G₁-β : {x y : D.El}  (f : C.Arr (G₀ x) (G₀ y))
     G₁ (F₁ f) == f
  G₁-β {x} {y} f = F₁-is-equiv.g-f (G₀ x) (G₀ y) f

  G₁-pres-comp-seq : {x y z : D.El}
    (f : D.Arr (F₀ (G₀ x)) (F₀ (G₀ y)))
    (g : D.Arr (F₀ (G₀ y)) (F₀ (G₀ z)))
     G₁ (D.comp f g) =-= C.comp (G₁ f) (G₁ g)
  G₁-pres-comp-seq {x} {y} {z} f g =
    G₁ (D.comp f g)
      =⟪ ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η g) 
    G₁ (D.comp (F₁ (G₁ f)) (F₁ (G₁ g)))
      =⟪ ap G₁ (! (F.pres-comp (G₁ f) (G₁ g))) 
    G₁ (F₁ (C.comp (G₁ f) (G₁ g)))
      =⟪ G₁-β (C.comp (G₁ f) (G₁ g)) 
    C.comp (G₁ f) (G₁ g) ∎∎

  abstract
    G₁-pres-comp : {x y z : D.El}
      (f : D.Arr (F₀ (G₀ x)) (F₀ (G₀ y)))
      (g : D.Arr (F₀ (G₀ y)) (F₀ (G₀ z)))
       G₁ (D.comp f g) == C.comp (G₁ f) (G₁ g)
    G₁-pres-comp f g =  (G₁-pres-comp-seq f g)

    G₁-pres-comp-β : {x y z : D.El}
      (f : D.Arr (F₀ (G₀ x)) (F₀ (G₀ y)))
      (g : D.Arr (F₀ (G₀ y)) (F₀ (G₀ z)))
       G₁-pres-comp f g ◃∎ =ₛ G₁-pres-comp-seq f g
    G₁-pres-comp-β f g = =ₛ-in idp

  private
    G₁-pres-comp-coh : {w x y z : D.El}
      (f : D.Arr (F₀ (G₀ w)) (F₀ (G₀ x)))
      (g : D.Arr (F₀ (G₀ x)) (F₀ (G₀ y)))
      (h : D.Arr (F₀ (G₀ y)) (F₀ (G₀ z)))
       G₁-pres-comp (D.comp f g) h ◃∙
        ap  s  C.comp s (G₁ h)) (G₁-pres-comp f g) ◃∙
        C.assoc (G₁ f) (G₁ g) (G₁ h) ◃∎
        =ₛ
        ap G₁ (D.assoc f g h) ◃∙
        G₁-pres-comp f (D.comp g h) ◃∙
        ap (C.comp (G₁ f)) (G₁-pres-comp g h) ◃∎
    G₁-pres-comp-coh {w} {x} {y} {z} f g h =
      G₁-pres-comp (D.comp f g) h ◃∙
      ap  s  C.comp s (G₁ h)) (G₁-pres-comp f g) ◃∙
      C.assoc (G₁ f) (G₁ g) (G₁ h) ◃∎
        =ₛ⟨ 0 & 1 & G₁-pres-comp-β (D.comp f g) h 
      ap2  s t  G₁ (D.comp s t)) (F₁-η (D.comp f g)) (F₁-η h) ◃∙
      ap G₁ (! (F.pres-comp (G₁ (D.comp f g)) (G₁ h))) ◃∙
      G₁-β (C.comp (G₁ (D.comp f g)) (G₁ h)) ◃∙
      ap  s  C.comp s (G₁ h)) (G₁-pres-comp f g) ◃∙
      C.assoc (G₁ f) (G₁ g) (G₁ h) ◃∎
        =ₛ⟨ 2 & 2 & !ₛ $
            homotopy-naturality
               s  G₁ (F₁ (C.comp s (G₁ h))))
               s  C.comp s (G₁ h))
               s  G₁-β (C.comp s (G₁ h)))
              (G₁-pres-comp f g) 
      ap2  s t  G₁ (D.comp s t)) (F₁-η (D.comp f g)) (F₁-η h) ◃∙
      ap G₁ (! (F.pres-comp (G₁ (D.comp f g)) (G₁ h))) ◃∙
      ap  s  G₁ (F₁ (C.comp s (G₁ h)))) (G₁-pres-comp f g) ◃∙
      G₁-β (C.comp (C.comp (G₁ f) (G₁ g)) (G₁ h)) ◃∙
      C.assoc (G₁ f) (G₁ g) (G₁ h) ◃∎
        =ₛ⟨ 1 & 2 & !ₛ $
            homotopy-naturality
               s  G₁ (D.comp (F₁ s) (F₁ (G₁ h))))
               s  G₁ (F₁ (C.comp s (G₁ h))))
               s  ap G₁ (! (F.pres-comp s (G₁ h))))
              (G₁-pres-comp f g) 
      ap2  s t  G₁ (D.comp s t)) (F₁-η (D.comp f g)) (F₁-η h) ◃∙
      ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (G₁-pres-comp f g) ◃∙
      ap G₁ (! (F.pres-comp (C.comp (G₁ f) (G₁ g)) (G₁ h))) ◃∙
      G₁-β (C.comp (C.comp (G₁ f) (G₁ g)) (G₁ h)) ◃∙
      C.assoc (G₁ f) (G₁ g) (G₁ h) ◃∎
        =ₛ⟨ 1 & 1 & ap-seq-=ₛ  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (G₁-pres-comp-β f g) 
      ap2  s t  G₁ (D.comp s t)) (F₁-η (D.comp f g)) (F₁-η h) ◃∙
      ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η g)) ◃∙
      ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (ap G₁ (! (F.pres-comp (G₁ f) (G₁ g)))) ◃∙
      ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (G₁-β (C.comp (G₁ f) (G₁ g))) ◃∙
      ap G₁ (! (F.pres-comp (C.comp (G₁ f) (G₁ g)) (G₁ h))) ◃∙
      G₁-β (C.comp (C.comp (G₁ f) (G₁ g)) (G₁ h)) ◃∙
      C.assoc (G₁ f) (G₁ g) (G₁ h) ◃∎
        =ₛ₁⟨ 3 & 1 & step₅ 
      ap2  s t  G₁ (D.comp s t)) (F₁-η (D.comp f g)) (F₁-η h) ◃∙
      ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η g)) ◃∙
      ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (ap G₁ (! (F.pres-comp (G₁ f) (G₁ g)))) ◃∙
      ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (F₁-β (F₁ (C.comp (G₁ f) (G₁ g)))) ◃∙
      ap G₁ (! (F.pres-comp (C.comp (G₁ f) (G₁ g)) (G₁ h))) ◃∙
      G₁-β (C.comp (C.comp (G₁ f) (G₁ g)) (G₁ h)) ◃∙
      C.assoc (G₁ f) (G₁ g) (G₁ h) ◃∎
        =ₛ₁⟨ 2 & 1 & ∘-ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) G₁ (! (F.pres-comp (G₁ f) (G₁ g))) 
      ap2  s t  G₁ (D.comp s t)) (F₁-η (D.comp f g)) (F₁-η h) ◃∙
      ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η g)) ◃∙
      ap  s  G₁ (D.comp (F₁ (G₁ s)) (F₁ (G₁ h)))) (! (F.pres-comp (G₁ f) (G₁ g))) ◃∙
      ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (F₁-β (F₁ (C.comp (G₁ f) (G₁ g)))) ◃∙
      ap G₁ (! (F.pres-comp (C.comp (G₁ f) (G₁ g)) (G₁ h))) ◃∙
      G₁-β (C.comp (C.comp (G₁ f) (G₁ g)) (G₁ h)) ◃∙
      C.assoc (G₁ f) (G₁ g) (G₁ h) ◃∎
        =ₛ⟨ 2 & 2 & homotopy-naturality
                       s  G₁ (D.comp (F₁ (G₁ s)) (F₁ (G₁ h))))
                       s  G₁ (D.comp s (F₁ (G₁ h))))
                       t  ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (F₁-β t))
                      (! (F.pres-comp (G₁ f) (G₁ g))) 
      ap2  s t  G₁ (D.comp s t)) (F₁-η (D.comp f g)) (F₁-η h) ◃∙
      ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η g)) ◃∙
      ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (F₁-β (D.comp (F₁ (G₁ f)) (F₁ (G₁ g)))) ◃∙
      ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (! (F.pres-comp (G₁ f) (G₁ g))) ◃∙
      ap G₁ (! (F.pres-comp (C.comp (G₁ f) (G₁ g)) (G₁ h))) ◃∙
      G₁-β (C.comp (C.comp (G₁ f) (G₁ g)) (G₁ h)) ◃∙
      C.assoc (G₁ f) (G₁ g) (G₁ h) ◃∎
        =ₛ⟨ 0 & 3 & step₈ 
      ap  s  G₁ (D.comp (D.comp s g) h)) (F₁-η f) ◃∙
      ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) s) h)) (F₁-η g) ◃∙
      ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) s)) (F₁-η h) ◃∙
      ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (! (F.pres-comp (G₁ f) (G₁ g))) ◃∙
      ap G₁ (! (F.pres-comp (C.comp (G₁ f) (G₁ g)) (G₁ h))) ◃∙
      G₁-β (C.comp (C.comp (G₁ f) (G₁ g)) (G₁ h)) ◃∙
      C.assoc (G₁ f) (G₁ g) (G₁ h) ◃∎
        =ₛ⟨ 5 & 2 & !ₛ $
            homotopy-naturality-to-idf (G₁  F₁) G₁-β (C.assoc (G₁ f) (G₁ g) (G₁ h)) 
      ap  s  G₁ (D.comp (D.comp s g) h)) (F₁-η f) ◃∙
      ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) s) h)) (F₁-η g) ◃∙
      ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) s)) (F₁-η h) ◃∙
      ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (! (F.pres-comp (G₁ f) (G₁ g))) ◃∙
      ap G₁ (! (F.pres-comp (C.comp (G₁ f) (G₁ g)) (G₁ h))) ◃∙
      ap (G₁  F₁) (C.assoc (G₁ f) (G₁ g) (G₁ h)) ◃∙
      G₁-β (C.comp (G₁ f) (C.comp (G₁ g) (G₁ h))) ◃∎
        =ₛ⟨ 3 & 3 & step₁₀ 
      ap  s  G₁ (D.comp (D.comp s g) h)) (F₁-η f) ◃∙
      ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) s) h)) (F₁-η g) ◃∙
      ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) s)) (F₁-η h) ◃∙
      ap G₁ (D.assoc (F₁ (G₁ f)) (F₁ (G₁ g)) (F₁ (G₁ h))) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))) (! (F.pres-comp (G₁ g) (G₁ h))) ◃∙
      ap G₁ (! (F.pres-comp (G₁ f) (C.comp (G₁ g) (G₁ h)))) ◃∙
      G₁-β (C.comp (G₁ f) (C.comp (G₁ g) (G₁ h))) ◃∎
        =ₛ⟨ 0 & 4 & step₁₁ 
      ap G₁ (D.assoc f g h) ◃∙
      ap  s  G₁ (D.comp s (D.comp g h))) (F₁-η f) ◃∙
      ap  s  G₁ (D.comp (F₁ (G₁ f)) (D.comp s h))) (F₁-η g) ◃∙
      ap  s  G₁ (D.comp (F₁ (G₁ f)) (D.comp (F₁ (G₁ g)) s))) (F₁-η h) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))) (! (F.pres-comp (G₁ g) (G₁ h))) ◃∙
      ap G₁ (! (F.pres-comp (G₁ f) (C.comp (G₁ g) (G₁ h)))) ◃∙
      G₁-β (C.comp (G₁ f) (C.comp (G₁ g) (G₁ h))) ◃∎
        =ₛ⟨ 1 & 3 & step₁₂ 
      ap G₁ (D.assoc f g h) ◃∙
      ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η (D.comp g h)) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))  F₁) (ap2  s t  G₁ (D.comp s t)) (F₁-η g) (F₁-η h)) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))) (F₁-β (D.comp (F₁ (G₁ g)) (F₁ (G₁ h)))) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))) (! (F.pres-comp (G₁ g) (G₁ h))) ◃∙
      ap G₁ (! (F.pres-comp (G₁ f) (C.comp (G₁ g) (G₁ h)))) ◃∙
      G₁-β (C.comp (G₁ f) (C.comp (G₁ g) (G₁ h))) ◃∎
        =ₛ⟨ 3 & 2 & !ₛ $
            homotopy-naturality
              (G₁  D.comp (F₁ (G₁ f))  F₁  G₁)
              (G₁  D.comp (F₁ (G₁ f)))
              (ap (G₁  D.comp (F₁ (G₁ f)))  F₁-β)
              (! (F.pres-comp (G₁ g) (G₁ h))) 
      ap G₁ (D.assoc f g h) ◃∙
      ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η (D.comp g h)) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))  F₁) (ap2  s t  G₁ (D.comp s t)) (F₁-η g) (F₁-η h)) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))  F₁  G₁) (! (F.pres-comp (G₁ g) (G₁ h))) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))) (F₁-β (F₁ (C.comp (G₁ g) (G₁ h)))) ◃∙
      ap G₁ (! (F.pres-comp (G₁ f) (C.comp (G₁ g) (G₁ h)))) ◃∙
      G₁-β (C.comp (G₁ f) (C.comp (G₁ g) (G₁ h))) ◃∎
        =ₛ₁⟨ 3 & 1 & ap-∘ (G₁  D.comp (F₁ (G₁ f))  F₁) G₁ (! (F.pres-comp (G₁ g) (G₁ h))) 
      ap G₁ (D.assoc f g h) ◃∙
      ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η (D.comp g h)) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))  F₁) (ap2  s t  G₁ (D.comp s t)) (F₁-η g) (F₁-η h)) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))  F₁) (ap G₁ (! (F.pres-comp (G₁ g) (G₁ h)))) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))) (F₁-β (F₁ (C.comp (G₁ g) (G₁ h)))) ◃∙
      ap G₁ (! (F.pres-comp (G₁ f) (C.comp (G₁ g) (G₁ h)))) ◃∙
      G₁-β (C.comp (G₁ f) (C.comp (G₁ g) (G₁ h))) ◃∎
        =ₛ₁⟨ 4 & 1 &
             ! $ ap (ap (G₁  D.comp (F₁ (G₁ f)))) $
             F₁-is-equiv.adj (G₀ x) (G₀ z) (C.comp (G₁ g) (G₁ h)) 
      ap G₁ (D.assoc f g h) ◃∙
      ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η (D.comp g h)) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))  F₁) (ap2  s t  G₁ (D.comp s t)) (F₁-η g) (F₁-η h)) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))  F₁) (ap G₁ (! (F.pres-comp (G₁ g) (G₁ h)))) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))) (ap F₁ (G₁-β (C.comp (G₁ g) (G₁ h)))) ◃∙
      ap G₁ (! (F.pres-comp (G₁ f) (C.comp (G₁ g) (G₁ h)))) ◃∙
      G₁-β (C.comp (G₁ f) (C.comp (G₁ g) (G₁ h))) ◃∎
        =ₛ₁⟨ 4 & 1 & ∘-ap (G₁  D.comp (F₁ (G₁ f))) F₁ (G₁-β (C.comp (G₁ g) (G₁ h))) 
      ap G₁ (D.assoc f g h) ◃∙
      ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η (D.comp g h)) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))  F₁) (ap2  s t  G₁ (D.comp s t)) (F₁-η g) (F₁-η h)) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))  F₁) (ap G₁ (! (F.pres-comp (G₁ g) (G₁ h)))) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))  F₁) (G₁-β (C.comp (G₁ g) (G₁ h))) ◃∙
      ap G₁ (! (F.pres-comp (G₁ f) (C.comp (G₁ g) (G₁ h)))) ◃∙
      G₁-β (C.comp (G₁ f) (C.comp (G₁ g) (G₁ h))) ◃∎
        =ₛ⟨ 2 & 3 & ap-seq-=ₛ (G₁  D.comp (F₁ (G₁ f))  F₁) (!ₛ (G₁-pres-comp-β g h)) 
      ap G₁ (D.assoc f g h) ◃∙
      ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η (D.comp g h)) ◃∙
      ap (G₁  D.comp (F₁ (G₁ f))  F₁) (G₁-pres-comp g h) ◃∙
      ap G₁ (! (F.pres-comp (G₁ f) (C.comp (G₁ g) (G₁ h)))) ◃∙
      G₁-β (C.comp (G₁ f) (C.comp (G₁ g) (G₁ h))) ◃∎
        =ₛ⟨ 2 & 2 &
            homotopy-naturality
              (G₁  D.comp (F₁ (G₁ f))  F₁)
              (G₁  F₁  C.comp (G₁ f))
               s  ap G₁ (! (F.pres-comp (G₁ f) s)))
              (G₁-pres-comp g h) 
      ap G₁ (D.assoc f g h) ◃∙
      ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η (D.comp g h)) ◃∙
      ap G₁ (! (F.pres-comp (G₁ f) (G₁ (D.comp g h)))) ◃∙
      ap (G₁  F₁  C.comp (G₁ f)) (G₁-pres-comp g h) ◃∙
      G₁-β (C.comp (G₁ f) (C.comp (G₁ g) (G₁ h))) ◃∎
        =ₛ⟨ 3 & 2 &
            homotopy-naturality
              (G₁  F₁  C.comp (G₁ f))
              (C.comp (G₁ f))
              (G₁-β  C.comp (G₁ f))
              (G₁-pres-comp g h) 
      ap G₁ (D.assoc f g h) ◃∙
      ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η (D.comp g h)) ◃∙
      ap G₁ (! (F.pres-comp (G₁ f) (G₁ (D.comp g h)))) ◃∙
      G₁-β (C.comp (G₁ f) (G₁ (D.comp g h))) ◃∙
      ap (C.comp (G₁ f)) (G₁-pres-comp g h) ◃∎
        =ₛ⟨ 1 & 3 & !ₛ (G₁-pres-comp-β f (D.comp g h)) 
      ap G₁ (D.assoc f g h) ◃∙
      G₁-pres-comp f (D.comp g h) ◃∙
      ap (C.comp (G₁ f)) (G₁-pres-comp g h) ◃∎ ∎ₛ
      where
        step₅ : ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (G₁-β (C.comp (G₁ f) (G₁ g)))
                ==
                ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (F₁-β (F₁ (C.comp (G₁ f) (G₁ g))))
        step₅ =
          ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (G₁-β (C.comp (G₁ f) (G₁ g)))
            =⟨ ap-∘  s  G₁ (D.comp s (F₁ (G₁ h)))) F₁ (G₁-β (C.comp (G₁ f) (G₁ g))) 
          ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (ap F₁ (G₁-β (C.comp (G₁ f) (G₁ g))))
            =⟨ ap (ap  s  G₁ (D.comp s (F₁ (G₁ h)))))
                  (F₁-is-equiv.adj (G₀ w) (G₀ y) (C.comp (G₁ f) (G₁ g))) 
          ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (F₁-β (F₁ (C.comp (G₁ f) (G₁ g)))) =∎
        step₈ : ap2  s t  G₁ (D.comp s t)) (F₁-η (D.comp f g)) (F₁-η h) ◃∙
                ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η g)) ◃∙
                ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (F₁-β (D.comp (F₁ (G₁ f)) (F₁ (G₁ g)))) ◃∎
                =ₛ
                ap  s  G₁ (D.comp (D.comp s g) h)) (F₁-η f) ◃∙
                ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) s) h)) (F₁-η g) ◃∙
                ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) s)) (F₁-η h) ◃∎
        step₈ =
          ap2  s t  G₁ (D.comp s t)) (F₁-η (D.comp f g)) (F₁-η h) ◃∙
          ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η g)) ◃∙
          ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (F₁-β (D.comp (F₁ (G₁ f)) (F₁ (G₁ g)))) ◃∎
            =ₛ₁⟨ 1 & 1 & ap (ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))))
                            (! (ap-ap2 G₁ D.comp (F₁-η f) (F₁-η g))) 
          ap2  s t  G₁ (D.comp s t)) (F₁-η (D.comp f g)) (F₁-η h) ◃∙
          ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) (ap G₁ (ap2 D.comp (F₁-η f) (F₁-η g))) ◃∙
          ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (F₁-β (D.comp (F₁ (G₁ f)) (F₁ (G₁ g)))) ◃∎
            =ₛ₁⟨ 1 & 1 & ∘-ap  s  G₁ (D.comp (F₁ s) (F₁ (G₁ h)))) G₁ (ap2 D.comp (F₁-η f) (F₁-η g)) 
          ap2  s t  G₁ (D.comp s t)) (F₁-η (D.comp f g)) (F₁-η h) ◃∙
          ap  s  G₁ (D.comp (F₁ (G₁ s)) (F₁ (G₁ h)))) (ap2 D.comp (F₁-η f) (F₁-η g)) ◃∙
          ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (F₁-β (D.comp (F₁ (G₁ f)) (F₁ (G₁ g)))) ◃∎
            =ₛ⟨ 0 & 2 & !ₛ $
                homotopy-naturality  s  G₁ (D.comp s h))
                                     s  G₁ (D.comp (F₁ (G₁ s)) (F₁ (G₁ h))))
                                     s  ap2  s t  G₁ (D.comp s t)) (F₁-η s) (F₁-η h))
                                    (ap2 D.comp (F₁-η f) (F₁-η g)) 
          ap  s  G₁ (D.comp s h)) (ap2 D.comp (F₁-η f) (F₁-η g)) ◃∙
          ap2  s t  G₁ (D.comp s t)) (F₁-η (D.comp (F₁ (G₁ f)) (F₁ (G₁ g)))) (F₁-η h) ◃∙
          ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (F₁-β (D.comp (F₁ (G₁ f)) (F₁ (G₁ g)))) ◃∎
            =ₛ⟨ 1 & 1 & ap2-out'  s t  G₁ (D.comp s t)) (F₁-η (D.comp (F₁ (G₁ f)) (F₁ (G₁ g)))) (F₁-η h) 
          ap  s  G₁ (D.comp s h)) (ap2 D.comp (F₁-η f) (F₁-η g)) ◃∙
          ap  t  G₁ (D.comp (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) t)) (F₁-η h) ◃∙
          ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (F₁-η (D.comp (F₁ (G₁ f)) (F₁ (G₁ g)))) ◃∙
          ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (F₁-β (D.comp (F₁ (G₁ f)) (F₁ (G₁ g)))) ◃∎
            =ₛ⟨ 2 & 2 &
                ap-seq-=ₛ  s  G₁ (D.comp s (F₁ (G₁ h)))) $
                =ₛ-in {s = F₁-η (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) ◃∙
                           F₁-β (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) ◃∎}
                      {t = D.comp (F₁ (G₁ f)) (F₁ (G₁ g)) ∎∎}
                      (!-inv-l (F₁-β (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))))) 
          ap  s  G₁ (D.comp s h)) (ap2 D.comp (F₁-η f) (F₁-η g)) ◃∙
          ap  t  G₁ (D.comp (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) t)) (F₁-η h) ◃∎
            =ₛ₁⟨ 0 & 1 & ap-ap2  s  G₁ (D.comp s h)) D.comp (F₁-η f) (F₁-η g) 
          ap2  s t  G₁ (D.comp (D.comp s t) h)) (F₁-η f) (F₁-η g) ◃∙
          ap  t  G₁ (D.comp (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) t)) (F₁-η h) ◃∎
            =ₛ⟨ 0 & 1 & ap2-out  s t  G₁ (D.comp (D.comp s t) h)) (F₁-η f) (F₁-η g) 
          ap  s  G₁ (D.comp (D.comp s g) h)) (F₁-η f) ◃∙
          ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) s) h)) (F₁-η g) ◃∙
          ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) s)) (F₁-η h) ◃∎ ∎ₛ
        step₁₀' : ap  s  D.comp s (F₁ (G₁ h))) (! (F.pres-comp (G₁ f) (G₁ g))) ◃∙
                  ! (F.pres-comp (C.comp (G₁ f) (G₁ g)) (G₁ h)) ◃∙
                  ap F₁ (C.assoc (G₁ f) (G₁ g) (G₁ h)) ◃∎
                  =ₛ
                  D.assoc (F₁ (G₁ f)) (F₁ (G₁ g)) (F₁ (G₁ h)) ◃∙
                  ap (D.comp (F₁ (G₁ f))) (! (F.pres-comp (G₁ g) (G₁ h))) ◃∙
                  ! (F.pres-comp (G₁ f) (C.comp (G₁ g) (G₁ h))) ◃∎
        step₁₀' =
          ap  s  D.comp s (F₁ (G₁ h))) (! (F.pres-comp (G₁ f) (G₁ g))) ◃∙
          ! e₀₋₁ ◃∙
          e₀₋₄ ◃∎
            =ₛ₁⟨ 0 & 1 & ap-!  s  D.comp s (F₁ (G₁ h))) (F.pres-comp (G₁ f) (G₁ g)) 
          ! e₁₋₂ ◃∙ ! e₀₋₁ ◃∙ e₀₋₄ ◃∎
            =ₛ⟨ post-rotate-seq-in {p = ! e₁₋₂ ◃∙ ! e₀₋₁ ◃∙ e₀₋₄ ◃∎} $
                pre-rotate'-seq-in {p = e₀₋₁ ◃∙ e₁₋₂ ◃∎} $
                !ₛ $ F.pres-comp-coh (G₁ f) (G₁ g) (G₁ h) 
          e₂₋₃ ◃∙ ! e₅₋₃ ◃∙ ! e₄₋₅ ◃∎
            =ₛ₁⟨ 1 & 1 & !-ap (D.comp (F₁ (G₁ f))) (F.pres-comp (G₁ g) (G₁ h)) 
          e₂₋₃ ◃∙
          ap (D.comp (F₁ (G₁ f))) (! (F.pres-comp (G₁ g) (G₁ h))) ◃∙
          ! e₄₋₅ ◃∎ ∎ₛ
          where
            t₀ : D.Arr (F₀ (G₀ w)) (F₀ (G₀ z))
            t₀ = F₁ (C.comp (C.comp (G₁ f) (G₁ g)) (G₁ h))
            t₁ : D.Arr (F₀ (G₀ w)) (F₀ (G₀ z))
            t₁ = D.comp (F₁ (C.comp (G₁ f) (G₁ g))) (F₁ (G₁ h))
            t₂ : D.Arr (F₀ (G₀ w)) (F₀ (G₀ z))
            t₂ = D.comp (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) (F₁ (G₁ h))
            t₃ : D.Arr (F₀ (G₀ w)) (F₀ (G₀ z))
            t₃ = D.comp (F₁ (G₁ f)) (D.comp (F₁ (G₁ g)) (F₁ (G₁ h)))
            t₄ : D.Arr (F₀ (G₀ w)) (F₀ (G₀ z))
            t₄ = F₁ (C.comp (G₁ f) (C.comp (G₁ g) (G₁ h)))
            t₅ = D.comp (F₁ (G₁ f)) (F₁ (C.comp (G₁ g) (G₁ h)))
            e₀₋₁ : t₀ == t₁
            e₀₋₁ = F.pres-comp (C.comp (G₁ f) (G₁ g)) (G₁ h)
            e₁₋₂ : t₁ == t₂
            e₁₋₂ = ap  s  D.comp s (F₁ (G₁ h))) (F.pres-comp (G₁ f) (G₁ g))
            e₂₋₃ : t₂ == t₃
            e₂₋₃ = D.assoc (F₁ (G₁ f)) (F₁ (G₁ g)) (F₁ (G₁ h))
            e₀₋₄ : t₀ == t₄
            e₀₋₄ = ap F₁ (C.assoc (G₁ f) (G₁ g) (G₁ h))
            e₄₋₅ : t₄ == t₅
            e₄₋₅ = F.pres-comp (G₁ f) (C.comp (G₁ g) (G₁ h))
            e₅₋₃ : t₅ == t₃
            e₅₋₃ = ap (D.comp (F₁ (G₁ f))) (F.pres-comp (G₁ g) (G₁ h))
        step₁₀ : ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (! (F.pres-comp (G₁ f) (G₁ g))) ◃∙
                 ap G₁ (! (F.pres-comp (C.comp (G₁ f) (G₁ g)) (G₁ h))) ◃∙
                 ap (G₁  F₁) (C.assoc (G₁ f) (G₁ g) (G₁ h)) ◃∎
                 =ₛ
                 ap G₁ (D.assoc (F₁ (G₁ f)) (F₁ (G₁ g)) (F₁ (G₁ h))) ◃∙
                 ap (G₁  D.comp (F₁ (G₁ f))) (! (F.pres-comp (G₁ g) (G₁ h))) ◃∙
                 ap G₁ (! (F.pres-comp (G₁ f) (C.comp (G₁ g) (G₁ h)))) ◃∎
        step₁₀ =
          ap  s  G₁ (D.comp s (F₁ (G₁ h)))) (! (F.pres-comp (G₁ f) (G₁ g))) ◃∙
          ap G₁ (! (F.pres-comp (C.comp (G₁ f) (G₁ g)) (G₁ h))) ◃∙
          ap (G₁  F₁) (C.assoc (G₁ f) (G₁ g) (G₁ h)) ◃∎
            =ₛ₁⟨ 0 & 1 & ap-∘ G₁  s  D.comp s (F₁ (G₁ h))) (! (F.pres-comp (G₁ f) (G₁ g))) 
          ap G₁ (ap  s  D.comp s (F₁ (G₁ h))) (! (F.pres-comp (G₁ f) (G₁ g)))) ◃∙
          ap G₁ (! (F.pres-comp (C.comp (G₁ f) (G₁ g)) (G₁ h))) ◃∙
          ap (G₁  F₁) (C.assoc (G₁ f) (G₁ g) (G₁ h)) ◃∎
            =ₛ₁⟨ 2 & 1 & ap-∘ G₁ F₁ (C.assoc (G₁ f) (G₁ g) (G₁ h)) 
          ap G₁ (ap  s  D.comp s (F₁ (G₁ h))) (! (F.pres-comp (G₁ f) (G₁ g)))) ◃∙
          ap G₁ (! (F.pres-comp (C.comp (G₁ f) (G₁ g)) (G₁ h))) ◃∙
          ap G₁ (ap F₁ (C.assoc (G₁ f) (G₁ g) (G₁ h))) ◃∎
            =ₛ⟨ ap-seq-=ₛ G₁ step₁₀' 
          ap G₁ (D.assoc (F₁ (G₁ f)) (F₁ (G₁ g)) (F₁ (G₁ h))) ◃∙
          ap G₁ (ap (D.comp (F₁ (G₁ f))) (! (F.pres-comp (G₁ g) (G₁ h)))) ◃∙
          ap G₁ (! (F.pres-comp (G₁ f) (C.comp (G₁ g) (G₁ h)))) ◃∎
            =ₛ₁⟨ 1 & 1 & ∘-ap G₁ (D.comp (F₁ (G₁ f))) (! (F.pres-comp (G₁ g) (G₁ h))) 
          ap G₁ (D.assoc (F₁ (G₁ f)) (F₁ (G₁ g)) (F₁ (G₁ h))) ◃∙
          ap (G₁  D.comp (F₁ (G₁ f))) (! (F.pres-comp (G₁ g) (G₁ h))) ◃∙
          ap G₁ (! (F.pres-comp (G₁ f) (C.comp (G₁ g) (G₁ h)))) ◃∎ ∎ₛ
        step₁₁ :
          ap  s  G₁ (D.comp (D.comp s g) h)) (F₁-η f) ◃∙
          ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) s) h)) (F₁-η g) ◃∙
          ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) s)) (F₁-η h) ◃∙
          ap G₁ (D.assoc (F₁ (G₁ f)) (F₁ (G₁ g)) (F₁ (G₁ h))) ◃∎
          =ₛ
          ap G₁ (D.assoc f g h) ◃∙
          ap  s  G₁ (D.comp s (D.comp g h))) (F₁-η f) ◃∙
          ap  s  G₁ (D.comp (F₁ (G₁ f)) (D.comp s h))) (F₁-η g) ◃∙
          ap  s  G₁ (D.comp (F₁ (G₁ f)) (D.comp (F₁ (G₁ g)) s))) (F₁-η h) ◃∎
        step₁₁ =
          ap  s  G₁ (D.comp (D.comp s g) h)) (F₁-η f) ◃∙
          ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) s) h)) (F₁-η g) ◃∙
          ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) s)) (F₁-η h) ◃∙
          ap G₁ (D.assoc (F₁ (G₁ f)) (F₁ (G₁ g)) (F₁ (G₁ h))) ◃∎
            =ₛ⟨ 2 & 2 &
                homotopy-naturality  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) (F₁ (G₁ g))) s))
                                     s  G₁ (D.comp (F₁ (G₁ f)) (D.comp (F₁ (G₁ g)) s)))
                                     s  ap G₁ (D.assoc (F₁ (G₁ f)) (F₁ (G₁ g)) s))
                                    (F₁-η h) 
          ap  s  G₁ (D.comp (D.comp s g) h)) (F₁-η f) ◃∙
          ap  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) s) h)) (F₁-η g) ◃∙
          ap G₁ (D.assoc (F₁ (G₁ f)) (F₁ (G₁ g)) h) ◃∙
          ap  s  G₁ (D.comp (F₁ (G₁ f)) (D.comp (F₁ (G₁ g)) s))) (F₁-η h) ◃∎
            =ₛ⟨ 1 & 2 &
                homotopy-naturality  s  G₁ (D.comp (D.comp (F₁ (G₁ f)) s) h))
                                     s  G₁ (D.comp (F₁ (G₁ f)) (D.comp s h)))
                                     s  ap G₁ (D.assoc (F₁ (G₁ f)) s h))
                                    (F₁-η g) 
          ap  s  G₁ (D.comp (D.comp s g) h)) (F₁-η f) ◃∙
          ap G₁ (D.assoc (F₁ (G₁ f)) g h) ◃∙
          ap  s  G₁ (D.comp (F₁ (G₁ f)) (D.comp s h))) (F₁-η g) ◃∙
          ap  s  G₁ (D.comp (F₁ (G₁ f)) (D.comp (F₁ (G₁ g)) s))) (F₁-η h) ◃∎
            =ₛ⟨ 0 & 2 &
                homotopy-naturality  s  G₁ (D.comp (D.comp s g) h))
                                     s  G₁ (D.comp s (D.comp g h)))
                                     s  ap G₁ (D.assoc s g h))
                                    (F₁-η f) 
          ap G₁ (D.assoc f g h) ◃∙
          ap  s  G₁ (D.comp s (D.comp g h))) (F₁-η f) ◃∙
          ap  s  G₁ (D.comp (F₁ (G₁ f)) (D.comp s h))) (F₁-η g) ◃∙
          ap  s  G₁ (D.comp (F₁ (G₁ f)) (D.comp (F₁ (G₁ g)) s))) (F₁-η h) ◃∎ ∎ₛ
        step₁₂ : ap  s  G₁ (D.comp s (D.comp g h))) (F₁-η f) ◃∙
                 ap  s  G₁ (D.comp (F₁ (G₁ f)) (D.comp s h))) (F₁-η g) ◃∙
                 ap  s  G₁ (D.comp (F₁ (G₁ f)) (D.comp (F₁ (G₁ g)) s))) (F₁-η h) ◃∎
                 =ₛ
                 ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η (D.comp g h)) ◃∙
                 ap (G₁  D.comp (F₁ (G₁ f))  F₁) (ap2  s t  G₁ (D.comp s t)) (F₁-η g) (F₁-η h)) ◃∙
                 ap (G₁  D.comp (F₁ (G₁ f))) (F₁-β (D.comp (F₁ (G₁ g)) (F₁ (G₁ h)))) ◃∎
        step₁₂ =
          ap  s  G₁ (D.comp s (D.comp g h))) (F₁-η f) ◃∙
          ap  s  G₁ (D.comp (F₁ (G₁ f)) (D.comp s h))) (F₁-η g) ◃∙
          ap  s  G₁ (D.comp (F₁ (G₁ f)) (D.comp (F₁ (G₁ g)) s))) (F₁-η h) ◃∎
            =ₛ⟨ 1 & 2 & !ₛ (ap2-out  s t  G₁ (D.comp (F₁ (G₁ f)) (D.comp s t))) (F₁-η g) (F₁-η h)) 
          ap  s  G₁ (D.comp s (D.comp g h))) (F₁-η f) ◃∙
          ap2  s t  G₁ (D.comp (F₁ (G₁ f)) (D.comp s t))) (F₁-η g) (F₁-η h) ◃∎
            =ₛ₁⟨ 1 & 1 & ! (ap-ap2 (G₁  D.comp (F₁ (G₁ f))) D.comp (F₁-η g) (F₁-η h)) 
          ap  s  G₁ (D.comp s (D.comp g h))) (F₁-η f) ◃∙
          ap (G₁  D.comp (F₁ (G₁ f))) (ap2 D.comp (F₁-η g) (F₁-η h)) ◃∎
            =ₛ⟨ 2 & 0 &
                 ap-seq-=ₛ (G₁  D.comp (F₁ (G₁ f))) $
                 =ₛ-in {s = D.comp (F₁ (G₁ g)) (F₁ (G₁ h)) ∎∎}
                       {t = F₁-η (D.comp (F₁ (G₁ g)) (F₁ (G₁ h))) ◃∙
                            F₁-β (D.comp (F₁ (G₁ g)) (F₁ (G₁ h))) ◃∎}
                       (! (!-inv-l (F₁-β (D.comp (F₁ (G₁ g)) (F₁ (G₁ h)))))) 
          ap  s  G₁ (D.comp s (D.comp g h))) (F₁-η f) ◃∙
          ap (G₁  D.comp (F₁ (G₁ f))) (ap2 D.comp (F₁-η g) (F₁-η h)) ◃∙
          ap (G₁  D.comp (F₁ (G₁ f))) (F₁-η (D.comp (F₁ (G₁ g)) (F₁ (G₁ h)))) ◃∙
          ap (G₁  D.comp (F₁ (G₁ f))) (F₁-β (D.comp (F₁ (G₁ g)) (F₁ (G₁ h)))) ◃∎
            =ₛ⟨ 1 & 2 &
                homotopy-naturality (G₁  D.comp (F₁ (G₁ f)))
                                    (G₁  D.comp (F₁ (G₁ f))  F₁  G₁)
                                    (ap (G₁  D.comp (F₁ (G₁ f)))  F₁-η)
                                    (ap2 D.comp (F₁-η g) (F₁-η h)) 
          ap  s  G₁ (D.comp s (D.comp g h))) (F₁-η f) ◃∙
          ap (G₁  D.comp (F₁ (G₁ f))) (F₁-η (D.comp g h)) ◃∙
          ap (G₁  D.comp (F₁ (G₁ f))  F₁  G₁) (ap2 D.comp (F₁-η g) (F₁-η h)) ◃∙
          ap (G₁  D.comp (F₁ (G₁ f))) (F₁-β (D.comp (F₁ (G₁ g)) (F₁ (G₁ h)))) ◃∎
            =ₛ⟨ 0 & 2 & !ₛ (ap2-out  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η (D.comp g h))) 
          ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η (D.comp g h)) ◃∙
          ap  s  G₁ (D.comp (F₁ (G₁ f)) (F₁ (G₁ s)))) (ap2 D.comp (F₁-η g) (F₁-η h)) ◃∙
          ap (G₁  D.comp (F₁ (G₁ f))) (F₁-β (D.comp (F₁ (G₁ g)) (F₁ (G₁ h)))) ◃∎
            =ₛ₁⟨ 1 & 1 & ap-ap2 (G₁  D.comp (F₁ (G₁ f))  F₁  G₁) D.comp (F₁-η g) (F₁-η h) 
          ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η (D.comp g h)) ◃∙
          ap2  s t  G₁ (D.comp (F₁ (G₁ f)) (F₁ (G₁ (D.comp s t))))) (F₁-η g) (F₁-η h) ◃∙
          ap (G₁  D.comp (F₁ (G₁ f))) (F₁-β (D.comp (F₁ (G₁ g)) (F₁ (G₁ h)))) ◃∎
            =ₛ₁⟨ 1 & 1 &
                 ! (ap-ap2 (G₁  D.comp (F₁ (G₁ f))  F₁)
                            s t  G₁ (D.comp s t))
                           (F₁-η g)
                           (F₁-η h)) 
          ap2  s t  G₁ (D.comp s t)) (F₁-η f) (F₁-η (D.comp g h)) ◃∙
          ap (G₁  D.comp (F₁ (G₁ f))  F₁) (ap2  s t  G₁ (D.comp s t)) (F₁-η g) (F₁-η h)) ◃∙
          ap (G₁  D.comp (F₁ (G₁ f))) (F₁-β (D.comp (F₁ (G₁ g)) (F₁ (G₁ h)))) ◃∎ ∎ₛ

    G : TwoSemiFunctor D' C
    G =
      record
      { F₀ = G₀
      ; F₁ = G₁
      ; pres-comp = G₁-pres-comp
      ; pres-comp-coh = G₁-pres-comp-coh
      }

    module G = TwoSemiFunctor G

  module Comp = FunctorComposition N G
  open Comp using () renaming (composition to functor) public
  open TwoSemiFunctor functor public

  abstract
    pres-comp-β : {x y z : D.El} (f : D.Arr x y) (g : D.Arr y z)
       pres-comp f g ◃∎
        =ₛ
        ap G.F₁ (N.pres-comp f g) ◃∙
        G₁-pres-comp-seq (N.F₁ f) (N.F₁ g)
    pres-comp-β f g =
      pres-comp f g ◃∎
        =ₛ⟨ Comp.pres-comp-β f g 
      ap G.F₁ (N.pres-comp f g) ◃∙
      G₁-pres-comp (N.F₁ f) (N.F₁ g) ◃∎
        =ₛ⟨ 1 & 1 & G₁-pres-comp-β (N.F₁ f) (N.F₁ g) 
      ap G.F₁ (N.pres-comp f g) ◃∙
      G₁-pres-comp-seq (N.F₁ f) (N.F₁ g) ∎ₛ

open FunctorInverse
  using ()
  renaming (functor to functor-inverse) public