{-# OPTIONS
  --without-K
  --prop
  --rewriting
  --confluence-check
  --hidden-argument-puns
#-}

module TT.SSC.Parallel where

open import TT.Lib
open import TT.SSC.Syntax
open import TT.SSC.Path
open import TT.SSC.Tel
open import TT.SSC.Lift

private variable
  i : 
  Γ Γ₀ Γ₁ Δ Δ₀ Δ₁ Θ : Con
  A A₀ A₁ B : Ty Γ i
  a a₀ a₁ b f α : Tm Γ A

data Tms : Con  Con  Set

⌞_⌟ : Tms Δ Γ  Sub* Δ Γ

infixl 4 _,_
data Tms where
  ε : Tms Γ 
  _,_ : (γᵗ : Tms Δ Γ)  Tm Δ (A [  γᵗ  ]ᵀ*)  Tms Δ (Γ  A)

 ε  = ε*
 γᵗ , a  =  γᵗ  ,* a

infixl 9 _[_]ᵀᵗ
_[_]ᵀᵗ : Ty Γ i  Tms Δ Γ  Ty Δ i
A [ γᵗ ]ᵀᵗ = A [  γᵗ  ]ᵀ*

infixl 9 _[_]ᵗᵗ
_[_]ᵗᵗ : Tm Γ A  (γᵗ : Tms Δ Γ)  Tm Δ (A [ γᵗ ]ᵀᵗ)
a [ γᵗ ]ᵗᵗ = a [  γᵗ  ]ᵗ*

private variable
  γᵗ γᵗ₀ γᵗ₁ δᵗ δᵗ₀ δᵗ₁ θᵗ : Tms Δ Γ

opaque
  unfolding coe

  ap-[]ᵀᵗᵣ : γᵗ₀  γᵗ₁  A [ γᵗ₀ ]ᵀᵗ  A [ γᵗ₁ ]ᵀᵗ
  ap-[]ᵀᵗᵣ refl = refl

  ap-, :
    {A : Ty Γ i} {a₀ : Tm Δ (A [ γᵗ₀ ]ᵀᵗ)} {a₁ : Tm Δ (A [ γᵗ₁ ]ᵀᵗ)}
    (γᵗ₀₁ : γᵗ₀  γᵗ₁) 
    a₀ ≡[ ap-Tm (ap-[]ᵀᵗᵣ γᵗ₀₁) ] a₁ 
    (γᵗ₀ , a₀)  (γᵗ₁ , a₁)
  ap-, refl refl = refl

infixl 9 _∘ᵗ_
_∘ᵗ_ : Tms Δ Γ  Tms Θ Δ  Tms Θ Γ
[]ᵀ-∘ᵗ : (γᵗ : Tms Δ Γ) (δᵗ : Tms Θ Δ)  A [ γᵗ ∘ᵗ δᵗ ]ᵀᵗ  A [ γᵗ ]ᵀᵗ [ δᵗ ]ᵀᵗ
[]ᵗ-∘ᵗ :
  (γᵗ : Tms Δ Γ) (δᵗ : Tms Θ Δ) 
  a [ γᵗ ∘ᵗ δᵗ ]ᵗᵗ ≡[ ap-Tm ([]ᵀ-∘ᵗ γᵗ δᵗ) ] a [ γᵗ ]ᵗᵗ [ δᵗ ]ᵗᵗ

ε ∘ᵗ δ = ε
(γᵗ , a) ∘ᵗ δᵗ = γᵗ ∘ᵗ δᵗ , coe (ap-Tm (sym ([]ᵀ-∘ᵗ γᵗ δᵗ))) (a [ δᵗ ]ᵗᵗ)

[]ᵀ-∘ᵗ ε δᵗ = sym (ε-[]ᵀ*  δᵗ )
[]ᵀ-∘ᵗ (γᵗ , a) δᵗ =
  ap-[]ᵀ₃
    (ap-▹ᵣ ([]ᵀ-∘ᵗ γᵗ δᵗ))
    ([]ᵛ→⁺^ᵀ
       γᵗ ∘ᵗ δᵗ 
      ( γᵗ    δᵗ )
      ([]ᵀ-∘ᵗ γᵗ δᵗ)
       _  []ᵗ-∘ᵗ γᵗ δᵗ)
      (  _))
    (apᵈ-⟨⟩ ([]ᵀ-∘ᵗ γᵗ δᵗ) (splitl reflᵈ)) 
  sym (⟨⟩-[]ᵀ*  δᵗ )

