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

open import lib.Basics
open import 2Grp
open import 2GrpProps
open import 2GrpPropsMap

module 2GrpHom4 where

open CohGrp {{...}}

module MapUnit1 {i j} {G₁ : Type i} {G₂ : Type j} {{η₁ : CohGrp G₁}} {{η₂ : CohGrp G₂}}
  (map : G₁  G₂)
  (map-comp : (x y : G₁)  mu (map x) (map y) == map (mu x y))
  (map-inv : (x : G₁)  inv (map x) == map (inv x))
  (map-id : id == map id)
  (map-rinv : (x : G₁) 
    ! (ap (mu (map x)) (map-inv x)) ◃∎
      =ₛ
    map-comp x (inv x) ◃∙
    ! (ap map (rinv x)) ◃∙
    ! map-id ◃∙
    rinv (map x) ◃∎)
  (map-rho-id :
    ! (map-comp id id) ◃∎
      =ₛ
    ap map (rho id) ◃∙
    ! (rho (map id)) ◃∙
    ap (mu (map id)) map-id ◃∎)
  (x : G₁) where

  rho-to-lam4 = 
    rinv (map x) ◃∙
    ap (mu (map x)) (map-inv x) ◃∙
    map-comp x (inv x) ◃∙
    ap map (
      ! (ap  z  mu z (inv x)) (lam x)) 
      ! (al id x (inv x)) 
      ! (ap (mu id) (rinv x))) ◃∙
    ! (map-comp id id) ◃∙
    ap (mu (map id)) (
      ap map (rinv x) 
      ! (map-comp x (inv x)) 
      ! (ap (mu (map x)) (map-inv x)) 
      ! (rinv (map x))) ◃∙
    rho (map id) ◃∎
      =ₛ⟨ 3 & 1 & ∙-ap-seq-=ₛ map (zz₁-rinv-rot x) 
    rinv (map x) ◃∙
    ap (mu (map x)) (map-inv x) ◃∙
    map-comp x (inv x) ◃∙
    ap map (! (rinv x)) ◃∙
    ap map (! (rho id)) ◃∙
    ! (map-comp id id) ◃∙
    ap (mu (map id)) (
      ap map (rinv x) 
      ! (map-comp x (inv x)) 
      ! (ap (mu (map x)) (map-inv x)) 
      ! (rinv (map x))) ◃∙
    rho (map id) ◃∎
      =ₛ⟨ 3 & 2 & !-!-ap-∙◃ map (rinv x) (rho id) 
    rinv (map x) ◃∙
    ap (mu (map x)) (map-inv x) ◃∙
    map-comp x (inv x) ◃∙
    ! (ap map (rinv x)) ◃∙
    ! (ap map (rho id)) ◃∙
    ! (map-comp id id) ◃∙
    ap (mu (map id))
      (ap map (rinv x) 
      ! (map-comp x (inv x)) 
      ! (ap (mu (map x)) (map-inv x)) 
      ! (rinv (map x))) ◃∙
    rho (map id) ◃∎
      =ₛ⟨ 6 & 1 &
        ∙-ap-seq-=ₛ (mu (map id))
          (map-rinv-rot1◃ map map-comp map-id map-inv map-rinv x) 
    rinv (map x) ◃∙
    ap (mu (map x)) (map-inv x) ◃∙
    map-comp x (inv x) ◃∙
    ! (ap map (rinv x)) ◃∙
    ! (ap map (rho id)) ◃∙
    ! (map-comp id id) ◃∙
    ap (mu (map id)) (! map-id) ◃∙
    rho (map id) ◃∎
      =ₛ₁⟨ 6 & 1 & ap-! (mu (map id)) (map-id) 
    rinv (map x) ◃∙
    ap (mu (map x)) (map-inv x) ◃∙
    map-comp x (inv x) ◃∙
    ! (ap map (rinv x)) ◃∙
    ! (ap map (rho id)) ◃∙
    ! (map-comp id id) ◃∙
    ! (ap (mu (map id)) map-id) ◃∙
    rho (map id) ◃∎ ∎ₛ

  rho-to-lam5 =
    rinv (map x) ◃∙
    ap (mu (map x)) (map-inv x) ◃∙
    map-comp x (inv x) ◃∙
    ! (ap map (rinv x)) ◃∙
    ! (ap map (rho id)) ◃∙
    ! (map-comp id id) ◃∙
    ! (ap (mu (map id)) map-id) ◃∙
    rho (map id) ◃∎
      =ₛ⟨ 4 & 4 & map-rho-rot1◃ map map-comp map-id id map-rho-id 
    rinv (map x) ◃∙
    ap (mu (map x)) (map-inv x) ◃∙
    map-comp x (inv x) ◃∙
    ! (ap map (rinv x)) ◃∙
    idp ◃∎
      =ₛ⟨ 0 & 4 & !ₛ (map-rinv-rot2◃ map map-comp map-id map-inv map-rinv x) 
    map-id ◃∙ idp ◃∎
      =ₛ₁⟨ ∙-unit-r (map-id) 
    map-id ◃∎ ∎ₛ