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

open import lib.Base
open import lib.PathGroupoid
open import lib.PathFunctor
open import lib.path-seq.Ap
open import lib.path-seq.Inversion
open import lib.path-seq.Reasoning

module lib.PathFunctor2 where

module _ {ℓ₁ ℓ₂} {A : Type ℓ₁} {B : Type ℓ₂} {x y : A} (p : x == y) where

    hnat-∙'-∙3 : {f₁ f₂ f₃ f₄ : A  B}
      (H₁ : (x : A)  f₁ x == f₂ x) (H₂ : (x : A)  f₂ x == f₃ x) (H₃ : (x : A)  f₃ x == f₄ x)
      
      hmtpy-nat-∙'  x  H₁ x  H₂ x  H₃ x) p ◃∎
        =ₛ
      hmtpy-nat-∙' H₁ p ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y)) (hmtpy-nat-∙' H₂ p) ◃∙
      ap ((λ q  H₁ x  q ∙' ! (H₁ y))   q  H₂ x  q ∙' ! (H₂ y))) (hmtpy-nat-∙' H₃ p) ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y)) (hnat-∙'̇-∙-aux (H₂ x) (H₃ x) (ap  z  f₄ z) p) (H₃ y) (H₂ y)) ◃∙
      hnat-∙'̇-∙-aux (H₁ x) (H₂ x  H₃ x) (ap  z  f₄ z) p) (H₂ y  H₃ y) (H₁ y) ◃∎
    hnat-∙'-∙3 {f₄ = f₄} H₁ H₂ H₃ =
      hmtpy-nat-∙'  x  H₁ x  H₂ x  H₃ x) p ◃∎
        =ₛ⟨ hnat-∙'-∙ H₁  x  H₂ x  H₃ x) p 
      _
        =ₛ⟨ 1 & 1 & ap-seq-=ₛ  q  H₁ x  q ∙' ! (H₁ y)) (hnat-∙'-∙ H₂ H₃ p) 
      _
        =ₛ₁⟨ 2 & 1 & ∘-ap  q  H₁ x  q ∙' ! (H₁ y))  q  H₂ x  q ∙' ! (H₂ y)) (hmtpy-nat-∙' H₃ p) 
      hmtpy-nat-∙' H₁ p ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y)) (hmtpy-nat-∙' H₂ p) ◃∙
      ap ((λ q  H₁ x  q ∙' ! (H₁ y))   q  H₂ x  q ∙' ! (H₂ y))) (hmtpy-nat-∙' H₃ p) ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y)) (hnat-∙'̇-∙-aux (H₂ x) (H₃ x) (ap  z  f₄ z) p) (H₃ y) (H₂ y)) ◃∙
      hnat-∙'̇-∙-aux (H₁ x) (H₂ x  H₃ x) (ap  z  f₄ z) p) (H₂ y  H₃ y) (H₁ y) ◃∎ ∎ₛ

    hnat-∙'-∙4 : {f₁ f₂ f₃ f₄ f₅ : A  B}
      (H₁ : (x : A)  f₁ x == f₂ x) (H₂ : (x : A)  f₂ x == f₃ x) (H₃ : (x : A)  f₃ x == f₄ x)
      (H₄ : (x : A)  f₄ x == f₅ x)
      
      hmtpy-nat-∙'  x  H₁ x  H₂ x  H₃ x  H₄ x) p ◃∎
        =ₛ
      hmtpy-nat-∙' H₁ p ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y)) (hmtpy-nat-∙' H₂ p) ◃∙
      ap ((λ q  H₁ x  q ∙' ! (H₁ y))   q  H₂ x  q ∙' ! (H₂ y))) (hmtpy-nat-∙' H₃ p) ◃∙
      ap ((λ q  H₁ x  q ∙' ! (H₁ y))   q  H₂ x  q ∙' ! (H₂ y))   q  H₃ x  q ∙' ! (H₃ y)))
        (hmtpy-nat-∙' H₄ p) ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y))
        (ap  q  H₂ x  q ∙' ! (H₂ y)) (hnat-∙'̇-∙-aux (H₃ x) (H₄ x) (ap  z  f₅ z) p) (H₄ y) (H₃ y))) ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y)) (hnat-∙'̇-∙-aux (H₂ x) (H₃ x  H₄ x) (ap  z  f₅ z) p) (H₃ y  H₄ y) (H₂ y)) ◃∙
      hnat-∙'̇-∙-aux (H₁ x) (H₂ x  H₃ x  H₄ x) (ap  z  f₅ z) p) (H₂ y  H₃ y  H₄ y) (H₁ y) ◃∎
    hnat-∙'-∙4 {f₅ = f₅} H₁ H₂ H₃ H₄ =
      hmtpy-nat-∙'  x  H₁ x  H₂ x  H₃ x  H₄ x) p ◃∎
        =ₛ⟨ hnat-∙'-∙ H₁  x  H₂ x  H₃ x  H₄ x) p 
      _
        =ₛ⟨ 1 & 1 & ap-seq-=ₛ  q  H₁ x  q ∙' ! (H₁ y)) (hnat-∙'-∙3 H₂ H₃ H₄) 
      _
        =ₛ₁⟨ 2 & 1 & ∘-ap  q  H₁ x  q ∙' ! (H₁ y))  q  H₂ x  q ∙' ! (H₂ y)) (hmtpy-nat-∙' H₃ p) 
      _
        =ₛ₁⟨ 3 & 1 & 
          ∘-ap  q  H₁ x  q ∙' ! (H₁ y))
            ((λ q  H₂ x  q ∙' ! (H₂ y))   q  H₃ x  q ∙' ! (H₃ y))) (hmtpy-nat-∙' H₄ p) 
      hmtpy-nat-∙' H₁ p ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y)) (hmtpy-nat-∙' H₂ p) ◃∙
      ap ((λ q  H₁ x  q ∙' ! (H₁ y))   q  H₂ x  q ∙' ! (H₂ y))) (hmtpy-nat-∙' H₃ p) ◃∙
      ap ((λ q  H₁ x  q ∙' ! (H₁ y))   q  H₂ x  q ∙' ! (H₂ y))   q  H₃ x  q ∙' ! (H₃ y)))
        (hmtpy-nat-∙' H₄ p) ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y))
        (ap  q  H₂ x  q ∙' ! (H₂ y)) (hnat-∙'̇-∙-aux (H₃ x) (H₄ x) (ap  z  f₅ z) p) (H₄ y) (H₃ y))) ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y)) (hnat-∙'̇-∙-aux (H₂ x) (H₃ x  H₄ x) (ap  z  f₅ z) p) (H₃ y  H₄ y) (H₂ y)) ◃∙
      hnat-∙'̇-∙-aux (H₁ x) (H₂ x  H₃ x  H₄ x) (ap  z  f₅ z) p) (H₂ y  H₃ y  H₄ y) (H₁ y) ◃∎ ∎ₛ

    hnat-∙'-∙5 : {f₁ f₂ f₃ f₄ f₅ f₆ : A  B}
      (H₁ : (x : A)  f₁ x == f₂ x) (H₂ : (x : A)  f₂ x == f₃ x) (H₃ : (x : A)  f₃ x == f₄ x)
      (H₄ : (x : A)  f₄ x == f₅ x) (H₅ : (x : A)  f₅ x == f₆ x)
      
      hmtpy-nat-∙'  x  H₁ x  H₂ x  H₃ x  H₄ x  H₅ x) p ◃∎
        =ₛ
      hmtpy-nat-∙' H₁ p ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y)) (hmtpy-nat-∙' H₂ p) ◃∙
      ap ((λ q  H₁ x  q ∙' ! (H₁ y))   q  H₂ x  q ∙' ! (H₂ y))) (hmtpy-nat-∙' H₃ p) ◃∙
      ap ((λ q  H₁ x  q ∙' ! (H₁ y))   q  H₂ x  q ∙' ! (H₂ y))   q  H₃ x  q ∙' ! (H₃ y))) (hmtpy-nat-∙' H₄ p) ◃∙
      ap
        ((λ v  H₁ x  v ∙' ! (H₁ y))   q  H₂ x  q ∙' ! (H₂ y)) 
           q  H₃ x  q ∙' ! (H₃ y))   q  H₄ x  q ∙' ! (H₄ y)))
        (hmtpy-nat-∙' H₅ p) ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y))
        (ap  q  H₂ x  q ∙' ! (H₂ y))
          (ap  q  H₃ x  q ∙' ! (H₃ y))
            (hnat-∙'̇-∙-aux (H₄ x) (H₅ x) (ap  z  f₆ z) p) (H₅ y) (H₄ y)))) ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y))
        (ap  q  H₂ x  q ∙' ! (H₂ y)) (hnat-∙'̇-∙-aux (H₃ x) (H₄ x  H₅ x) (ap  z  f₆ z) p) (H₄ y  H₅ y) (H₃ y))) ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y))
        (hnat-∙'̇-∙-aux (H₂ x) (H₃ x  H₄ x  H₅ x) (ap  z  f₆ z) p) (H₃ y  H₄ y  H₅ y) (H₂ y)) ◃∙
      hnat-∙'̇-∙-aux (H₁ x) (H₂ x  H₃ x  H₄ x  H₅ x) (ap  z  f₆ z) p) (H₂ y  H₃ y  H₄ y  H₅ y) (H₁ y) ◃∎
    hnat-∙'-∙5 {f₆ = f₆} H₁ H₂ H₃ H₄ H₅ =
      hmtpy-nat-∙'  x  H₁ x  H₂ x  H₃ x  H₄ x  H₅ x) p ◃∎
        =ₛ⟨ hnat-∙'-∙ H₁  x  H₂ x  H₃ x  H₄ x  H₅ x) p 
      _
        =ₛ⟨ 1 & 1 & ap-seq-=ₛ  q  H₁ x  q ∙' ! (H₁ y)) (hnat-∙'-∙4 H₂ H₃ H₄ H₅) 
      _
        =ₛ₁⟨ 2 & 1 & ∘-ap  q  H₁ x  q ∙' ! (H₁ y))  q  H₂ x  q ∙' ! (H₂ y)) _ 
      _
        =ₛ₁⟨ 3 & 1 & ∘-ap  q  H₁ x  q ∙' ! (H₁ y)) ((λ q  H₂ x  q ∙' ! (H₂ y))   q  H₃ x  q ∙' ! (H₃ y))) _ 
      _
        =ₛ₁⟨ 4 & 1 & ∘-ap _ ((λ q  H₂ x  q ∙' ! (H₂ y))   q  H₃ x  q ∙' ! (H₃ y))   q  H₄ x  q ∙' ! (H₄ y))) _ 
      hmtpy-nat-∙' H₁ p ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y)) (hmtpy-nat-∙' H₂ p) ◃∙
      ap ((λ q  H₁ x  q ∙' ! (H₁ y))   q  H₂ x  q ∙' ! (H₂ y))) (hmtpy-nat-∙' H₃ p) ◃∙
      ap ((λ q  H₁ x  q ∙' ! (H₁ y))   q  H₂ x  q ∙' ! (H₂ y))   q  H₃ x  q ∙' ! (H₃ y))) (hmtpy-nat-∙' H₄ p) ◃∙
      ap
        ((λ v  H₁ x  v ∙' ! (H₁ y))   q  H₂ x  q ∙' ! (H₂ y)) 
           q  H₃ x  q ∙' ! (H₃ y))   q  H₄ x  q ∙' ! (H₄ y)))
        (hmtpy-nat-∙' H₅ p) ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y))
        (ap  q  H₂ x  q ∙' ! (H₂ y))
          (ap  q  H₃ x  q ∙' ! (H₃ y))
            (hnat-∙'̇-∙-aux (H₄ x) (H₅ x) (ap  z  f₆ z) p) (H₅ y) (H₄ y)))) ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y))
        (ap  q  H₂ x  q ∙' ! (H₂ y)) (hnat-∙'̇-∙-aux (H₃ x) (H₄ x  H₅ x) (ap  z  f₆ z) p) (H₄ y  H₅ y) (H₃ y))) ◃∙
      ap  q  H₁ x  q ∙' ! (H₁ y))
        (hnat-∙'̇-∙-aux (H₂ x) (H₃ x  H₄ x  H₅ x) (ap  z  f₆ z) p) (H₃ y  H₄ y  H₅ y) (H₂ y)) ◃∙
      hnat-∙'̇-∙-aux (H₁ x) (H₂ x  H₃ x  H₄ x  H₅ x) (ap  z  f₆ z) p) (H₂ y  H₃ y  H₄ y  H₅ y) (H₁ y) ◃∎ ∎ₛ

module _ {ℓ₁ ℓ₂ ℓ₃} {A : Type ℓ₁} {B : Type ℓ₂} {C : Type ℓ₃} (g : B  C)
  {f₁ f₂ f₃ : A  B} (H₁ : (x : A)  f₁ x == f₂ x) (H₂ : (x : A)  f₂ x == f₃ x)
  {x y : A} (p : x == y) where

  private
    μ₁ = ap ! (∘-∘-ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap g)  q  H₁ x  q ∙' ! (H₁ y)) (hmtpy-nat-∙' H₂ p))
    μ₂ = ap ! (∘-ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap g) (hmtpy-nat-∙' H₁ p))

  hnat-∙'-!ap∙ :
    hmtpy-nat-∙'  x  ! (ap g (H₁ x  H₂ x))) p ◃∎
      =ₛ
    hnat-∙'̇-!-aux (ap (g  f₃) p) (ap g (H₁ x  H₂ x)) (ap g (H₁ y  H₂ y)) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap  q  ap g (H₁ x  H₂ x)  q ∙' ! (ap g (H₁ y  H₂ y))) (∘-ap g f₃ p))) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap-∙-∙'! g (H₁ x  H₂ x) (ap f₃ p) (H₁ y  H₂ y))) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap (ap g) (hnat-∙'̇-∙-aux (H₁ x) (H₂ x) (ap f₃ p) (H₂ y) (H₁ y)))) ◃∙
    ! (ap ((λ q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y))))  ap g   q  H₁ x  q ∙' ! (H₁ y))) (hmtpy-nat-∙' H₂ p)) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  ap g q ∙' ! (! (ap g (H₁ y  H₂ y)))) (hmtpy-nat-∙' H₁ p)) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap-∘ g f₁ p)) ◃∎
  hnat-∙'-!ap∙ =
    hmtpy-nat-∙'  x  ! (ap g (H₁ x  H₂ x))) p ◃∎
      =ₛ⟨ hnat-∙'-!  x  ap g (H₁ x  H₂ x)) p 
    _
      =ₛ⟨ 1 & 1 & !-=ₛ (ap-seq-=ₛ  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (hnat-∙'-post  x  H₁ x  H₂ x) g p)) 
    _
      =ₛ⟨ 3 & 1 & !-=ₛ (ap-seq-=ₛ  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap-seq-=ₛ (ap g) (hnat-∙'-∙ H₁ H₂ p))) 
    _
      =ₛ₁⟨ 4 & 1 & μ₁ 
    hnat-∙'̇-!-aux (ap (g  f₃) p) (ap g (H₁ x  H₂ x)) (ap g (H₁ y  H₂ y)) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap  q  ap g (H₁ x  H₂ x)  q ∙' ! (ap g (H₁ y  H₂ y))) (∘-ap g f₃ p))) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap-∙-∙'! g (H₁ x  H₂ x) (ap f₃ p) (H₁ y  H₂ y))) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap (ap g) (hnat-∙'̇-∙-aux (H₁ x) (H₂ x) (ap f₃ p) (H₂ y) (H₁ y)))) ◃∙
    ! (ap ((λ q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y))))  ap g   q  H₁ x  q ∙' ! (H₁ y))) (hmtpy-nat-∙' H₂ p)) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap (ap g) (hmtpy-nat-∙' H₁ p))) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap-∘ g f₁ p)) ◃∎
      =ₛ₁⟨ 5 & 1 & μ₂ 
    hnat-∙'̇-!-aux (ap (g  f₃) p) (ap g (H₁ x  H₂ x)) (ap g (H₁ y  H₂ y)) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap  q  ap g (H₁ x  H₂ x)  q ∙' ! (ap g (H₁ y  H₂ y))) (∘-ap g f₃ p))) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap-∙-∙'! g (H₁ x  H₂ x) (ap f₃ p) (H₁ y  H₂ y))) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap (ap g) (hnat-∙'̇-∙-aux (H₁ x) (H₂ x) (ap f₃ p) (H₂ y) (H₁ y)))) ◃∙
    ! (ap ((λ q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y))))  ap g   q  H₁ x  q ∙' ! (H₁ y))) (hmtpy-nat-∙' H₂ p)) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  ap g q ∙' ! (! (ap g (H₁ y  H₂ y)))) (hmtpy-nat-∙' H₁ p)) ◃∙
    ! (ap  q  ! (ap g (H₁ x  H₂ x))  q ∙' ! (! (ap g (H₁ y  H₂ y)))) (ap-∘ g f₁ p)) ◃∎ ∎ₛ