[]ᵗ-∘ᵗ ε δᵗ = symᵈ (ε-[]ᵗ*  δᵗ )
[]ᵗ-∘ᵗ (γᵗ , a) δᵗ =
  apᵈ-[]ᵗ₄
    (ap-▹ᵣ ([]ᵀ-∘ᵗ γᵗ δᵗ))
    ([]ᵛ→⁺^ᵀ
       γᵗ ∘ᵗ δᵗ 
      ( γᵗ    δᵗ )
      ([]ᵀ-∘ᵗ γᵗ δᵗ)
       _  []ᵗ-∘ᵗ γᵗ δᵗ)
      (  _))
    ([]ᵛ→⁺^ᵗ
       γᵗ ∘ᵗ δᵗ 
      ( γᵗ    δᵗ )
      ([]ᵀ-∘ᵗ γᵗ δᵗ)
       _  []ᵗ-∘ᵗ γᵗ δᵗ)
      (  _))
    (apᵈ-⟨⟩ ([]ᵀ-∘ᵗ γᵗ δᵗ) (splitl reflᵈ)) ∙ᵈ
  symᵈ (⟨⟩-[]ᵗ*  δᵗ )

assocᵗ : γᵗ ∘ᵗ (δᵗ ∘ᵗ θᵗ)  (γᵗ ∘ᵗ δᵗ) ∘ᵗ θᵗ
assocᵗ {γᵗ = ε} = refl
assocᵗ {γᵗ = γᵗ , a} {δᵗ} {θᵗ} =
  ap-,
    assocᵗ
    (splitlr ([]ᵗ-∘ᵗ δᵗ θᵗ ∙ᵈ apᵈ-[]ᵗ* (sym ([]ᵀ-∘ᵗ γᵗ δᵗ)) refl  θᵗ ))

infixl 9 _∘pᵗ
_∘pᵗ : Tms Δ Γ  Tms (Δ  A) Γ
[]ᵀ-∘pᵗ : (γᵗ : Tms Δ Γ)  B [ γᵗ ∘pᵗ ]ᵀᵗ  B [ γᵗ ]ᵀᵗ [ p ]ᵀ  Ty (Δ  A) i
[]ᵗ-∘pᵗ :
  (γᵗ : Tms Δ Γ) 
  b [ γᵗ ∘pᵗ ]ᵗᵗ ≡[ ap-Tm ([]ᵀ-∘pᵗ γᵗ) ]
  b [ γᵗ ]ᵗᵗ [ p ]ᵗ  Tm (Δ  A) (B [ γᵗ ]ᵀᵗ [ p ]ᵀ)

ε ∘pᵗ = ε
(γᵗ , b) ∘pᵗ = γᵗ ∘pᵗ , coe (ap-Tm (sym ([]ᵀ-∘pᵗ γᵗ))) (b [ p ]ᵗ)

[]ᵀ-∘pᵗ ε = sym ε*-[]ᵀ
[]ᵀ-∘pᵗ (γᵗ , a) =
  ap-[]ᵀ₃
    (ap-▹ᵣ ([]ᵀ-∘pᵗ γᵗ))
    ([]ᵛ→⁺^ᵀ
       γᵗ ∘pᵗ 
      ( γᵗ    p )
      ([]ᵀ-∘pᵗ γᵗ)
       _  []ᵗ-∘pᵗ γᵗ)
      (  _))
    (apᵈ-⟨⟩ ([]ᵀ-∘pᵗ γᵗ) (splitl reflᵈ)) 
  sym ⟨⟩-[]ᵀ

[]ᵗ-∘pᵗ ε = symᵈ ε*-[]ᵗ
[]ᵗ-∘pᵗ (γᵗ , a) =
  apᵈ-[]ᵗ₄
    (ap-▹ᵣ ([]ᵀ-∘pᵗ γᵗ))
    ([]ᵛ→⁺^ᵀ
       γᵗ ∘pᵗ 
      ( γᵗ    p )
      ([]ᵀ-∘pᵗ γᵗ)
       _  []ᵗ-∘pᵗ γᵗ)
      (  _))
    ([]ᵛ→⁺^ᵗ
       γᵗ ∘pᵗ 
      ( γᵗ    p )
      ([]ᵀ-∘pᵗ γᵗ)
       _  []ᵗ-∘pᵗ γᵗ)
      (  _))
    (apᵈ-⟨⟩ ([]ᵀ-∘pᵗ γᵗ) (splitl reflᵈ)) ∙ᵈ
  symᵈ (⟨⟩-[]ᵗ-⁺^ )

