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

open import lib.Basics
open import 2Grp
open import 2GrpProps2
open import 2GrpPropsMap2

module 2GrpHom7 where

open CohGrp {{...}}

module MapUnit4 {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-linv : (x : G₁) 
    ! (ap  z  mu z (map x)) (map-inv x)) ◃∎
      =ₛ
    map-comp (inv x) x ◃∙
    ap map (linv x) ◃∙
    ! map-id ◃∙
    ! (linv (map x)) ◃∎)
  (map-lam-id :
    ! (lam (map id)) ◃∎
      =ₛ
    ! (ap map (lam id)) ◃∙
    ! (map-comp id id) ◃∙
    ! (ap  z  mu z (map id)) map-id) ◃∎)
  (x : G₁) where

  lam-to-rho4 =
    ! (linv (map x)) ◃∙
    ap  z  mu z (map x)) (map-inv x) ◃∙
    idp ◃∙
    map-comp (inv x) x ◃∙
    ! (ap map (ap (mu (inv x)) (rho x))) ◃∙
    ap map (al (inv x) x id  ap  z  mu z id) (linv x)) ◃∙
    ! (map-comp id id) ◃∙
    ap  z  mu z (map id))
      ((! (ap map (linv x)) 
      ! (map-comp (inv x) x) 
      ! (ap  z  mu z (map x)) (map-inv x))) 
      linv (map x)) ◃∙
    lam (map id) ◃∎
      =ₛ₁⟨ 4 & 1 & !-ap map (ap (mu (inv x)) (rho x)) 
    _
      =ₛ₁⟨ 4 & 2 & ∙-ap map (! (ap (mu (inv x)) (rho x))) (al (inv x) x id  ap  z  mu z id) (linv x)) 
    ! (linv (map x)) ◃∙
    ap  z  mu z (map x)) (map-inv x) ◃∙
    idp ◃∙
    map-comp (inv x) x ◃∙
    ap map (
      ! (ap (mu (inv x)) (rho x)) 
      al (inv x) x id 
      ap  z  mu z id) (linv x)) ◃∙
    ! (map-comp id id) ◃∙
    ap  z  mu z (map id)) (
      (! (ap map (linv x)) 
      ! (map-comp (inv x) x) 
      ! (ap  z  mu z (map x)) (map-inv x))) 
      linv (map x)) ◃∙
    lam (map id) ◃∎
      =ₛ⟨ 4 & 1 & ∙-ap-seq-=ₛ map (!ₛ (zz₁-linv-rot2 x)) 
    ! (linv (map x)) ◃∙
    ap  z  mu z (map x)) (map-inv x) ◃∙
    idp ◃∙
    map-comp (inv x) x ◃∙
    ap map (linv x) ◃∙
    ap map (! (lam id)) ◃∙
    ! (map-comp id id) ◃∙
    ap  z  mu z (map id))
      ((! (ap map (linv x)) 
      ! (map-comp (inv x) x) 
      ! (ap  z  mu z (map x)) (map-inv x))) 
      linv (map x)) ◃∙
    lam (map id) ◃∎
      =ₛ₁⟨ 5 & 1 & ap-! map (lam id) 
    ! (linv (map x)) ◃∙
    ap  z  mu z (map x)) (map-inv x) ◃∙
    idp ◃∙
    map-comp (inv x) x ◃∙
    ap map (linv x) ◃∙
    ! (ap map (lam id)) ◃∙
    ! (map-comp id id) ◃∙
    ap  z  mu z (map id)) (
      (! (ap map (linv x)) 
      ! (map-comp (inv x) x) 
      ! (ap  z  mu z (map x)) (map-inv x))) 
      linv (map x)) ◃∙
    lam (map id) ◃∎
      =ₛ⟨ 7 & 1 & ap-seq-=ₛ  z  mu z (map id)) (map-linv-rot1◃ map map-comp map-id map-inv map-linv x) 
    ! (linv (map x)) ◃∙
    ap  z  mu z (map x)) (map-inv x) ◃∙
    idp ◃∙
    map-comp (inv x) x ◃∙
    ap map (linv x) ◃∙
    ! (ap map (lam id)) ◃∙
    ! (map-comp id id) ◃∙
    ap  z  mu z (map id)) (! map-id) ◃∙
    lam (map id) ◃∎
      =ₛ₁⟨ 7 & 1 & ap-!  z  mu z (map id)) map-id 
    ! (linv (map x)) ◃∙
    ap  z  mu z (map x)) (map-inv x) ◃∙
    idp ◃∙
    map-comp (inv x) x ◃∙
    ap map (linv x) ◃∙
    ! (ap map (lam id)) ◃∙
    ! (map-comp id id) ◃∙
    ! (ap  z  mu z (map id)) map-id) ◃∙
    lam (map id) ◃∎ ∎ₛ

  lam-to-rho5 =
    ! (linv (map x)) ◃∙
    ap  z  mu z (map x)) (map-inv x) ◃∙
    idp ◃∙
    map-comp (inv x) x ◃∙
    ap map (linv x) ◃∙
    ! (ap map (lam id)) ◃∙
    ! (map-comp id id) ◃∙
    ! (ap  z  mu z (map id)) map-id) ◃∙
    lam (map id) ◃∎
      =ₛ⟨ 5 & 4 & map-lam-rot1◃ map map-comp map-id id map-lam-id 
    ! (linv (map x)) ◃∙
    ap  z  mu z (map x)) (map-inv x) ◃∙
    idp ◃∙
    map-comp (inv x) x ◃∙
    ap map (linv x) ◃∙
    idp ◃∎
      =ₛ₁⟨ 0 & 5 & ! (=ₛ-out (map-linv-rot2◃ map map-comp map-id map-inv map-linv x)) 
    map-id ◃∙
    idp ◃∎
      =ₛ₁⟨ ∙-unit-r map-id 
    map-id ◃∎ ∎ₛ