{-# OPTIONS
  --without-K
  --prop
  --rewriting
  --confluence-check
#-}

module TT.CwF.Syntax where

open import TT.Lib

private variable
  i i₀ i₁ : 

data Con : Set

postulate
  Ty : Con    Set

infixl 2 _▹_
data Con where
   : Con
  _▹_ : (Γ : Con)  Ty Γ i  Con

postulate
  Sub : Con  Con  Set

private variable
  Γ Γ₀ Γ₁ Δ Δ₀ Δ₁ Θ Θ₀ Θ₁ : Con
  γ γ₀ γ₁ δ δ₀ δ₁ θ : Sub Δ Γ
  A A₀ A₁ B B₀ B₁ : Ty Γ i

infixl 9 _∘_
postulate
  _∘_ : Sub Δ Γ  Sub Θ Δ  Sub Θ Γ
  assoc : γ  (δ  θ)  (γ  δ)  θ

  id : Sub Γ Γ
  idr : γ  id  γ
  idl : id  γ  γ

infixl 9 _[_]ᵀ
postulate
  _[_]ᵀ : Ty Γ i  Sub Δ Γ  Ty Δ i
  []ᵀ-∘ : A [ γ  δ ]ᵀ  A [ γ ]ᵀ [ δ ]ᵀ
  []ᵀ-id : A [ id ]ᵀ  A

postulate
  Tm : (Γ : Con)  Ty Γ i  Set

private variable
  a a₀ a₁ b b₀ b₁ f f₀ f₁ α α₀ α₁ : Tm Γ A

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

ap-Tm : A₀  A₁  Tm Γ A₀  Tm Γ A₁
ap-Tm refl = refl

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

infixl 4 _,_
postulate
  ε : Sub Δ 
  ε-∘ : ε  γ  ε
  ◇-η : id  ε

  p : Sub (Γ  A) Γ
  q : Tm (Γ  A) (A [ p ]ᵀ)

  _,_ : (γ : Sub Δ Γ)  Tm Δ (A [ γ ]ᵀ)  Sub Δ (Γ  A)
  ,-∘ : (γ , a)  δ  (γ  δ , coe (ap-Tm (sym []ᵀ-∘)) (a [ δ ]ᵗ))

  ▹-β₁ : p  (γ , a)  γ
  ▹-β₂ : q [ γ , a ]ᵗ ≡[ ap-Tm (sym []ᵀ-∘  ap-[]ᵀᵣ ▹-β₁) ] a
  ▹-η : id  (p , q)  Sub (Γ  A) (Γ  A)

opaque
  unfolding coe

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

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

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

  ap-, :
    (γ₀₁ : γ₀  γ₁)  a₀ ≡[ ap-Tm (ap-[]ᵀᵣ γ₀₁) ] a₁  (γ₀ , a₀)  (γ₁ , a₁)
  ap-, refl refl = refl

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

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

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

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

postulate
  U : (i : )  Ty Γ (suc i)
  U-[] : U i [ γ ]ᵀ  U i

  El : Tm Γ (U i)  Ty Γ i
  El-[] : El α [ γ ]ᵀ  El (coe (ap-Tm U-[]) (α [ γ ]ᵗ))

  c : Ty Γ i  Tm Γ (U i)
  c-[] : c A [ γ ]ᵗ ≡[ ap-Tm U-[] ] c (A [ γ ]ᵀ)

  U-β : El (c A)  A
  U-η : α  c (El α)

postulate
  Lift : Ty Γ i  Ty Γ (suc i)
  Lift-[] : Lift A [ γ ]ᵀ  Lift (A [ γ ]ᵀ)

  lower : Tm Γ (Lift A)  Tm Γ A
  lower-[] : lower a [ γ ]ᵗ  lower (coe (ap-Tm Lift-[]) (a [ γ ]ᵗ))

  lift : Tm Γ A  Tm Γ (Lift A)
  lift-[] : lift a [ γ ]ᵗ ≡[ ap-Tm Lift-[] ] lift (a [ γ ]ᵗ)

  Lift-β : lower (lift a)  a
  Lift-η : lift (lower a)  a

postulate
  Π : (A : Ty Γ i)  Ty (Γ  A) i  Ty Γ i
  Π-[] : Π A B [ γ ]ᵀ  Π (A [ γ ]ᵀ) (B [ γ  ]ᵀ)

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

  lam : Tm (Γ  A) B  Tm Γ (Π A B)
  lam-[] : lam b [ γ ]ᵗ ≡[ ap-Tm Π-[] ] lam (b [ γ  ]ᵗ)

ap-Π : B₀  B₁  Π A B₀  Π A B₁
ap-Π refl = refl

postulate
  Π-β : app (lam b) a  b [  a  ]ᵗ
  Π-η :
    f ≡[ ap-Tm (ap-Π (sym []ᵀ-id  ap-[]ᵀᵣ ▹-η′  []ᵀ-∘)) ]
    lam (app (coe (ap-Tm Π-[]) (f [ p ]ᵗ)) q)

opaque
  unfolding coe

  ap-Subₗ : Δ₀  Δ₁  Sub Δ₀ Γ  Sub Δ₁ Γ
  ap-Subₗ refl = refl

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

  postulate
    Sub-inj-Δ : Sub Δ₀ Γ₀  Sub Δ₁ Γ₁  Δ₀  Δ₁
    Sub-inj-Γ : Sub Δ₀ Γ₀  Sub Δ₁ Γ₁  Γ₀  Γ₁

  ap-∘ₗ : γ₀  γ₁  γ₀  δ  γ₁  δ
  ap-∘ₗ refl = refl

  ap-∘₃ :
    (Δ₀₁ : Δ₀  Δ₁)  γ₀ ≡[ ap-Subₗ Δ₀₁ ] γ₁  δ₀ ≡[ ap-Sub refl Δ₀₁ ] δ₁ 
    γ₀  δ₀  γ₁  δ₁
  ap-∘₃ refl refl refl = refl

  apᵈ-∘ᵣ : (Θ₀₁ : Θ₀  Θ₁)  δ₀ ≡[ ap-Subₗ Θ₀₁ ] δ₁  γ  δ₀ ≡[ ap-Subₗ Θ₀₁ ] γ  δ₁
  apᵈ-∘ᵣ refl refl = refl

  apᵈ-∘ :
    (Δ₀₁ : Δ₀  Δ₁) (Γ₀₁ : Γ₀  Γ₁)  γ₀ ≡[ ap-Sub Δ₀₁ Γ₀₁ ] γ₁ 
    (Θ₀₁ : Θ₀  Θ₁)  δ₀ ≡[ ap-Sub Θ₀₁ Δ₀₁ ] δ₁ 
    γ₀  δ₀ ≡[ ap-Sub Θ₀₁ Γ₀₁ ] γ₁  δ₁
  apᵈ-∘ refl refl refl refl refl = refl

  apᵈ-id : (Γ₀₁ : Γ₀  Γ₁)  id ≡[ ap-Sub Γ₀₁ Γ₀₁ ] id
  apᵈ-id refl = refl

  ap-Ty : Γ₀  Γ₁  Ty Γ₀ i  Ty Γ₁ i
  ap-Ty refl = refl

  ap-Ty₂ : Γ₀  Γ₁  i₀  i₁  Ty Γ₀ i₀  Ty Γ₁ i₁
  ap-Ty₂ refl refl = refl

  postulate
    Ty-inj-Γ : Ty Γ₀ i₀  Ty Γ₁ i₁  Γ₀  Γ₁
    Ty-inj-i : Ty Γ₀ i₀  Ty Γ₁ i₁  i₀  i₁

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

  apᵈ-[]ᵀ₃ :
    A₀  A₁  (Δ₀₁ : Δ₀  Δ₁)  γ₀ ≡[ ap-Subₗ Δ₀₁ ] γ₁ 
    A₀ [ γ₀ ]ᵀ ≡[ ap-Ty Δ₀₁ ] A₁ [ γ₁ ]ᵀ
  apᵈ-[]ᵀ₃ refl refl refl = refl

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

  ap-Tm₂ : (Γ₀₁ : Γ₀  Γ₁)  A₀ ≡[ ap-Ty Γ₀₁ ] A₁  Tm Γ₀ A₀  Tm Γ₁ A₁
  ap-Tm₂ refl refl = refl

  ap-Tm₃ :
    (Γ₀₁ : Γ₀  Γ₁) (i₀₁ : i₀  i₁) 
    A₀ ≡[ ap-Ty₂ Γ₀₁ i₀₁ ] A₁  Tm Γ₀ A₀  Tm Γ₁ A₁
  ap-Tm₃ refl refl refl = refl

  postulate
    Tm-inj-Γ : Tm Γ₀ A₀  Tm Γ₁ A₁  Γ₀  Γ₁
    Tm-inj-i : {A₀ : Ty Γ₀ i₀} {A₁ : Ty Γ₁ i₁}  Tm Γ₀ A₀  Tm Γ₁ A₁  i₀  i₁
    Tm-inj-A :
      (e : Tm Γ₀ A₀  Tm Γ₁ A₁)  A₀ ≡[ ap-Ty₂ (Tm-inj-Γ e) (Tm-inj-i e) ] A₁

  apᵈ-[]ᵗᵣ : (γ₀₁ : γ₀  γ₁)  a [ γ₀ ]ᵗ ≡[ ap-Tm (ap-[]ᵀᵣ γ₀₁) ] a [ γ₁ ]ᵗ
  apᵈ-[]ᵗᵣ refl = refl

  apᵈ-[]ᵗ₄ :
    (A₀₁ : A₀  A₁)  a₀ ≡[ ap-Tm A₀₁ ] a₁ 
    (Δ₀₁ : Δ₀  Δ₁) (γ₀₁ : γ₀ ≡[ ap-Subₗ Δ₀₁ ] γ₁) 
    a₀ [ γ₀ ]ᵗ ≡[ ap-Tm₂ Δ₀₁ (apᵈ-[]ᵀ₃ A₀₁ Δ₀₁ γ₀₁) ] a₁ [ γ₁ ]ᵗ
  apᵈ-[]ᵗ₄ refl refl refl refl = refl

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

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

  ap-▹ᵣ : A₀  A₁  (Γ  A₀)  (Γ  A₁)
  ap-▹ᵣ refl = refl

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

  apᵈ-p : (A₀₁ : A₀  A₁)  p ≡[ ap-Subₗ (ap-▹ᵣ A₀₁) ] p
  apᵈ-p refl = refl

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

  apᵈ-q :
    (A₀₁ : A₀  A₁) 
    q ≡[ ap-Tm₂ (ap-▹ᵣ A₀₁) (apᵈ-[]ᵀ₃ A₀₁ (ap-▹ᵣ A₀₁) (apᵈ-p A₀₁)) ] q
  apᵈ-q refl = refl

  apᵈ-q₂ :
    (Γ₀₁ : Γ₀  Γ₁) (A₀₁ : A₀ ≡[ ap-Ty Γ₀₁ ] A₁) 
    q
      ≡[
        ap-Tm₂
          (ap-▹ Γ₀₁ A₀₁)
          (apᵈ-[]ᵀ Γ₀₁ A₀₁ (ap-▹ Γ₀₁ A₀₁) (apᵈ-p₂ Γ₀₁ A₀₁)) ]
    q
  apᵈ-q₂ refl refl = refl

  apᵈ-, :
    (Δ₀₁ : Δ₀  Δ₁) (γ₀₁ : γ₀ ≡[ ap-Subₗ Δ₀₁ ] γ₁) 
    a₀ ≡[ ap-Tm₂ Δ₀₁ (apᵈ-[]ᵀᵣ Δ₀₁ γ₀₁) ] a₁ 
    (γ₀ , a₀) ≡[ ap-Subₗ Δ₀₁ ] (γ₁ , a₁)
  apᵈ-, refl refl refl = refl

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

  apᵈ-⁺ : (A₀₁ : A₀  A₁)  γ  ≡[ ap-Sub (ap-▹ᵣ (ap-[]ᵀ A₀₁)) (ap-▹ᵣ A₀₁) ] γ 
  apᵈ-⁺ refl = refl

  apᵈ-⟨⟩ :
    (A₀₁ : A₀  A₁) 
    a₀ ≡[ ap-Tm A₀₁ ] a₁   a₀  ≡[ ap-Sub refl (ap-▹ᵣ A₀₁) ]  a₁ 
  apᵈ-⟨⟩ refl refl = refl

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

⁺-⟨⟩ : γ    a   (γ , a)
⁺-⟨⟩ =
  ,-∘ 
  ap-,
    (sym assoc  ap-∘ᵣ ▹-β₁  idr)
    (splitl (apᵈ-[]ᵗ []ᵀ-∘ (splitl reflᵈ) ∙ᵈ merger ▹-β₂))

⁺-∘ :
  (γ  δ)  ≡[ ap-Subₗ (ap-▹ᵣ []ᵀ-∘) ]
  γ   δ   Sub (Θ  A [ γ ]ᵀ [ δ ]ᵀ) (Γ  A)
⁺-∘ =
  apᵈ-,
    (ap-▹ᵣ []ᵀ-∘)
    ( dep (sym assoc) ∙ᵈ
      apᵈ-∘ᵣ
        (ap-▹ᵣ []ᵀ-∘)
        (apᵈ-∘ᵣ (ap-▹ᵣ []ᵀ-∘) (apᵈ-p []ᵀ-∘) ∙ᵈ dep (sym ▹-β₁)) ∙ᵈ
      dep assoc)
    (splitlr
      ( symᵈ (merger {A₂₁ = ap-Tm (ap-[]ᵀ []ᵀ-∘  sym []ᵀ-∘)} ▹-β₂) ∙ᵈ
        apᵈ-[]ᵗ₄
          (sym []ᵀ-∘)
          refl
          (ap-▹ᵣ []ᵀ-∘)
          (apᵈ-,
            (ap-▹ᵣ []ᵀ-∘)
            (apᵈ-∘ᵣ (ap-▹ᵣ []ᵀ-∘) (apᵈ-p []ᵀ-∘))
            (splitlr (apᵈ-q []ᵀ-∘))))) ∙ᵈ
  dep (sym ,-∘)

⁺-id : id  ≡[ ap-Subₗ (ap-▹ᵣ []ᵀ-id) ] id  Sub (Γ  A) (Γ  A)
⁺-id =
  apᵈ-, (ap-▹ᵣ []ᵀ-id) (dep idl ∙ᵈ apᵈ-p []ᵀ-id) (splitl (apᵈ-q []ᵀ-id)) ∙ᵈ
  dep (sym ▹-η)

opaque
  unfolding coe

  apᵈ-U : (Γ₀₁ : Γ₀  Γ₁)  U i ≡[ ap-Ty Γ₀₁ ] U i
  apᵈ-U refl = refl

  apᵈ-El :
    (Γ₀₁ : Γ₀  Γ₁) 
    α₀ ≡[ ap-Tm₂ Γ₀₁ (apᵈ-U Γ₀₁) ] α₁  El α₀ ≡[ ap-Ty Γ₀₁ ] El α₁
  apᵈ-El refl refl = refl

  apᵈ-c :
    (Γ₀₁ : Γ₀  Γ₁) 
    A₀ ≡[ ap-Ty Γ₀₁ ] A₁  c A₀ ≡[ ap-Tm₂ Γ₀₁ (apᵈ-U Γ₀₁) ] c A₁
  apᵈ-c refl refl = refl

  apᵈ-Lift :
    (Γ₀₁ : Γ₀  Γ₁)  A₀ ≡[ ap-Ty Γ₀₁ ] A₁  Lift A₀ ≡[ ap-Ty Γ₀₁ ] Lift A₁
  apᵈ-Lift refl refl = refl

  apᵈ-lower :
    (Γ₀₁ : Γ₀  Γ₁) (A₀₁ : A₀ ≡[ ap-Ty Γ₀₁ ] A₁) 
    a₀ ≡[ ap-Tm₂ Γ₀₁ (apᵈ-Lift Γ₀₁ A₀₁) ] a₁ 
    lower a₀ ≡[ ap-Tm₂ Γ₀₁ A₀₁ ] lower a₁
  apᵈ-lower refl refl refl = refl

  apᵈ-lift :
    (Γ₀₁ : Γ₀  Γ₁) (A₀₁ : A₀ ≡[ ap-Ty Γ₀₁ ] A₁)  a₀ ≡[ ap-Tm₂ Γ₀₁ A₀₁ ] a₁ 
    lift a₀ ≡[ ap-Tm₂ Γ₀₁ (apᵈ-Lift Γ₀₁ A₀₁) ] lift a₁
  apᵈ-lift refl refl refl = refl

  apᵈ-Π :
    (Γ₀₁ : Γ₀  Γ₁)
    (A₀₁ : A₀ ≡[ ap-Ty Γ₀₁ ] A₁)  B₀ ≡[ ap-Ty (ap-▹ Γ₀₁ A₀₁) ] B₁ 
    Π A₀ B₀ ≡[ ap-Ty Γ₀₁ ] Π A₁ B₁
  apᵈ-Π refl refl refl = refl

  apᵈ-app :
    (Γ₀₁ : Γ₀  Γ₁)
    (A₀₁ : A₀ ≡[ ap-Ty Γ₀₁ ] A₁) (B₀₁ : B₀ ≡[ ap-Ty (ap-▹ Γ₀₁ A₀₁) ] B₁) 
    f₀ ≡[ ap-Tm₂ Γ₀₁ (apᵈ-Π Γ₀₁ A₀₁ B₀₁) ] f₁ 
    (a₀₁ : a₀ ≡[ ap-Tm₂ Γ₀₁ A₀₁ ] a₁) 
    app f₀ a₀
      ≡[ ap-Tm₂ Γ₀₁ (apᵈ-[]ᵀ (ap-▹ Γ₀₁ A₀₁) B₀₁ Γ₀₁ (apᵈ-⟨⟩₃ Γ₀₁ A₀₁ a₀₁)) ]
    app f₁ a₁
  apᵈ-app refl refl refl refl refl = refl

  apᵈ-lam :
    (Γ₀₁ : Γ₀  Γ₁)
    (A₀₁ : A₀ ≡[ ap-Ty Γ₀₁ ] A₁) (B₀₁ : B₀ ≡[ ap-Ty (ap-▹ Γ₀₁ A₀₁) ] B₁) 
    b₀ ≡[ ap-Tm₂ (ap-▹ Γ₀₁ A₀₁) B₀₁ ] b₁ 
    lam b₀ ≡[ ap-Tm₂ Γ₀₁ (apᵈ-Π Γ₀₁ A₀₁ B₀₁) ] lam b₁
  apᵈ-lam refl refl refl refl = refl