∘p-,ᵗ : γᵗ ∘pᵗ ∘ᵗ (δᵗ , a)  γᵗ ∘ᵗ δᵗ
∘p-,ᵗ {γᵗ = ε} = refl
∘p-,ᵗ {γᵗ = γᵗ , b} {δᵗ} {a} =
  ap-,
    ∘p-,ᵗ
    (splitlr (apᵈ-[]ᵗ* ([]ᵀ-∘pᵗ γᵗ) (splitl reflᵈ)  δᵗ , a  ∙ᵈ ▹-β₁ᵗ*  δᵗ ))

idᵗ : Tms Γ Γ
[]ᵀ-idᵗ : {A : Ty Γ i}  A [ idᵗ ]ᵀᵗ  A
[]ᵗ-idᵗ : {a : Tm Γ A}  a [ idᵗ ]ᵗᵗ ≡[ ap-Tm []ᵀ-idᵗ ] a

idᵗ {Γ = } = ε
idᵗ {Γ = Γ  A} =
  idᵗ ∘pᵗ , coe (ap-Tm (ap-[]ᵀ (sym []ᵀ-idᵗ)  sym ([]ᵀ-∘pᵗ idᵗ))) q

[]ᵀ-idᵗ {Γ = } = refl
[]ᵀ-idᵗ {Γ = Γ  A} =
  ap-[]ᵀ₃
    (ap-▹ᵣ ([]ᵀ-∘pᵗ idᵗ  ap-[]ᵀ []ᵀ-idᵗ))
    ([]ᵛ→⁺^ᵀ
       idᵗ ∘pᵗ 
       p 
      ([]ᵀ-∘pᵗ idᵗ  ap-[]ᵀ []ᵀ-idᵗ)
       _  []ᵗ-∘pᵗ idᵗ ∙ᵈ apᵈ-[]ᵗ []ᵀ-idᵗ []ᵗ-idᵗ)
      (  A))
    (apᵈ-⟨⟩ ([]ᵀ-∘pᵗ idᵗ  ap-[]ᵀ []ᵀ-idᵗ) (splitl reflᵈ)) 
  sym ▹-ηᵀ

[]ᵗ-idᵗ {Γ = } = reflᵈ
[]ᵗ-idᵗ {Γ = Γ  A} =
  apᵈ-[]ᵗ₄
    (ap-▹ᵣ ([]ᵀ-∘pᵗ idᵗ  ap-[]ᵀ []ᵀ-idᵗ))
    ([]ᵛ→⁺^ᵀ
       idᵗ ∘pᵗ 
       p 
      ([]ᵀ-∘pᵗ idᵗ  ap-[]ᵀ []ᵀ-idᵗ)
       _  []ᵗ-∘pᵗ idᵗ ∙ᵈ apᵈ-[]ᵗ []ᵀ-idᵗ []ᵗ-idᵗ)
      (  A))
    ([]ᵛ→⁺^ᵗ
       idᵗ ∘pᵗ 
       p 
      ([]ᵀ-∘pᵗ idᵗ  ap-[]ᵀ []ᵀ-idᵗ)
       _  []ᵗ-∘pᵗ idᵗ ∙ᵈ apᵈ-[]ᵗ []ᵀ-idᵗ []ᵗ-idᵗ)
      (  A))
    (apᵈ-⟨⟩ ([]ᵀ-∘pᵗ idᵗ  ap-[]ᵀ []ᵀ-idᵗ) (splitl reflᵈ)) ∙ᵈ
  symᵈ (▹-ηᵗ-⁺^ )

pᵗ : Tms (Γ  A) Γ
pᵗ = idᵗ ∘pᵗ

[]ᵀ-pᵗ : B [ pᵗ ]ᵀᵗ  B [ p ]ᵀ  Ty (Γ  A) i
[]ᵀ-pᵗ = []ᵀ-∘pᵗ idᵗ  ap-[]ᵀ []ᵀ-idᵗ

[]ᵗ-pᵗ : b [ pᵗ ]ᵗᵗ ≡[ ap-Tm []ᵀ-pᵗ ] b [ p ]ᵗ  Tm (Γ  A) (B [ p ]ᵀ)
[]ᵗ-pᵗ = []ᵗ-∘pᵗ idᵗ ∙ᵈ apᵈ-[]ᵗ []ᵀ-idᵗ []ᵗ-idᵗ

