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

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

module 2GrpProps2 where

open CohGrp {{...}}

module _ {i} {G : Type i} {{η : CohGrp G}} where

  module _ (y x : G) where
      
    rho-alid-rho0 =
      ap  z  mu z id) (! (rho (mu y x))) ◃∙
      ap  z  mu z id) (! (al y x id)) ◃∙
      ap  z  mu z id) (ap (mu y) (rho x)) ◃∎
        =ₛ⟨ 0 & 2 & !-!-ap-∙◃  z  mu z id) (rho (mu y x)) (al y x id) 
      ! (ap  z  mu z id) (rho (mu y x))) ◃∙
      ! (ap  z  mu z id) (al y x id)) ◃∙
      ap  z  mu z id) (ap (mu y) (rho x)) ◃∎
        =ₛ₁⟨ 2 & 1 & ∘-ap  z  mu z id) (mu y) (rho x) 
      ! (ap  z  mu z id) (rho (mu y x))) ◃∙
      ! (ap  z  mu z id) (al y x id)) ◃∙
      ap  z  mu (mu y z) id) (rho x) ◃∎
        =ₛ⟨ 2 & 1 & apCommSq◃  z  al y z id) (rho x) 
      ! (ap  z  mu z id) (rho (mu y x))) ◃∙
      ! (ap  z  mu z id) (al y x id)) ◃∙
      ! (al y (mu x id) id) ◃∙
      ap  z  mu y (mu z id)) (rho x) ◃∙
      al y x id ◃∎
        =ₛ₁⟨ 3 & 1 & ap-∘ (mu y)  z  mu z id) (rho x) 
      _
        =ₑ⟨ 3 & 1 & (ap (mu y) (! (al x id id)) ◃∙ ap (mu y) (ap (mu x) (lam id)) ◃∎)
          % ap-seq-=ₛ (mu y) (=ₛ-in (tr x id)) 
      ! (ap  z  mu z id) (rho (mu y x))) ◃∙
      ! (ap  z  mu z id) (al y x id)) ◃∙
      ! (al y (mu x id) id) ◃∙
      ap (mu y) (! (al x id id)) ◃∙
      ap (mu y) (ap (mu x) (lam id)) ◃∙
      al y x id ◃∎
        =ₛ₁⟨ 4 & 1 & ∘-ap (mu y) (mu x) (lam id) 
      _
        =ₛ⟨ 4 & 1 & hmtpy-nat-∙◃ (al y x) (lam id) 
      ! (ap  z  mu z id) (rho (mu y x))) ◃∙
      ! (ap  z  mu z id) (al y x id)) ◃∙
      ! (al y (mu x id) id) ◃∙
      ap (mu y) (! (al x id id)) ◃∙
      al y x (mu id id) ◃∙
      ap (mu (mu y x)) (lam id) ◃∙
      ! (al y x id) ◃∙
      al y x id ◃∎
        =ₛ⟨ 5 & 1 & !ₛ (tr-rot (mu y x) id) 
      ! (ap  z  mu z id) (rho (mu y x))) ◃∙
      ! (ap  z  mu z id) (al y x id)) ◃∙
      ! (al y (mu x id) id) ◃∙
      ap (mu y) (! (al x id id)) ◃∙
      al y x (mu id id) ◃∙
      al (mu y x) id id ◃∙
      ap  z  mu z id) (rho (mu y x)) ◃∙
      ! (al y x id) ◃∙
      al y x id ◃∎ ∎ₛ

    rho-alid-rho1 =
      ! (ap  z  mu z id) (rho (mu y x))) ◃∙
      ! (ap  z  mu z id) (al y x id)) ◃∙
      ! (al y (mu x id) id) ◃∙
      ap (mu y) (! (al x id id)) ◃∙
      al y x (mu id id) ◃∙
      al (mu y x) id id ◃∙
      ap  z  mu z id) (rho (mu y x)) ◃∙
      ! (al y x id) ◃∙
      al y x id ◃∎
        =ₛ₁⟨ 3 & 1 & ap-! (mu y) (al x id id) 
      ! (ap  z  mu z id) (rho (mu y x))) ◃∙
      ! (ap  z  mu z id) (al y x id)) ◃∙
      ! (al y (mu x id) id) ◃∙
      ! (ap (mu y) (al x id id)) ◃∙
      al y x (mu id id) ◃∙
      al (mu y x) id id ◃∙
      ap  z  mu z id) (rho (mu y x)) ◃∙
      ! (al y x id) ◃∙
      al y x id ◃∎
        =ₑ⟨ 4 & 2 & (ap (mu y) (al x id id) ◃∙ al y (mu x id) id ◃∙ ap  v  mu v id) (al y x id) ◃∎)
          % =ₛ-in (pent y x id id) 
      ! (ap  z  mu z id) (rho (mu y x))) ◃∙
      ! (ap  z  mu z id) (al y x id)) ◃∙
      ! (al y (mu x id) id) ◃∙
      ! (ap (mu y) (al x id id)) ◃∙
      ap (mu y) (al x id id) ◃∙
      al y (mu x id) id ◃∙
      ap  v  mu v id) (al y x id) ◃∙
      ap  z  mu z id) (rho (mu y x)) ◃∙
      ! (al y x id) ◃∙
      al y x id ◃∎
        =ₛ₁⟨ 3 & 2 & !-inv-l (ap (mu y) (al x id id)) 
      ! (ap  z  mu z id) (rho (mu y x))) ◃∙
      ! (ap  z  mu z id) (al y x id)) ◃∙
      ! (al y (mu x id) id) ◃∙
      idp ◃∙
      al y (mu x id) id ◃∙
      ap  v  mu v id) (al y x id) ◃∙
      ap  z  mu z id) (rho (mu y x)) ◃∙
      ! (al y x id) ◃∙
      al y x id ◃∎
        =ₛ₁⟨ 2 & 3 & !-inv-l (al y (mu x id) id) 
      ! (ap  z  mu z id) (rho (mu y x))) ◃∙
      ! (ap  z  mu z id) (al y x id)) ◃∙
      idp ◃∙
      ap  v  mu v id) (al y x id) ◃∙
      ap  z  mu z id) (rho (mu y x)) ◃∙
      ! (al y x id) ◃∙
      al y x id ◃∎
        =ₛ₁⟨ 1 & 3 & !-inv-l (ap  z  mu z id) (al y x id)) 
      ! (ap  z  mu z id) (rho (mu y x))) ◃∙
      idp ◃∙
      ap  z  mu z id) (rho (mu y x)) ◃∙
      ! (al y x id) ◃∙
      al y x id ◃∎
        =ₛ₁⟨ 0 & 3 & !-inv-l (ap  z  mu z id) (rho (mu y x))) 
      idp ◃∙
      ! (al y x id) ◃∙
      al y x id ◃∎
        =ₛ₁⟨ !-inv-l (al y x id) 
      idp ◃∎ ∎ₛ

    module Rho-alid-rho where

      abstract
        rho-alid-rho2 :
          ap  z  mu z id) (
            ! (rho (mu y x)) 
            ! (al y x id) 
            ap (mu y) (rho x)) ◃∎
            =ₛ
          idp ◃∎
        rho-alid-rho2 = ap-seq-∙  z  mu z id) _ ∙ₛ rho-alid-rho0 ∙ₛ rho-alid-rho1

      abstract
        rho-alid-rho :
          ! (rho (mu y x)) ◃∙
          ! (al y x id) ◃∙
          ap (mu y) (rho x) ◃∎
            =ₛ
          idp ◃∎
        rho-alid-rho = =ₛ-in (ap-equiv-idp idmu-iso (=ₛ-out rho-alid-rho2))

    open Rho-alid-rho public

  abstract
    zz₁-rot2◃ : (x : G)  
      al x (inv x) x ◃∙
      ! (ap  z  mu z x) (rinv x)) ◃∙
      lam x ◃∎
        =ₛ
      ap (mu x) (linv x) ◃∙
      rho x ◃∎
    zz₁-rot2◃ x = pre-rotate-out (pre-rotate'-in (=ₛ-in (zz₁ x)))

  module ZZ-linv-suff (x : G) where

    abstract

      zz₁-linv-aux :
        linv x ◃∎
          =ₛ
        ! (al (inv x) x (mu (inv x) x) 
          ap2 mu (linv x) idp 
          lam (mu (inv x) x)) ◃∙
        ap (mu (inv x))
          (al x (inv x) x 
          ! (ap  z  mu z x) (rinv x)) 
          lam x 
          ! (rho x)) ◃∙
        al (inv x) x id ◃∙
        ap2 mu (linv x) idp ◃∙
        lam id ◃∎
      zz₁-linv-aux =
        linv x ◃∎
          =ₛ⟨ =ₛ-in (
              ! (<–-inv-l (ap-equiv (mu x , mu-pre-iso x) _ _) (linv x)) 
                ap (mu-pre-ff<– x (mu (inv x) x) id)
                  (tri-rot2 (ap  z  mu z x) (rinv x)) (al x (inv x) x) (ap (mu x) (linv x)) (rho x) (zz₁ x))) 
        ! (al (inv x) x (mu (inv x) x) 
          ap2 mu (linv x) idp 
          lam (mu (inv x) x)) ◃∙
        ap (mu (inv x))
          (al x (inv x) x 
          ! (ap  z  mu z x) (rinv x)) 
          lam x 
          ! (rho x)) ◃∙
        al (inv x) x id ◃∙
        ap2 mu (linv x) idp ◃∙
        lam id ◃∎ ∎ₛ

      zz₁-linv-suff :
        ! (al (inv x) x (mu (inv x) x) 
          ap2 mu (linv x) idp 
          lam (mu (inv x) x)) ◃∙
        ap (mu (inv x)) (al x (inv x) x) ◃∙
        ap (mu (inv x)) (! (ap  z  mu z x) (rinv x))) ◃∙
        ap (mu (inv x)) (lam x) ◃∎
          =ₛ
        idp ◃∎
      zz₁-linv-suff = 
        ! (al (inv x) x (mu (inv x) x) 
          ap2 mu (linv x) idp 
          lam (mu (inv x) x)) ◃∙
        ap (mu (inv x)) (al x (inv x) x) ◃∙
        ap (mu (inv x)) (! (ap  z  mu z x) (rinv x))) ◃∙
        ap (mu (inv x)) (lam x) ◃∎
          =ₛ⟨ 1 & 3 & ∙-ap-seq (mu (inv x)) (al x (inv x) x ◃∙ ! (ap  z  mu z x) (rinv x)) ◃∙ lam x ◃∎) 
        _
          =ₛ₁⟨ 1 & 1 & ap (ap (mu (inv x))) (=ₛ-out (zz₁-rot2◃ x)) 
        ! (al (inv x) x (mu (inv x) x) 
          ap2 mu (linv x) idp 
          lam (mu (inv x) x)) ◃∙
        ap (mu (inv x)) (ap (mu x) (linv x)  rho x) ◃∎
          =ₛ⟨ 0 & 1 & apCommSq2◃-rev  z  ! (al (inv x) x z  ap2 mu (linv x) idp  lam z)) (linv x) 
        ap  z  z) (linv x) ◃∙
        ! (al (inv x) x id  ap2 mu (linv x) idp  lam id) ◃∙
        ! (ap  z  mu (inv x) (mu x z)) (linv x)) ◃∙
        ap (mu (inv x)) (ap (mu x) (linv x)  rho x) ◃∎
          =ₛ⟨ 1 & 1 & !-∙-seq (al (inv x) x id ◃∙ ap2 mu (linv x) idp ◃∙ lam id ◃∎) 
        ap  z  z) (linv x) ◃∙
        ! (lam id) ◃∙
        ! (ap2 mu (linv x) idp) ◃∙
        ! (al (inv x) x id) ◃∙
        ! (ap  z  mu (inv x) (mu x z)) (linv x)) ◃∙
        ap (mu (inv x)) (ap (mu x) (linv x)  rho x) ◃∎
          =ₛ₁⟨ 2 & 1 & ap ! (ap2-idp-r mu (linv x)) 
        ap  z  z) (linv x) ◃∙
        ! (lam id) ◃∙
        ! (ap  z  mu z id) (linv x)) ◃∙
        ! (al (inv x) x id) ◃∙
        ! (ap  z  mu (inv x) (mu x z)) (linv x)) ◃∙
        ap (mu (inv x)) (ap (mu x) (linv x)  rho x) ◃∎
          =ₛ⟨ 2 & 1 & hmtpy-nat-∙◃! rho (linv x) 
        ap  z  z) (linv x) ◃∙
        ! (lam id) ◃∙
        rho id ◃∙
        ! (ap  z  z) (linv x)) ◃∙
        ! (rho (mu (inv x) x)) ◃∙
        ! (al (inv x) x id) ◃∙
        ! (ap  z  mu (inv x) (mu x z)) (linv x)) ◃∙
        ap (mu (inv x)) (ap (mu x) (linv x)  rho x) ◃∎
          =ₛ₁⟨ 1 & 1 & ap ! (! (=ₛ-out rho-lam-id-eq)) 
        ap  z  z) (linv x) ◃∙
        ! (rho id) ◃∙
        rho id ◃∙
        ! (ap  z  z) (linv x)) ◃∙
        ! (rho (mu (inv x) x)) ◃∙
        ! (al (inv x) x id) ◃∙
        ! (ap  z  mu (inv x) (mu x z)) (linv x)) ◃∙
        ap (mu (inv x)) (ap (mu x) (linv x)  rho x) ◃∎
          =ₛ₁⟨ 1 & 2 & !-inv-l (rho id) 
        ap  z  z) (linv x) ◃∙
        idp ◃∙
        ! (ap  z  z) (linv x)) ◃∙
        ! (rho (mu (inv x) x)) ◃∙
        ! (al (inv x) x id) ◃∙
        ! (ap  z  mu (inv x) (mu x z)) (linv x)) ◃∙
        ap (mu (inv x)) (ap (mu x) (linv x)  rho x) ◃∎
          =ₛ₁⟨ 0 & 3 & !-inv-r (ap  z  z) (linv x)) 
        idp ◃∙
        ! (rho (mu (inv x) x)) ◃∙
        ! (al (inv x) x id) ◃∙
        ! (ap  z  mu (inv x) (mu x z)) (linv x)) ◃∙
        ap (mu (inv x)) (ap (mu x) (linv x)  rho x) ◃∎
          =ₛ⟨ 4 & 1 & ap-∙◃ (mu (inv x)) (ap (mu x) (linv x)) (rho x) 
        idp ◃∙
        ! (rho (mu (inv x) x)) ◃∙
        ! (al (inv x) x id) ◃∙
        ! (ap  z  mu (inv x) (mu x z)) (linv x)) ◃∙
        ap (mu (inv x)) (ap (mu x) (linv x)) ◃∙
        ap (mu (inv x)) (rho x) ◃∎
          =ₛ₁⟨ 4 & 1 & ∘-ap (mu (inv x)) (mu x) (linv x) 
        _
          =ₛ₁⟨ 3 & 2 & !-inv-l (ap  z  mu (inv x) (mu x z)) (linv x)) 
        idp ◃∙
        ! (rho (mu (inv x) x)) ◃∙
        ! (al (inv x) x id) ◃∙
        idp ◃∙
        ap (mu (inv x)) (rho x) ◃∎
          =ₛ₁⟨ =ₛ-out (rho-alid-rho (inv x) x) 
        idp ◃∎ ∎ₛ

  module ZZ-linv (x : G) where

    open ZZ-linv-suff

    abstract
      zz₁-linv :
        linv x ◃∎
          =ₛ
        ! (ap (mu (inv x)) (rho x)) ◃∙
        al (inv x) x id ◃∙
        ap2 mu (linv x) idp ◃∙
        lam id ◃∎
      zz₁-linv =
        linv x ◃∎
          =ₛ⟨ zz₁-linv-aux x 
        ! (al (inv x) x (mu (inv x) x) 
          ap2 mu (linv x) idp 
          lam (mu (inv x) x)) ◃∙
        ap (mu (inv x))
          (al x (inv x) x 
          ! (ap  z  mu z x) (rinv x)) 
          lam x 
          ! (rho x)) ◃∙
        al (inv x) x id ◃∙
        ap2 mu (linv x) idp ◃∙
        lam id ◃∎
          =ₛ⟨ 1 & 1 &
            ap-seq-∙ (mu (inv x))
              (al x (inv x) x ◃∙ ! (ap  z  mu z x) (rinv x)) ◃∙ lam x ◃∙ ! (rho x) ◃∎) 
        _
          =ₛ⟨ 0 & 4 & zz₁-linv-suff x 
        idp ◃∙
        ap (mu (inv x)) (! (rho x)) ◃∙
        al (inv x) x id ◃∙
        ap2 mu (linv x) idp ◃∙
        lam id ◃∎
          =ₛ₁⟨ 0 & 2 & ap-! (mu (inv x)) (rho x) 
        ! (ap (mu (inv x)) (rho x)) ◃∙
        al (inv x) x id ◃∙
        ap2 mu (linv x) idp ◃∙
        lam id ◃∎ ∎ₛ

  open ZZ-linv public

  module ZZ-linv-rot (x : G) where

    abstract
      zz₁-linv-rot1 :
        ! (lam id) ◃∙
        ! (ap2 mu (linv x) idp) ◃∙
        ! (al (inv x) x id) ◃∙
        ap (mu (inv x)) (rho x) ◃∎
          =ₛ
        ! (linv x) ◃∎
      zz₁-linv-rot1 = post-rotate-in (pre-rotate'-in (pre-rotate'-in (pre-rotate'-in (pre-rotate-out (zz₁-linv x)))))

      zz₁-linv-rot2 :
        linv x ◃∙
        ! (lam id) ◃∎
          =ₛ
        ! (ap (mu (inv x)) (rho x)) ◃∙
        al (inv x) x id ◃∙
        ap  z  mu z id) (linv x) ◃∎
      zz₁-linv-rot2 =  
        linv x ◃∙
        ! (lam id) ◃∎
          =ₛ⟨ post-rotate'-in (zz₁-linv x) 
        ! (ap (mu (inv x)) (rho x)) ◃∙
        al (inv x) x id ◃∙
        ap2 mu (linv x) idp ◃∎
          =ₛ₁⟨ 2 & 1 & ap2-idp-r mu (linv x) 
        ! (ap (mu (inv x)) (rho x)) ◃∙
        al (inv x) x id ◃∙
        ap  z  mu z id) (linv x) ◃∎ ∎ₛ

  open ZZ-linv-rot public