{-# OPTIONS --without-K --rewriting --overlapping-instances --instance-search-depth=3 #-}

open import lib.Basics
open import lib.FTID
open import lib.types.Sigma
open import lib.Equivalence2
open import lib.NType2
open import 2Semigroup
open import 2Grp
open import 2GrpProps

module PostMultMap where

open CohGrp {{...}}
open WkSGrp {{...}} renaming (mu to muM; al to alM)

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

  mu-≃-map-str : WkSGrpHomStr {{sgrp η}} {{≃-2SGrp G}}  x  ((λ z  mu z x) , mu-post-iso x))
  map-comp (mu-≃-map-str) x y = pair= (λ=  v  ! (al v x y))) prop-has-all-paths-↓
  map-al (mu-≃-map-str) x y z =
    Subtype==-out (subtypeprop is-equiv) (post-rotate'-out mu-≃-map-aux)
    where
      mu-≃-map-aux :
        fst=
          (! (alM ((λ v  mu v x) , mu-post-iso x) ((λ v  mu v y) , mu-post-iso y) ((λ v  mu v z) , mu-post-iso z)) 
            ap (muM ((λ v  mu v x) , mu-post-iso x)) (pair= (λ=  v  ! (al v y z))) prop-has-all-paths-↓) 
            pair= (λ=  v  ! (al v x (muM y z)))) prop-has-all-paths-↓) ◃∙
        ! (fst=
            (ap  v  muM v ((λ v  mu v z) , mu-post-iso z))
              (pair= (λ=  v  ! (al v x y))) prop-has-all-paths-↓) 
            pair= (λ=  v  ! (al v (muM x y) z))) prop-has-all-paths-↓ 
            ! (ap  x  ((λ v  mu v x) , mu-post-iso x)) (alM x y z)))) ◃∎
          =ₛ
        []
      mu-≃-map-aux =
        fst=
          (! (alM ((λ v  mu v x) , mu-post-iso x) ((λ v  mu v y) , mu-post-iso y) ((λ v  mu v z) , mu-post-iso z)) 
            ap (muM ((λ v  mu v x) , mu-post-iso x)) (pair= (λ=  v  ! (al v y z)))
              (prop-has-all-paths-↓ {{is-equiv-level}})) 
            pair= (λ=  v  ! (al v x (muM y z)))) (prop-has-all-paths-↓ {{is-equiv-level}})) ◃∙
        ! (fst=
            (ap  v  muM v ((λ v  mu v z) , mu-post-iso z))
              (pair= (λ=  v  ! (al v x y))) (prop-has-all-paths-↓ {{is-equiv-level}})) 
            pair= (λ=  v  ! (al v (muM x y) z))) (prop-has-all-paths-↓ {{is-equiv-level}}) 
            ! (ap  x  ((λ v  mu v x) , mu-post-iso x)) (alM x y z)))) ◃∎
          =ₛ⟨ 0 & 1 &
            ap-seq-∙ fst
              (! (alM ((λ v  mu v x) , mu-post-iso x) ((λ v  mu v y) , mu-post-iso y) ((λ v  mu v z) , mu-post-iso z)) ◃∙
              ap (muM ((λ v  mu v x) , mu-post-iso x)) (pair= (λ=  v  ! (al v y z)))
                (prop-has-all-paths-↓ {{is-equiv-level}})) ◃∙
              pair= (λ=  v  ! (al v x (muM y z)))) (prop-has-all-paths-↓ {{is-equiv-level}}) ◃∎) 
        fst= (! (alM ((λ v  mu v x) , mu-post-iso x) ((λ v  mu v y) , mu-post-iso y)
          ((λ v  mu v z) , mu-post-iso z))) ◃∙
        fst= (ap (muM ((λ v  mu v x) , mu-post-iso x)) (pair= (λ=  v  ! (al v y z)))
          (prop-has-all-paths-↓ {{is-equiv-level}}))) ◃∙
        fst= (pair= (λ=  v  ! (al v x (muM y z)))) (prop-has-all-paths-↓ {{is-equiv-level}})) ◃∙
        ! (fst=
            (ap  v  muM v ((λ v  mu v z) , mu-post-iso z)) (pair= (λ=  v  ! (al v x y)))
              (prop-has-all-paths-↓ {{is-equiv-level}})) 
            pair= (λ=  v  ! (al v (muM x y) z))) (prop-has-all-paths-↓ {{is-equiv-level}}) 
            ! (ap  x  ((λ v  mu v x) , mu-post-iso x)) (alM x y z)))) ◃∎
          =ₛ₁⟨ 0 & 1 &
            ap-! fst (alM ((λ v  mu v x) , mu-post-iso x) ((λ v  mu v y) , mu-post-iso y)
              ((λ v  mu v z) , mu-post-iso z)) 
            ap ! (fst=-β idp _) 
        idp ◃∙
        fst= (ap (muM ((λ v  mu v x) , mu-post-iso x)) (pair= (λ=  v  ! (al v y z)))
          (prop-has-all-paths-↓ {{is-equiv-level}}))) ◃∙
        fst= (pair= (λ=  v  ! (al v x (muM y z)))) (prop-has-all-paths-↓ {{is-equiv-level}})) ◃∙
        ! (fst=
            (ap  v  muM v ((λ v  mu v z) , mu-post-iso z)) (pair= (λ=  v  ! (al v x y)))
              (prop-has-all-paths-↓ {{is-equiv-level}})) 
            pair= (λ=  v  ! (al v (muM x y) z))) (prop-has-all-paths-↓ {{is-equiv-level}}) 
            ! (ap  x  ((λ v  mu v x) , mu-post-iso x)) (alM x y z)))) ◃∎
          =ₛ₁⟨ 1 & 1 &
            ∘-ap fst (muM ((λ v  mu v x) , mu-post-iso x)) (pair= (λ=  v  ! (al v y z)))
              (prop-has-all-paths-↓ {{is-equiv-level}})) 
        idp ◃∙
        ap  f   z  fst f (mu z x))) (pair= (λ=  v  ! (al v y z)))
          (prop-has-all-paths-↓ {{is-equiv-level}})) ◃∙
        fst= (pair= (λ=  v  ! (al v x (muM y z)))) (prop-has-all-paths-↓ {{is-equiv-level}})) ◃∙
        ! (fst=
            (ap  v  muM v ((λ v  mu v z) , mu-post-iso z))
              (pair= (λ=  v  ! (al v x y))) (prop-has-all-paths-↓ {{is-equiv-level}})) 
            pair= (λ=  v  ! (al v (muM x y) z))) (prop-has-all-paths-↓ {{is-equiv-level}}) 
            ! (ap  x  ((λ v  mu v x) , mu-post-iso x)) (alM x y z)))) ◃∎
          =ₛ₁⟨ 1 & 1 & ap-∘  k   z  k (mu z x))) fst (pair= (λ=  v  ! (al v y z)))
            (prop-has-all-paths-↓ {{is-equiv-level}})) 
        idp ◃∙
        ap  k   z  k (mu z x))) (ap fst (pair= (λ=  v  ! (al v y z)))
          (prop-has-all-paths-↓ {{is-equiv-level}}))) ◃∙
        fst= (pair= (λ=  v  ! (al v x (muM y z)))) (prop-has-all-paths-↓ {{is-equiv-level}})) ◃∙
        ! (fst=
            (ap  v  muM v ((λ v  mu v z) , mu-post-iso z))
              (pair= (λ=  v  ! (al v x y))) (prop-has-all-paths-↓ {{is-equiv-level}})) 
            pair= (λ=  v  ! (al v (muM x y) z))) (prop-has-all-paths-↓ {{is-equiv-level}}) 
            ! (ap  x  ((λ v  mu v x) , mu-post-iso x)) (alM x y z)))) ◃∎
          =ₛ₁⟨ 1 & 1 & ap (ap  k   z  k (mu z x)))) (fst=-β (λ=  v  ! (al v y z)))  _) 
        idp ◃∙
        ap  k   z  k (mu z x))) (λ=  v  ! (al v y z))) ◃∙
        fst= (pair= (λ=  v  ! (al v x (muM y z)))) (prop-has-all-paths-↓ {{is-equiv-level}})) ◃∙
        ! (fst=
            (ap  v  muM v ((λ v  mu v z) , mu-post-iso z))
              (pair= (λ=  v  ! (al v x y))) (prop-has-all-paths-↓ {{is-equiv-level}})) 
            pair= (λ=  v  ! (al v (muM x y) z))) (prop-has-all-paths-↓ {{is-equiv-level}}) 
            ! (ap  x  ((λ v  mu v x) , mu-post-iso x)) (alM x y z)))) ◃∎
          =ₛ₁⟨ 2 & 1 & fst=-β (λ=  v  ! (al v x (muM y z)))) _ 
        idp ◃∙
        ap  k   z  k (mu z x))) (λ=  v  ! (al v y z))) ◃∙
        λ=  v  ! (al v x (muM y z))) ◃∙
        ! (fst=
            (ap  v  muM v ((λ v  mu v z) , mu-post-iso z))
              (pair= (λ=  v  ! (al v x y))) (prop-has-all-paths-↓ {{is-equiv-level}})) 
            pair= (λ=  v  ! (al v (muM x y) z))) (prop-has-all-paths-↓ {{is-equiv-level}}) 
            ! (ap  x  ((λ v  mu v x) , mu-post-iso x)) (alM x y z)))) ◃∎
          =ₛ₁⟨ 1 & 1 & pre∘-λ=  v  mu v x)  v  ! (al v y z)) 
        idp ◃∙
        λ=  v  ! (al (mu v x) y z)) ◃∙
        λ=  v  ! (al v x (muM y z))) ◃∙
        ! (fst=
            (ap  v  muM v ((λ v  mu v z) , mu-post-iso z))
              (pair= (λ=  v  ! (al v x y))) (prop-has-all-paths-↓ {{is-equiv-level}})) 
            pair= (λ=  v  ! (al v (muM x y) z))) (prop-has-all-paths-↓ {{is-equiv-level}}) 
            ! (ap  x  ((λ v  mu v x) , mu-post-iso x)) (alM x y z)))) ◃∎
          =ₛ⟨ 3 & 1 & 
            !-=ₛ (ap-seq-∙ fst
              (ap  v  muM v ((λ v  mu v z) , mu-post-iso z))
                (pair= (λ=  v  ! (al v x y))) (prop-has-all-paths-↓ {{is-equiv-level}})) ◃∙
              pair= (λ=  v  ! (al v (muM x y) z))) (prop-has-all-paths-↓ {{is-equiv-level}}) ◃∙
              ! (ap  x  ((λ v  mu v x) , mu-post-iso x)) (alM x y z)) ◃∎)) 
        idp ◃∙
        λ=  v  ! (al (mu v x) y z)) ◃∙
        λ=  v  ! (al v x (muM y z))) ◃∙
        ! (ap fst (! (ap  x  ((λ v  mu v x) , mu-post-iso x)) (alM x y z)))) ◃∙
        ! (ap fst (pair= (λ=  v  ! (al v (muM x y) z))) (prop-has-all-paths-↓ {{is-equiv-level}}))) ◃∙
        ! (ap fst (ap  v  muM v ((λ v  mu v z) , mu-post-iso z))
          (pair= (λ=  v  ! (al v x y))) (prop-has-all-paths-↓ {{is-equiv-level}})))) ◃∎
          =ₛ₁⟨ 3 & 1 &
            !-!-ap fst (ap  x  ((λ v  mu v x) , mu-post-iso x)) (alM x y z)) 
            ∘-ap fst  x  ((λ v  mu v x) , mu-post-iso x)) (alM x y z) 
        idp ◃∙
        λ=  v  ! (al (mu v x) y z)) ◃∙
        λ=  v  ! (al v x (muM y z))) ◃∙
        ap  x z  mu z x) (alM x y z) ◃∙
        ! (ap fst (pair= (λ=  v  ! (al v (muM x y) z)))
          (prop-has-all-paths-↓ {{is-equiv-level}}))) ◃∙
        ! (ap fst (ap  v  muM v ((λ v  mu v z) , mu-post-iso z))
          (pair= (λ=  v  ! (al v x y))) (prop-has-all-paths-↓ {{is-equiv-level}})))) ◃∎
          =ₛ₁⟨ 4 & 1 & ap ! (fst=-β (λ=  v  ! (al v (muM x y) z))) _) 
        idp ◃∙
        λ=  v  ! (al (mu v x) y z)) ◃∙
        λ=  v  ! (al v x (muM y z))) ◃∙
        ap  x z  mu z x) (alM x y z) ◃∙
        ! (λ=  v  ! (al v (muM x y) z))) ◃∙
        ! (ap fst (ap  v  muM v ((λ v  mu v z) , mu-post-iso z))
          (pair= (λ=  v  ! (al v x y))) (prop-has-all-paths-↓ {{is-equiv-level}})))) ◃∎
          =ₛ₁⟨ 5 & 1 &
            ap ! (
              ∘-ap fst  v  muM v ((λ v  mu v z) , mu-post-iso z))
                (pair= (λ=  v  ! (al v x y)))
                  (prop-has-all-paths-↓ {{is-equiv-level}}))) 
        idp ◃∙
        λ=  v  ! (al (mu v x) y z)) ◃∙
        λ=  v  ! (al v x (muM y z))) ◃∙
        ap  x z  mu z x) (alM x y z) ◃∙
        ! (λ=  v  ! (al v (muM x y) z))) ◃∙
        ! (ap  f  λ v  mu {{η}} (fst f v) z) (pair= (λ=  v  ! (al v x y)))
          (prop-has-all-paths-↓ {{is-equiv-level}}))) ◃∎
          =ₛ₁⟨ 5 & 1 &
            ap ! (ap-∘  k  λ v  mu (k v) z) fst (pair= (λ=  v  ! (al v x y)))
              (prop-has-all-paths-↓ {{is-equiv-level}}))) 
        idp ◃∙
        λ=  v  ! (al (mu v x) y z)) ◃∙
        λ=  v  ! (al v x (muM y z))) ◃∙
        ap  x z  mu z x) (alM x y z) ◃∙
        ! (λ=  v  ! (al v (muM x y) z))) ◃∙
        ! (ap  k  λ v  mu (k v) z)
            (ap fst (pair= (λ=  v  ! (al v x y)))
              (prop-has-all-paths-↓ {{is-equiv-level}})))) ◃∎
          =ₛ₁⟨ 5 & 1 & ap ! (ap (ap  k  λ v  mu (k v) z)) (fst=-β (λ=  v  ! (al v x y))) _)) 
        idp ◃∙
        λ=  v  ! (al (mu v x) y z)) ◃∙
        λ=  v  ! (al v x (muM y z))) ◃∙
        ap  x z  mu z x) (alM x y z) ◃∙
        ! (λ=  v  ! (al v (muM x y) z))) ◃∙
        ! (ap  k  λ v  mu (k v) z) (λ=  v  ! (al v x y)))) ◃∎
          =ₛ₁⟨ 4 & 1 &
            λ=-!  v  ! (al v (muM x y) z)) 
            ap λ= (λ=  v  !-! (al v (muM x y) z))) 
        idp ◃∙
        λ=  v  ! (al (mu v x) y z)) ◃∙
        λ=  v  ! (al v x (muM y z))) ◃∙
        ap  x z  mu z x) (alM x y z) ◃∙
        λ=  v  al v (muM x y) z) ◃∙
        ! (ap  k  λ v  mu (k v) z) (λ=  v  ! (al v x y)))) ◃∎
          =ₛ₁⟨ 5 & 1 & ap ! (post∘-λ=  v  mu v z)  v  ! (al v x y))) 
        idp ◃∙
        λ=  v  ! (al (mu v x) y z)) ◃∙
        λ=  v  ! (al v x (muM y z))) ◃∙
        ap  x z  mu z x) (alM x y z) ◃∙
        λ=  v  al v (muM x y) z) ◃∙
        ! (λ=  v  ap  v  mu v z) (! (al v x y)))) ◃∎
          =ₛ₁⟨ 5 & 1 & 
            λ=-!  v  ap  v  mu v z) (! (al v x y))) 
            ap λ= (λ=  v  !-!-ap  v  mu v z) (al v x y))) 
        idp ◃∙
        λ=  v  ! (al (mu v x) y z)) ◃∙
        λ=  v  ! (al v x (muM y z))) ◃∙
        ap  x z  mu z x) (alM x y z) ◃∙
        λ=  v  al v (muM x y) z) ◃∙
        λ=  v  ap  v  mu v z) (al v x y)) ◃∎
          =ₛ₁⟨ 3 & 1 & ap-λ=-curr (alM x y z) 
        idp ◃∙
        λ=  v  ! (al (mu v x) y z)) ◃∙
        λ=  v  ! (al v x (muM y z))) ◃∙
        λ=  v  ap (mu v) (alM x y z)) ◃∙
        λ=  v  al v (muM x y) z) ◃∙
        λ=  v  ap  u  mu u z) (al v x y)) ◃∎
          =ₛ⟨ 1 & 5 &
            ∙5-λ=
               v  ! (al (mu v x) y z))
               v  ! (al v x (muM y z)))
               v  ap (mu v) (alM x y z))
               v  al v (muM x y) z)
               v  ap  u  mu u z) (al v x y)) 
        idp ◃∙
        λ=  v 
          ! (al (mu v x) y z) 
          ! (al v x (mu y z)) 
          ap (mu v) (al x y z) 
          al v (mu x y) z 
          ap  u  mu u z) (al v x y)) ◃∎
          =ₛ₁⟨ ap λ= (λ= λ v  ! (=ₛ-out (pent-rot2 v x y z))) 
        λ=  v  idp) ◃∎
          =ₛ⟨ =ₛ-in (! (λ=-η idp)) 
        [] ∎ₛ

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

  open WkSGrpHom

  mu-≃-map : WkSGrpHom {{sgrp η}} {{≃-2SGrp G}}
  fst (map mu-≃-map x) = λ z  mu z x
  snd (map mu-≃-map x) = mu-post-iso x
  str mu-≃-map = mu-≃-map-str