idrᵗ : γᵗ ∘ᵗ idᵗ  γᵗ
idrᵗ {γᵗ = ε} = refl
idrᵗ {γᵗ = γᵗ , a} = ap-, idrᵗ (splitl []ᵗ-idᵗ)

idlᵗ : idᵗ ∘ᵗ γᵗ  γᵗ
idlᵗ {γᵗ = ε} = refl
idlᵗ {γᵗ = γᵗ , a} =
  ap-,
    (∘p-,ᵗ  idlᵗ)
    (splitl
      ( apᵈ-[]ᵗ* []ᵀ-pᵗ (splitl reflᵈ)  γᵗ , a  ∙ᵈ
        ▹-β₂*  γᵗ ))

qᵗ : Tm (Γ  A) (A [ pᵗ ]ᵀᵗ)
qᵗ = coe (ap-Tm (ap-[]ᵀ (sym []ᵀ-idᵗ)  sym ([]ᵀ-∘pᵗ idᵗ))) q

,-∘ᵗ :
  {γᵗ : Tms Δ Γ} {a : Tm Δ (A [ γᵗ ]ᵀᵗ)} 
  (γᵗ , a) ∘ᵗ δᵗ  (γᵗ ∘ᵗ δᵗ , coe (ap-Tm (sym ([]ᵀ-∘ᵗ γᵗ δᵗ))) (a [ δᵗ ]ᵗᵗ))
,-∘ᵗ = refl

▹-β₁ᵗ : (γᵗ : Tms Δ Γ) {a : Tm Δ (A [ γᵗ ]ᵀᵗ)}  pᵗ ∘ᵗ (γᵗ , a)  γᵗ
▹-β₁ᵗ γᵗ = ∘p-,ᵗ  idlᵗ

▹-β₂ᵗ :
  (γᵗ : Tms Δ Γ) {A : Ty Γ i} {a : Tm Δ (A [ γᵗ ]ᵀᵗ)} 
  qᵗ [ γᵗ , a ]ᵗᵗ
    ≡[ ap-Tm (sym ([]ᵀ-∘ᵗ pᵗ (γᵗ , a))  ap-[]ᵀᵗᵣ (▹-β₁ᵗ γᵗ)) ]
  a
▹-β₂ᵗ γᵗ {a} = apᵈ-[]ᵗ* []ᵀ-pᵗ (splitl reflᵈ)  γᵗ , a  ∙ᵈ ▹-β₂*  γᵗ 

▹-ηᵗ : idᵗ  (pᵗ , qᵗ)  Tms (Γ  A) (Γ  A)
▹-ηᵗ = refl

opaque
  unfolding coe

  ap-∘ᵗᵣ : (δᵗ₀₁ : δᵗ₀  δᵗ₁)  γᵗ ∘ᵗ δᵗ₀  γᵗ ∘ᵗ δᵗ₁
  ap-∘ᵗᵣ refl = refl

  ap-[]ᵀᵗ : A₀  A₁  (γᵗ : Tms Δ Γ)  A₀ [ γᵗ ]ᵀᵗ  A₁ [ γᵗ ]ᵀᵗ
  ap-[]ᵀᵗ refl _ = refl

  apᵈ-[]ᵗᵗ :
    (A₀₁ : A₀  A₁)  a₀ ≡[ ap-Tm A₀₁ ] a₁  (γᵗ : Tms Δ Γ) 
    a₀ [ γᵗ ]ᵗᵗ ≡[ ap-Tm (ap-[]ᵀᵗ A₀₁ γᵗ) ] a₁ [ γᵗ ]ᵗᵗ
  apᵈ-[]ᵗᵗ refl refl _ = refl

infixl 10 _⁺ᵗ
_⁺ᵗ : (γᵗ : Tms Δ Γ)  Tms (Δ  A [ γᵗ ]ᵀᵗ) (Γ  A)
γᵗ ⁺ᵗ = γᵗ ∘ᵗ pᵗ , coe (ap-Tm (sym ([]ᵀ-∘ᵗ γᵗ pᵗ))) qᵗ

[]ᵀ-⁺ᵗ :
  (γᵗ : Tms Δ Γ)  B [ γᵗ ⁺ᵗ ]ᵀᵗ  B [  γᵗ  ⁺* ]ᵀ*  Ty (Δ  A [ γᵗ ]ᵀᵗ) i
