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

open import lib.Basics
open import Bicategory
open import AdjEqv
open import Bicat-coher
open import Pstransf
open import Univ-bc

-- identity pseudotransformation

module Pstransf-id where

open BicatStr {{...}}
open Psfunctor-nc
open PsfunctorNcStr
open Pstrans

module _ {i₁ i₂ j₁ j₂} {B₀ : Type i₁} {C₀ : Type i₂}
  {{ξB : BicatStr j₁ B₀}} {{ξC : BicatStr j₂ C₀}} where

    Pstrans-id : {R : Psfunctor-nc {{ξB}} {{ξC}}}  Pstrans R R
    η₀ (Pstrans-id {R}) x = id₁ (map-pf R x)
    η₁ (Pstrans-id {R}) f = ! (ρ (F₁ (str-pf R) f))  lamb (F₁ (str-pf R) f)
    coher-unit (Pstrans-id {R}) {x} = =ₛ-out $
      lamb (id₁ (map-pf R x)) ◃∙
      ap  m   ξC  m  id₁ (map-pf R x)) (! (F-id₁ (str-pf R) x)) ◃∙
      (! (ρ (F₁ (str-pf R) (id₁ x)))  lamb (F₁ (str-pf R) (id₁ x))) ◃∙
      ap  m   ξC  id₁ (map-pf R x)  m) (F-id₁ (str-pf R) x) ◃∎
        =ₑ⟨ 2 & 1 & (! (ρ (F₁ (str-pf R) (id₁ x))) ◃∙ lamb (F₁ (str-pf R) (id₁ x)) ◃∎) % =ₛ-in idp 
      lamb (id₁ (map-pf R x)) ◃∙
      ap  m   ξC  m  id₁ (map-pf R x)) (! (F-id₁ (str-pf R) x)) ◃∙
      ! (ρ (F₁ (str-pf R) (id₁ x))) ◃∙
      lamb (F₁ (str-pf R) (id₁ x)) ◃∙
      ap  m   ξC  id₁ (map-pf R x)  m) (F-id₁ (str-pf R) x) ◃∎
        =ₛ⟨ 3 & 2 & !ₛ (homotopy-naturality _ _ lamb (F-id₁ (str-pf R) x)) 
      lamb (id₁ (map-pf R x)) ◃∙
      ap  m   ξC  m  id₁ (map-pf R x)) (! (F-id₁ (str-pf R) x)) ◃∙
      ! (ρ (F₁ (str-pf R) (id₁ x))) ◃∙
      ap  m  m) (F-id₁ (str-pf R) x) ◃∙
      lamb (id₁ (map-pf R x)) ◃∎
        =ₛ₁⟨ 1 & 1 & ap-!  m   ξC  m  id₁ (map-pf R x)) (F-id₁ (str-pf R) x) 
      lamb (id₁ (map-pf R x)) ◃∙
      ! (ap  m   ξC  m  id₁ (map-pf R x)) (F-id₁ (str-pf R) x)) ◃∙
      ! (ρ (F₁ (str-pf R) (id₁ x))) ◃∙
      ap  m  m) (F-id₁ (str-pf R) x) ◃∙
      lamb (id₁ (map-pf R x)) ◃∎
        =ₛ⟨ 1 & 3 & !ₛ (apCommSq2◃! ρ (F-id₁ (str-pf R) x)) 
      lamb (id₁ (map-pf R x)) ◃∙
      ! (ρ (id₁ (map-pf R x))) ◃∙
      lamb (id₁ (map-pf R x)) ◃∎
        =ₛ₁⟨ 0 & 1 & lamb-ρ-id₁-bc 
      ρ (id₁ (map-pf R x)) ◃∙
      ! (ρ (id₁ (map-pf R x))) ◃∙
      lamb (id₁ (map-pf R x)) ◃∎
        =ₛ₁⟨ 0 & 2 & !-inv-r (ρ (id₁ (map-pf R x))) 
      idp ◃∙
      lamb (id₁ (map-pf R x)) ◃∎
        =ₛ₁⟨ lamb-ρ-id₁-bc 
      ρ (id₁ (map-pf R x)) ◃∎ ∎ₛ 
    coher-assoc (Pstrans-id {R}) {x} {y} {z} f g = =ₛ-out $
      ! (! (ρ (F₁ (str-pf R) ( ξB  g  f)))  lamb (F₁ (str-pf R) ( ξB  g  f))) ◃∙
      ap  m   ξC  m  id₁ (map-pf R x)) (F-◻ (str-pf R) f g) ◃∙
      ! (α (F₁ (str-pf R) g) (F₁ (str-pf R) f) (id₁ (map-pf R x))) ◃∙
      ap  m   ξC  F₁ (str-pf R) g  m) (! (ρ (F₁ (str-pf R) f))  lamb (F₁ (str-pf R) f)) ◃∙
      α (F₁ (str-pf R) g) (id₁ (map-pf R y)) (F₁ (str-pf R) f) ◃∙
      ap  m   ξC  m  F₁ (str-pf R) f) (! (ρ (F₁ (str-pf R) g))  lamb (F₁ (str-pf R) g)) ◃∙
      ! (α (id₁ (map-pf R z)) (F₁ (str-pf R) g) (F₁ (str-pf R) f)) ◃∙
      ! (ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g)) ◃∎
        =ₛ⟨ 5 & 1 &
          ap-!∙◃  m   ξC  m  F₁ (str-pf R) f) (ρ (F₁ (str-pf R) g)) (lamb (F₁ (str-pf R) g)) 
      ! (! (ρ (F₁ (str-pf R) ( ξB  g  f)))  lamb (F₁ (str-pf R) ( ξB  g  f))) ◃∙
      ap  m   ξC  m  id₁ (map-pf R x)) (F-◻ (str-pf R) f g) ◃∙
      ! (α (F₁ (str-pf R) g) (F₁ (str-pf R) f) (id₁ (map-pf R x))) ◃∙
      ap  m   ξC  F₁ (str-pf R) g  m) (! (ρ (F₁ (str-pf R) f))  lamb (F₁ (str-pf R) f)) ◃∙
      α (F₁ (str-pf R) g) (id₁ (map-pf R y)) (F₁ (str-pf R) f) ◃∙
      ! (ap  m   ξC  m  F₁ (str-pf R) f) (ρ (F₁ (str-pf R) g))) ◃∙
      ap  m   ξC  m  F₁ (str-pf R) f) (lamb (F₁ (str-pf R) g)) ◃∙
      ! (α (id₁ (map-pf R z)) (F₁ (str-pf R) g) (F₁ (str-pf R) f)) ◃∙
      ! (ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g)) ◃∎
        =ₛ⟨ 3 & 1 &
          ap-!∙◃  m   ξC  F₁ (str-pf R) g  m) (ρ (F₁ (str-pf R) f)) (lamb (F₁ (str-pf R) f)) 
      ! (! (ρ (F₁ (str-pf R) ( ξB  g  f)))  lamb (F₁ (str-pf R) ( ξB  g  f))) ◃∙
      ap  m   ξC  m  id₁ (map-pf R x)) (F-◻ (str-pf R) f g) ◃∙
      ! (α (F₁ (str-pf R) g) (F₁ (str-pf R) f) (id₁ (map-pf R x))) ◃∙
      ! (ap  m   ξC  F₁ (str-pf R) g  m) (ρ (F₁ (str-pf R) f))) ◃∙
      ap  m   ξC  F₁ (str-pf R) g  m) (lamb (F₁ (str-pf R) f)) ◃∙
      α (F₁ (str-pf R) g) (id₁ (map-pf R y)) (F₁ (str-pf R) f) ◃∙
      ! (ap  m   ξC  m  F₁ (str-pf R) f) (ρ (F₁ (str-pf R) g))) ◃∙
      ap  m   ξC  m  F₁ (str-pf R) f) (lamb (F₁ (str-pf R) g)) ◃∙
      ! (α (id₁ (map-pf R z)) (F₁ (str-pf R) g) (F₁ (str-pf R) f)) ◃∙
      ! (ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g)) ◃∎
        =ₛ⟨ 0 & 1 & !-!-∙ (ρ (F₁ (str-pf R) ( ξB  g  f))) (lamb (F₁ (str-pf R) ( ξB  g  f))) 
      ! (lamb (F₁ (str-pf R) ( ξB  g  f))) ◃∙
      ρ (F₁ (str-pf R) ( ξB  g  f)) ◃∙
      ap  m   ξC  m  id₁ (map-pf R x)) (F-◻ (str-pf R) f g) ◃∙
      ! (α (F₁ (str-pf R) g) (F₁ (str-pf R) f) (id₁ (map-pf R x))) ◃∙
      ! (ap  m   ξC  F₁ (str-pf R) g  m) (ρ (F₁ (str-pf R) f))) ◃∙
      ap  m   ξC  F₁ (str-pf R) g  m) (lamb (F₁ (str-pf R) f)) ◃∙
      α (F₁ (str-pf R) g) (id₁ (map-pf R y)) (F₁ (str-pf R) f) ◃∙
      ! (ap  m   ξC  m  F₁ (str-pf R) f) (ρ (F₁ (str-pf R) g))) ◃∙
      ap  m   ξC  m  F₁ (str-pf R) f) (lamb (F₁ (str-pf R) g)) ◃∙
      ! (α (id₁ (map-pf R z)) (F₁ (str-pf R) g) (F₁ (str-pf R) f)) ◃∙
      ! (ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g)) ◃∎
        =ₛ⟨ 1 & 2 & !ₛ (homotopy-naturality _ _ ρ (F-◻ (str-pf R) f g)) 
      ! (lamb (F₁ (str-pf R) ( ξB  g  f))) ◃∙
      ap  m  m) (F-◻ (str-pf R) f g) ◃∙
      ρ ( ξC  F₁ (str-pf R) g  F₁ (str-pf R) f) ◃∙
      ! (α (F₁ (str-pf R) g) (F₁ (str-pf R) f) (id₁ (map-pf R x))) ◃∙
      ! (ap  m   ξC  F₁ (str-pf R) g  m) (ρ (F₁ (str-pf R) f))) ◃∙
      ap  m   ξC  F₁ (str-pf R) g  m) (lamb (F₁ (str-pf R) f)) ◃∙
      α (F₁ (str-pf R) g) (id₁ (map-pf R y)) (F₁ (str-pf R) f) ◃∙
      ! (ap  m   ξC  m  F₁ (str-pf R) f) (ρ (F₁ (str-pf R) g))) ◃∙
      ap  m   ξC  m  F₁ (str-pf R) f) (lamb (F₁ (str-pf R) g)) ◃∙
      ! (α (id₁ (map-pf R z)) (F₁ (str-pf R) g) (F₁ (str-pf R) f)) ◃∙
      ! (ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g)) ◃∎
        =ₛ⟨ 0 & 2 & homotopy-naturality-! lamb (F-◻ (str-pf R) f g) 
      ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g) ◃∙
      ! (lamb ( ξC  F₁ (str-pf R) g  F₁ (str-pf R) f)) ◃∙
      ρ ( ξC  F₁ (str-pf R) g  F₁ (str-pf R) f) ◃∙
      ! (α (F₁ (str-pf R) g) (F₁ (str-pf R) f) (id₁ (map-pf R x))) ◃∙
      ! (ap  m   ξC  F₁ (str-pf R) g  m) (ρ (F₁ (str-pf R) f))) ◃∙
      ap  m   ξC  F₁ (str-pf R) g  m) (lamb (F₁ (str-pf R) f)) ◃∙
      α (F₁ (str-pf R) g) (id₁ (map-pf R y)) (F₁ (str-pf R) f) ◃∙
      ! (ap  m   ξC  m  F₁ (str-pf R) f) (ρ (F₁ (str-pf R) g))) ◃∙
      ap  m   ξC  m  F₁ (str-pf R) f) (lamb (F₁ (str-pf R) g)) ◃∙
      ! (α (id₁ (map-pf R z)) (F₁ (str-pf R) g) (F₁ (str-pf R) f)) ◃∙
      ! (ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g)) ◃∎
        =ₛ⟨ 2 & 3 & trig-ρ-bc-rot-pre (F₁ (str-pf R) g) (F₁ (str-pf R) f) 
      ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g) ◃∙
      ! (lamb ( ξC  F₁ (str-pf R) g  F₁ (str-pf R) f)) ◃∙
      ap  m   ξC  F₁ (str-pf R) g  m) (lamb (F₁ (str-pf R) f)) ◃∙
      α (F₁ (str-pf R) g) (id₁ (map-pf R y)) (F₁ (str-pf R) f) ◃∙
      ! (ap  m   ξC  m  F₁ (str-pf R) f) (ρ (F₁ (str-pf R) g))) ◃∙
      ap  m   ξC  m  F₁ (str-pf R) f) (lamb (F₁ (str-pf R) g)) ◃∙
      ! (α (id₁ (map-pf R z)) (F₁ (str-pf R) g) (F₁ (str-pf R) f)) ◃∙
      ! (ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g)) ◃∎
        =ₛ⟨ 2 & 3 & tri-bc◃-rot2-pre (F₁ (str-pf R) f) (F₁ (str-pf R) g) 
      ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g) ◃∙
      ! (lamb ( ξC  F₁ (str-pf R) g  F₁ (str-pf R) f)) ◃∙
      ap  m   ξC  m  F₁ (str-pf R) f) (lamb (F₁ (str-pf R) g)) ◃∙
      ! (α (id₁ (map-pf R z)) (F₁ (str-pf R) g) (F₁ (str-pf R) f)) ◃∙
      ! (ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g)) ◃∎
        =ₛ⟨ 1 & 3 & trig-lamb-bc-rot3 (F₁ (str-pf R) g) (F₁ (str-pf R) f) 
      ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g) ◃∙
      ! (ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g)) ◃∎
        =ₛ₁⟨ !-inv-r (ap  m   ξC  id₁ (map-pf R z)  m) (F-◻ (str-pf R) f g)) 
      idp ◃∎ ∎ₛ

    ps-≃-id : {R : Psfunctor-nc {{ξB}} {{ξC}}}  R psf-≃ R
    fst (ps-≃-id {R}) = Pstrans-id {R}
    snd ps-≃-id _ = snd AdjEqv-id₁