[]ᵀ-⁺ᵗ {A} γᵗ =
  ap-[]ᵀ₃
    (ap-▹ᵣ ([]ᵀ-∘ᵗ γᵗ pᵗ  []ᵀ-pᵗ))
    ([]ᵛ→⁺^ᵀ
       γᵗ ∘ᵗ pᵗ 
      ( γᵗ    p )
      ([]ᵀ-∘ᵗ γᵗ pᵗ  []ᵀ-pᵗ)
       _  []ᵗ-∘ᵗ γᵗ pᵗ ∙ᵈ []ᵗ-pᵗ)
      (  A))
    (apᵈ-⟨⟩ ([]ᵀ-∘ᵗ γᵗ pᵗ  []ᵀ-pᵗ) (splitl (splitl reflᵈ))) 
  sym ▹-ηᵀ

[]ᵗ-⁺ᵗ :
  (γᵗ : Tms Δ Γ) 
  b [ γᵗ ⁺ᵗ ]ᵗᵗ ≡[ ap-Tm ([]ᵀ-⁺ᵗ γᵗ) ]
  b [  γᵗ  ⁺* ]ᵗ*  Tm (Δ  A [ γᵗ ]ᵀᵗ) (B [  γᵗ  ⁺* ]ᵀ*)
[]ᵗ-⁺ᵗ {A} γᵗ =
  apᵈ-[]ᵗ₄
    (ap-▹ᵣ ([]ᵀ-∘ᵗ γᵗ pᵗ  []ᵀ-pᵗ))
    ([]ᵛ→⁺^ᵀ
       γᵗ ∘ᵗ pᵗ 
      ( γᵗ    p )
      ([]ᵀ-∘ᵗ γᵗ pᵗ  []ᵀ-pᵗ)
       _  []ᵗ-∘ᵗ γᵗ pᵗ ∙ᵈ []ᵗ-pᵗ)
      (  A))
    ([]ᵛ→⁺^ᵗ
       γᵗ ∘ᵗ pᵗ 
      ( γᵗ    p )
      ([]ᵀ-∘ᵗ γᵗ pᵗ  []ᵀ-pᵗ)
       _  []ᵗ-∘ᵗ γᵗ pᵗ ∙ᵈ []ᵗ-pᵗ)
      (  A))
    (apᵈ-⟨⟩ ([]ᵀ-∘ᵗ γᵗ pᵗ  []ᵀ-pᵗ) (splitl (splitl reflᵈ))) ∙ᵈ
  symᵈ (▹-ηᵗ-⁺^ )

⟨_⟩ᵗ : Tm Γ A  Tms Γ (Γ  A)
 a ⟩ᵗ = idᵗ , coe (ap-Tm (sym []ᵀ-idᵗ)) a

[]ᵀ-⟨⟩ᵗ : {a : Tm Γ A}  B [  a ⟩ᵗ ]ᵀᵗ  B [  a  ]ᵀ
[]ᵀ-⟨⟩ᵗ {A} =
  ap-[]ᵀ₃
    (ap-▹ᵣ []ᵀ-idᵗ)
    ([]ᵛ→⁺^ᵀ  idᵗ  id []ᵀ-idᵗ  _  []ᵗ-idᵗ) (  A))
    (apᵈ-⟨⟩ []ᵀ-idᵗ (splitl reflᵈ))

[]ᵗ-⟨⟩ᵗ : {a : Tm Γ A}  b [  a ⟩ᵗ ]ᵗᵗ ≡[ ap-Tm []ᵀ-⟨⟩ᵗ ] b [  a  ]ᵗ
[]ᵗ-⟨⟩ᵗ {A} =
  apᵈ-[]ᵗ₄
    (ap-▹ᵣ []ᵀ-idᵗ)
    ([]ᵛ→⁺^ᵀ  idᵗ  id []ᵀ-idᵗ  _  []ᵗ-idᵗ) (  A))
    ([]ᵛ→⁺^ᵗ  idᵗ  id []ᵀ-idᵗ  _  []ᵗ-idᵗ) (  A))
    (apᵈ-⟨⟩ []ᵀ-idᵗ (splitl reflᵈ))

⟨⟩-∘ᵗ : (γᵗ : Tms Δ Γ)   a ⟩ᵗ ∘ᵗ γᵗ  γᵗ ⁺ᵗ ∘ᵗ  a [ γᵗ ]ᵗᵗ ⟩ᵗ
⟨⟩-∘ᵗ {a} γᵗ =
  ap-,
    (idlᵗ  sym idrᵗ  ap-∘ᵗᵣ (sym (▹-β₁ᵗ idᵗ))  assocᵗ)
    ( splitlr (apᵈ-[]ᵗᵗ []ᵀ-idᵗ (splitl reflᵈ) γᵗ ∙ᵈ
      symᵈ (merger (▹-β₂ᵗ idᵗ)) ∙ᵈ
      apᵈ-[]ᵗᵗ (sym ([]ᵀ-∘ᵗ γᵗ pᵗ)) refl  a [ γᵗ ]ᵗᵗ ⟩ᵗ))

▹-η′ᵗ : idᵗ  pᵗ ⁺ᵗ ∘ᵗ  qᵗ ⟩ᵗ  Tms (Γ  A) (Γ  A)
▹-η′ᵗ =
  ap-,
    (sym idrᵗ  ap-∘ᵗᵣ (sym (▹-β₁ᵗ idᵗ))  assocᵗ)
    (splitr
      (symᵈ (merger (▹-β₂ᵗ idᵗ)) ∙ᵈ apᵈ-[]ᵗᵗ (sym ([]ᵀ-∘ᵗ pᵗ pᵗ)) refl  qᵗ ⟩ᵗ))

U-[]ᵗ : (γᵗ : Tms Δ Γ)  U i [ γᵗ ]ᵀᵗ  U i
U-[]ᵗ γᵗ = U-[]*  γᵗ 

El-[]ᵗ :
  (γᵗ : Tms Δ Γ)  El α [ γᵗ ]ᵀᵗ  El (coe (ap-Tm (U-[]ᵗ γᵗ)) (α [ γᵗ ]ᵗᵗ))
El-[]ᵗ γᵗ = El-[]*  γᵗ 

c-[]ᵗ : (γᵗ : Tms Δ Γ)  c A [ γᵗ ]ᵗᵗ ≡[ ap-Tm (U-[]ᵗ γᵗ) ] c (A [ γᵗ ]ᵀᵗ)
c-[]ᵗ γᵗ = c-[]*  γᵗ 

Lift-[]ᵗ : (γᵗ : Tms Δ Γ)  Lift A [ γᵗ ]ᵀᵗ  Lift (A [ γᵗ ]ᵀᵗ)
Lift-[]ᵗ γᵗ = Lift-[]*  γᵗ 

lower-[]ᵗ :
  (γᵗ : Tms Δ Γ) 
  lower a [ γᵗ ]ᵗᵗ  lower (coe (ap-Tm (Lift-[]ᵗ γᵗ)) (a [ γᵗ ]ᵗᵗ))
lower-[]ᵗ γᵗ = lower-[]*  γᵗ 

lift-[]ᵗ :
  (γᵗ : Tms Δ Γ)  lift a [ γᵗ ]ᵗᵗ ≡[ ap-Tm (Lift-[]ᵗ γᵗ) ] lift (a [ γᵗ ]ᵗᵗ)
lift-[]ᵗ γᵗ = lift-[]*  γᵗ 

Π-[]ᵗ : (γᵗ : Tms Δ Γ)  Π A B [ γᵗ ]ᵀᵗ  Π (A [ γᵗ ]ᵀᵗ) (B [ γᵗ ⁺ᵗ ]ᵀᵗ)
Π-[]ᵗ γᵗ = Π-[]*  γᵗ   ap-Π (sym ([]ᵀ-⁺ᵗ γᵗ))

appᵗ : Tm Γ (Π A B)  (a : Tm Γ A)  Tm Γ (B [  a ⟩ᵗ ]ᵀᵗ)
appᵗ f a = coe (ap-Tm (sym []ᵀ-⟨⟩ᵗ)) (app f a)

app-[]ᵗ :
  {B : Ty (Γ  A) i} {f : Tm Γ (Π A B)} (γᵗ : Tms Δ Γ) 
  appᵗ f a [ γᵗ ]ᵗᵗ
    ≡[
      ap-Tm
        ( sym ([]ᵀ-∘ᵗ  a ⟩ᵗ γᵗ) 
          ap-[]ᵀᵗᵣ (⟨⟩-∘ᵗ γᵗ)  []ᵀ-∘ᵗ (γᵗ ⁺ᵗ)  a [ γᵗ ]ᵗᵗ ⟩ᵗ) ]
  appᵗ (coe (ap-Tm (Π-[]ᵗ γᵗ)) (f [ γᵗ ]ᵗᵗ)) (a [ γᵗ ]ᵗᵗ)
app-[]ᵗ γᵗ =
  splitr
    ( apᵈ-[]ᵗᵗ []ᵀ-⟨⟩ᵗ (splitl reflᵈ) γᵗ ∙ᵈ
      app-[]*  γᵗ  ∙ᵈ
      apᵈ-app refl reflᵈ (dep (sym ([]ᵀ-⁺ᵗ γᵗ))) (splitlr reflᵈ) reflᵈ)

lam-[]ᵗ :
  (γᵗ : Tms Δ Γ)  lam b [ γᵗ ]ᵗᵗ ≡[ ap-Tm (Π-[]ᵗ γᵗ) ] lam (b [ γᵗ ⁺ᵗ ]ᵗᵗ)
lam-[]ᵗ γᵗ = lam-[]*  γᵗ  ∙ᵈ apᵈ-lam (sym ([]ᵀ-⁺ᵗ γᵗ)) (symᵈ ([]ᵗ-⁺ᵗ γᵗ))

Π-βᵗ : appᵗ (lam b) a  b [  a ⟩ᵗ ]ᵗᵗ
Π-βᵗ = dep Π-β ∙ᵈ symᵈ []ᵗ-⟨⟩ᵗ

Π-ηᵗ :
  {B : Ty (Γ  A) i} {f : Tm Γ (Π A B)} 
  f ≡[ ap-Tm (ap-Π (sym []ᵀ-idᵗ  ap-[]ᵀᵗᵣ ▹-η′ᵗ  []ᵀ-∘ᵗ (pᵗ ⁺ᵗ)  qᵗ ⟩ᵗ)) ]
  lam (appᵗ (coe (ap-Tm (Π-[]ᵗ pᵗ)) (f [ pᵗ ]ᵗᵗ)) qᵗ)
Π-ηᵗ {A} =
  Π-η ∙ᵈ
  apᵈ-lam
    (ap-[]ᵀ₃
      (ap-▹ᵣ (sym []ᵀ-pᵗ))
      ( []ᵛ→⁺^ᵀ  p   pᵗ  (sym []ᵀ-pᵗ)  _  symᵈ []ᵗ-pᵗ) (  A) ∙ᵈ
        dep (sym ([]ᵀ-⁺ᵗ pᵗ)))
      (apᵈ-⟨⟩ (sym []ᵀ-pᵗ) refl)  sym []ᵀ-⟨⟩ᵗ)
    (splitr
      (apᵈ-app
        refl
        (dep (sym []ᵀ-pᵗ))
        ( []ᵛ→⁺^ᵀ  p   pᵗ  (sym []ᵀ-pᵗ)  _  symᵈ []ᵗ-pᵗ) (  A) ∙ᵈ
          dep (sym ([]ᵀ-⁺ᵗ pᵗ)))
        (splitlr (symᵈ []ᵗ-pᵗ)) refl))

opaque
  unfolding coe

  ap-Tms : Δ₀  Δ₁  Γ₀  Γ₁  Tms Δ₀ Γ₀  Tms Δ₁ Γ₁
  ap-Tms refl refl = refl

  ap-[]ᵀᵗ₃ :
    (Γ₀₁ : Γ₀  Γ₁)  A₀ ≡[ ap-Ty Γ₀₁ ] A₁  γᵗ₀ ≡[ ap-Tms refl Γ₀₁ ] γᵗ₁ 
    A₀ [ γᵗ₀ ]ᵀᵗ  A₁ [ γᵗ₁ ]ᵀᵗ
  ap-[]ᵀᵗ₃ refl refl refl = refl

  apᵈ-[]ᵀᵗᵣ :
    (Δ₀₁ : Δ₀  Δ₁)  γᵗ₀ ≡[ ap-Tms Δ₀₁ refl ] γᵗ₁ 
    A [ γᵗ₀ ]ᵀᵗ ≡[ ap-Ty Δ₀₁ ] A [ γᵗ₁ ]ᵀᵗ
  apᵈ-[]ᵀᵗᵣ refl refl = refl

  apᵈ-[]ᵀᵗ :
    (Γ₀₁ : Γ₀  Γ₁)  A₀ ≡[ ap-Ty Γ₀₁ ] A₁ 
    (Δ₀₁ : Δ₀  Δ₁)  γᵗ₀ ≡[ ap-Tms Δ₀₁ Γ₀₁ ] γᵗ₁ 
    A₀ [ γᵗ₀ ]ᵀᵗ ≡[ ap-Ty Δ₀₁ ] A₁ [ γᵗ₁ ]ᵀᵗ
  apᵈ-[]ᵀᵗ refl refl refl refl = refl

  apᵈ-[]ᵗᵗ₄ :
    (Γ₀₁ : Γ₀  Γ₁) (A₀₁ : A₀ ≡[ ap-Ty Γ₀₁ ] A₁)  a₀ ≡[ ap-Tm₂ Γ₀₁ A₀₁ ] a₁ 
    (γᵗ₀₁ : γᵗ₀ ≡[ ap-Tms refl Γ₀₁ ] γᵗ₁) 
    a₀ [ γᵗ₀ ]ᵗᵗ ≡[ ap-Tm (ap-[]ᵀᵗ₃ Γ₀₁ A₀₁ γᵗ₀₁) ] a₁ [ γᵗ₁ ]ᵗᵗ
  apᵈ-[]ᵗᵗ₄ refl refl refl refl = refl

  apᵈ-[]ᵗᵗᵣ :
    {A : Ty Γ i} {a : Tm Γ A} 
    (Δ₀₁ : Δ₀  Δ₁) (γᵗ₀₁ : γᵗ₀ ≡[ ap-Tms Δ₀₁ refl ] γᵗ₁) 
    a [ γᵗ₀ ]ᵗᵗ ≡[ ap-Tm₂ Δ₀₁ (apᵈ-[]ᵀᵗᵣ Δ₀₁ γᵗ₀₁) ] a [ γᵗ₁ ]ᵗᵗ
  apᵈ-[]ᵗᵗᵣ refl refl = refl

  apᵈ-ε : (Γ₀₁ : Γ₀  Γ₁)  ε ≡[ ap-Tms Γ₀₁ refl ] ε
  apᵈ-ε refl = refl

  apᵈ-, :
    (Δ₀₁ : Δ₀  Δ₁) (Γ₀₁ : Γ₀  Γ₁) (γᵗ₀₁ : γᵗ₀ ≡[ ap-Tms Δ₀₁ Γ₀₁ ] γᵗ₁) 
    (A₀₁ : A₀ ≡[ ap-Ty Γ₀₁ ] A₁) 
    a₀ ≡[ ap-Tm₂ Δ₀₁ (apᵈ-[]ᵀᵗ Γ₀₁ A₀₁ Δ₀₁ γᵗ₀₁) ] a₁ 
    (γᵗ₀ , a₀) ≡[ ap-Tms Δ₀₁ (ap-▹ Γ₀₁ A₀₁) ] (γᵗ₁ , a₁)
  apᵈ-, refl refl refl refl refl = refl

  apᵈ-pᵗ :
    (Γ₀₁ : Γ₀  Γ₁) (A₀₁ : A₀ ≡[ ap-Ty Γ₀₁ ] A₁) 
    pᵗ ≡[ ap-Tms (ap-▹ Γ₀₁ A₀₁) Γ₀₁ ] pᵗ
  apᵈ-pᵗ refl refl = refl

  apᵈ-⁺ᵗ :
    (Δ₀₁ : Δ₀  Δ₁) (Γ₀₁ : Γ₀  Γ₁) 
    (γᵗ₀₁ : γᵗ₀ ≡[ ap-Tms Δ₀₁ Γ₀₁ ] γᵗ₁) (A₀₁ : A₀ ≡[ ap-Ty Γ₀₁ ] A₁) 
    γᵗ₀ ⁺ᵗ ≡[ ap-Tms (ap-▹ Δ₀₁ (apᵈ-[]ᵀᵗ Γ₀₁ A₀₁ Δ₀₁ γᵗ₀₁)) (ap-▹ Γ₀₁ A₀₁) ]
    γᵗ₁ ⁺ᵗ
  apᵈ-⁺ᵗ refl refl refl refl = refl

  apᵈ-⟨⟩ᵗ :
    (Γ₀₁ : Γ₀  Γ₁) (A₀₁ : A₀ ≡[ ap-Ty Γ₀₁ ] A₁) 
    a₀ ≡[ ap-Tm₂ Γ₀₁ A₀₁ ] a₁   a₀ ⟩ᵗ ≡[ ap-Tms Γ₀₁ (ap-▹ Γ₀₁ A₀₁) ]  a₁ ⟩ᵗ
  apᵈ-⟨⟩ᵗ refl refl refl = refl