open import Cubical.Foundations.Prelude hiding (Sub)
open import Cubical.Foundations.Path
open import Cubical.Foundations.HLevels

module TT.Groupoid.ElimProp (X : hSet ℓ-zero) (Y : X .fst  hSet ℓ-zero) where

open import TT.Groupoid.Syntax X Y

private variable
  Γ Δ Θ : Con
  γ δ : Sub Δ Γ
  A B : Ty Γ
  a b : Tm Γ A
   : Tm Γ U
  f : Tm Γ (Π A B)

record DModel : Type₁ where
  no-eta-equality

  infixl 9 _∘ᴹ_ _[_]ᵀᴹ _[_]ᵗᴹ
  infixl 2 _▹ᴹ_
  infixl 10 _⁺ᴹ
  field
    Conᴹ : Con  Type
    Subᴹ : Conᴹ Δ  Conᴹ Γ  Sub Δ Γ  Type
    isPropSubᴹ :
      (Δᴹ : Conᴹ Δ) (Γᴹ : Conᴹ Γ) (γ : Sub Δ Γ)  isProp (Subᴹ Δᴹ Γᴹ γ)

    _∘ᴹ_ :
      {Δᴹ : Conᴹ Δ} {Γᴹ : Conᴹ Γ} {Θᴹ : Conᴹ Θ} 
      Subᴹ Δᴹ Γᴹ γ  Subᴹ Θᴹ Δᴹ δ  Subᴹ Θᴹ Γᴹ (γ  δ)
    idᴹ : {Γᴹ : Conᴹ Γ}  Subᴹ Γᴹ Γᴹ id

    Tyᴹ : Conᴹ Γ  Ty Γ  Type
    isPropTyᴹ : (Γᴹ : Conᴹ Γ) (A : Ty Γ)  isProp (Tyᴹ Γᴹ A)
    _[_]ᵀᴹ :
      {Γᴹ : Conᴹ Γ} {Δᴹ : Conᴹ Δ}  Tyᴹ Γᴹ A  Subᴹ Δᴹ Γᴹ γ  Tyᴹ Δᴹ (A [ γ ]ᵀ)

    Tmᴹ : (Γᴹ : Conᴹ Γ)  Tyᴹ Γᴹ A  Tm Γ A  Type
    isPropTmᴹ :
      (Γᴹ : Conᴹ Γ) (Aᴹ : Tyᴹ Γᴹ A) (a : Tm Γ A)  isProp (Tmᴹ Γᴹ Aᴹ a)
    _[_]ᵗᴹ :
      {Γᴹ : Conᴹ Γ} {Aᴹ : Tyᴹ Γᴹ A} {Δᴹ : Conᴹ Δ} 
      Tmᴹ Γᴹ Aᴹ a  (γᴹ : Subᴹ Δᴹ Γᴹ γ)  Tmᴹ Δᴹ (Aᴹ [ γᴹ ]ᵀᴹ) (a [ γ ]ᵗ)

    ◇ᴹ : Conᴹ 
    εᴹ : {Γᴹ : Conᴹ Γ}  Subᴹ Γᴹ ◇ᴹ ε

    _▹ᴹ_ : (Γᴹ : Conᴹ Γ)  Tyᴹ Γᴹ A  Conᴹ (Γ  A)
    pᴹ : {Γᴹ : Conᴹ Γ} {Aᴹ : Tyᴹ Γᴹ A}  Subᴹ (Γᴹ ▹ᴹ Aᴹ) Γᴹ p
    qᴹ : {Γᴹ : Conᴹ Γ} {Aᴹ : Tyᴹ Γᴹ A}  Tmᴹ (Γᴹ ▹ᴹ Aᴹ) (Aᴹ [ pᴹ ]ᵀᴹ) q

    _⁺ᴹ :
      {Δᴹ : Conᴹ Δ} {Γᴹ : Conᴹ Γ} {Aᴹ : Tyᴹ Γᴹ A} 
      (γᴹ : Subᴹ Δᴹ Γᴹ γ)  Subᴹ (Δᴹ ▹ᴹ Aᴹ [ γᴹ ]ᵀᴹ) (Γᴹ ▹ᴹ Aᴹ) (γ )
    ⟨_⟩ᴹ :
      {Γᴹ : Conᴹ Γ} {Aᴹ : Tyᴹ Γᴹ A} 
      (aᴹ : Tmᴹ Γᴹ Aᴹ a)  Subᴹ Γᴹ (Γᴹ ▹ᴹ Aᴹ)  a 

    Uᴹ : {Γᴹ : Conᴹ Γ}  Tyᴹ Γᴹ U
    Elᴹ : {Γᴹ : Conᴹ Γ}  Tmᴹ Γᴹ Uᴹ   Tyᴹ Γᴹ (El )

    Πᴹ : {Γᴹ : Conᴹ Γ} (Aᴹ : Tyᴹ Γᴹ A)  Tyᴹ (Γᴹ ▹ᴹ Aᴹ) B  Tyᴹ Γᴹ (Π A B)
    appᴹ :
      {Γᴹ : Conᴹ Γ} {Aᴹ : Tyᴹ Γᴹ A} {Bᴹ : Tyᴹ (Γᴹ ▹ᴹ Aᴹ) B} 
      Tmᴹ Γᴹ (Πᴹ Aᴹ Bᴹ) f  Tmᴹ (Γᴹ ▹ᴹ Aᴹ) Bᴹ (app f)
    lamᴹ :
      {Γᴹ : Conᴹ Γ} {Aᴹ : Tyᴹ Γᴹ A} {Bᴹ : Tyᴹ (Γᴹ ▹ᴹ Aᴹ) B} 
      Tmᴹ (Γᴹ ▹ᴹ Aᴹ) Bᴹ b  Tmᴹ Γᴹ (Πᴹ Aᴹ Bᴹ) (lam b)

    in-Xᴹ : (x : X .fst)  Tmᴹ ◇ᴹ Uᴹ (in-X x)
    in-Yᴹ : {x : X .fst} (y : Y x .fst)  Tmᴹ ◇ᴹ (Elᴹ (in-Xᴹ x)) (in-Y y)

  []ᵀ-∘ᴹ :
    {Γᴹ : Conᴹ Γ} {Δᴹ : Conᴹ Δ} {Θᴹ : Conᴹ Θ}
    (Aᴹ : Tyᴹ Γᴹ A) (γᴹ : Subᴹ Δᴹ Γᴹ γ) (δᴹ : Subᴹ Θᴹ Δᴹ δ) 
    PathP  i  Tyᴹ Θᴹ ([]ᵀ-∘ A γ δ i))
      (Aᴹ [ γᴹ ∘ᴹ δᴹ ]ᵀᴹ)
      (Aᴹ [ γᴹ ]ᵀᴹ [ δᴹ ]ᵀᴹ)
  []ᵀ-∘ᴹ Aᴹ γᴹ δᴹ = isProp→PathP  i  isPropTyᴹ _ _) _ _

  []ᵀ-idᴹ :
    {Γᴹ : Conᴹ Γ} (Aᴹ : Tyᴹ Γᴹ A) 
    PathP  i  Tyᴹ Γᴹ ([]ᵀ-id A i)) (Aᴹ [ idᴹ ]ᵀᴹ) Aᴹ
  []ᵀ-idᴹ Aᴹ = isProp→PathP  i  isPropTyᴹ _ _) _ _

  U-[]ᴹ :
    {Δᴹ : Conᴹ Δ} {Γᴹ : Conᴹ Γ} (γᴹ : Subᴹ Δᴹ Γᴹ γ) 
    PathP  i  Tyᴹ Δᴹ (U-[] γ i)) (Uᴹ [ γᴹ ]ᵀᴹ) Uᴹ
  U-[]ᴹ γᴹ = isProp→PathP  i  isPropTyᴹ _ _) _ _

  infixl 9 _[_]ᵘᴹ
  _[_]ᵘᴹ :
    {Γᴹ : Conᴹ Γ} {Δᴹ : Conᴹ Δ} 
    Tmᴹ Γᴹ Uᴹ   Subᴹ Δᴹ Γᴹ γ  Tmᴹ Δᴹ Uᴹ ( [ γ ]ᵘ)
  _[_]ᵘᴹ {} {γ} Âᴹ γᴹ =
    transport  i  Tmᴹ _ (U-[]ᴹ γᴹ i) ([]ᵘ-filler  γ i)) (Âᴹ [ γᴹ ]ᵗᴹ)

  El-[]ᴹ :
    {Γᴹ : Conᴹ Γ} {Δᴹ : Conᴹ Δ} (Âᴹ : Tmᴹ Γᴹ Uᴹ ) (γᴹ : Subᴹ Δᴹ Γᴹ γ) 
    PathP  i  Tyᴹ Δᴹ (El-[]  γ i)) (Elᴹ Âᴹ [ γᴹ ]ᵀᴹ) (Elᴹ (Âᴹ [ γᴹ ]ᵘᴹ))
  El-[]ᴹ Âᴹ γᴹ = isProp→PathP  i  isPropTyᴹ _ _) _ _

  Π-[]ᴹ :
    {Γᴹ : Conᴹ Γ} {Δᴹ : Conᴹ Δ}
    (Aᴹ : Tyᴹ Γᴹ A) (Bᴹ : Tyᴹ (Γᴹ ▹ᴹ Aᴹ) B) (γᴹ : Subᴹ Δᴹ Γᴹ γ) 
    PathP  i  Tyᴹ Δᴹ (Π-[] A B γ i))
      (Πᴹ Aᴹ Bᴹ [ γᴹ ]ᵀᴹ)
      (Πᴹ (Aᴹ [ γᴹ ]ᵀᴹ) (Bᴹ [ γᴹ ⁺ᴹ ]ᵀᴹ))
  Π-[]ᴹ Aᴹ Bᴹ γᴹ = isProp→PathP  i  isPropTyᴹ _ _) _ _

module Elim (M : DModel) where
  open DModel M

  ⟦_⟧ₛ : (s : Sort)  EL s  Type
  ⟦_⟧ : {s : Sort} (x : EL s)   s ⟧ₛ x

   con ⟧ₛ Γ = Conᴹ Γ
   sub Δ Γ ⟧ₛ γ = Subᴹ  Δ   Γ  γ
   ty Γ ⟧ₛ A = Tyᴹ  Γ  A
   tm Γ A ⟧ₛ a = Tmᴹ  Γ   A  a

   isSetSub Δ Γ γ₀ γ₁ P₀ P₁ i j  =
    isProp→SquareP
       i j  isPropSubᴹ  Δ   Γ  (isSetSub Δ Γ γ₀ γ₁ P₀ P₁ i j))
       i   γ₀ )
       i   γ₁ )
       j   P₀ j )
       j   P₁ j )
      i j
   γ  δ  =  γ  ∘ᴹ  δ 
   assoc γ δ θ i  =
    isProp→PathP  i  isPropSubᴹ _ _ (assoc γ δ θ i))
      ( γ  ∘ᴹ ( δ  ∘ᴹ  θ ))
      (( γ  ∘ᴹ  δ ) ∘ᴹ  θ )
      i

   id  = idᴹ
   idr γ i  =
    isProp→PathP  i  isPropSubᴹ _ _ (idr γ i)) ( γ  ∘ᴹ idᴹ)  γ  i
   idl γ i  =
    isProp→PathP  i  isPropSubᴹ _ _ (idl γ i)) (idᴹ ∘ᴹ  γ )  γ  i

   isGroupoidTy Γ A₀ A₁ P₀ P₁ S₀ S₁ i j k  =
    isGroupoid→CubeP
       i j k  Tyᴹ  Γ  (isGroupoidTy Γ A₀ A₁ P₀ P₁ S₀ S₁ i j k))
       j k   S₀ j k )
       j k   S₁ j k )
       i k   P₀ k )
       i k   P₁ k )
       i j   A₀ )
       i j   A₁ )
      (isSet→isGroupoid (isProp→isSet (isPropTyᴹ  Γ  A₁)))
      i j k
   A [ γ ]ᵀ  =  A  [  γ  ]ᵀᴹ
   []ᵀ-∘ A γ δ i  = []ᵀ-∘ᴹ  A   γ   δ  i
   []ᵀ-id A i  = []ᵀ-idᴹ  A  i

   isSetTm Γ A a₀ a₁ P₀ P₁ i j  =
    isProp→SquareP
       i j  isPropTmᴹ  Γ   A  (isSetTm Γ A a₀ a₁ P₀ P₁ i j))
       i   a₀ )
       i   a₁ )
       j   P₀ j )
       j   P₁ j )
      i j
   a [ γ ]ᵗ  =  a  [  γ  ]ᵗᴹ
   []ᵗ-∘ {A} a γ δ i  =
    isProp→PathP
       i  isPropTmᴹ _ ([]ᵀ-∘ᴹ  A   γ   δ  i) ([]ᵗ-∘ a γ δ i))
      ( a  [  γ  ∘ᴹ  δ  ]ᵗᴹ)
      ( a  [  γ  ]ᵗᴹ [  δ  ]ᵗᴹ)
      i
   []ᵗ-id {A} a i  =
    isProp→PathP  i  isPropTmᴹ _ ([]ᵀ-idᴹ  A  i) ([]ᵗ-id a i))
      ( a  [ idᴹ ]ᵗᴹ)
       a 
      i

     = ◇ᴹ
   ε  = εᴹ
   ε-∘ γ i  = isProp→PathP  i  isPropSubᴹ _ _ (ε-∘ γ i)) (εᴹ ∘ᴹ  γ ) εᴹ i
   ◇-η i  = isProp→PathP  i  isPropSubᴹ _ _ (◇-η i)) idᴹ εᴹ i

   Γ  A  =  Γ  ▹ᴹ  A 
   p  = pᴹ
   q  = qᴹ
   γ   =  γ  ⁺ᴹ
    a   =   a  ⟩ᴹ
   ⟨⟩-∘ a γ i  =
    isProp→PathP  i  isPropSubᴹ _ _ (⟨⟩-∘ a γ i))
      (  a  ⟩ᴹ ∘ᴹ  γ )
      ( γ  ⁺ᴹ ∘ᴹ   a  [  γ  ]ᵗᴹ ⟩ᴹ)
      i
   ▹-η i  =
    isProp→PathP  i  isPropSubᴹ _ _ (▹-η i)) idᴹ (pᴹ ⁺ᴹ ∘ᴹ  qᴹ ⟩ᴹ) i

   ⁺-∘ {A} γ δ i  =
    isProp→PathP
       i  isPropSubᴹ (_ ▹ᴹ []ᵀ-∘ᴹ  A   γ   δ  i) _ (⁺-∘ γ δ i))
      (( γ  ∘ᴹ  δ ) ⁺ᴹ)
      ( γ  ⁺ᴹ ∘ᴹ  δ  ⁺ᴹ)
      i
   []ᵀ-⁺-∘ {A} B γ δ i  =
    isProp→PathP
       i  isPropTyᴹ (_ ▹ᴹ []ᵀ-∘ᴹ  A   γ   δ  i) ([]ᵀ-⁺-∘ B γ δ i))
      (⟦B⟧ [ ( γ  ∘ᴹ  δ ) ⁺ᴹ ]ᵀᴹ)
      (⟦B⟧ [  γ  ⁺ᴹ ]ᵀᴹ [  δ  ⁺ᴹ ]ᵀᴹ)
      i
    where
    ⟦B⟧ : Tyᴹ (_ ▹ᴹ _) B
    ⟦B⟧ =  B 
   []ᵀ-⁺-∘-filler {A} B γ δ i j  =
    isProp→SquareP
       i j 
        isPropTyᴹ (_ ▹ᴹ []ᵀ-∘ᴹ  A   γ   δ  j) ([]ᵀ-⁺-∘-filler B γ δ i j))
       i  ⟦B⟧ [ ( γ  ∘ᴹ  δ ) ⁺ᴹ ]ᵀᴹ)
       i  []ᵀ-∘ᴹ ⟦B⟧ ( γ  ⁺ᴹ) ( δ  ⁺ᴹ) i)
       j 
        ⟦B⟧
          [ isProp→PathP
               j  isPropSubᴹ (_ ▹ᴹ []ᵀ-∘ᴹ  A   γ   δ  j) _ (⁺-∘ γ δ j))
              (( γ  ∘ᴹ  δ ) ⁺ᴹ)
              ( γ  ⁺ᴹ ∘ᴹ  δ  ⁺ᴹ)
              j ]ᵀᴹ)
       j 
        isProp→PathP
           j  isPropTyᴹ (_ ▹ᴹ []ᵀ-∘ᴹ  A   γ   δ  j) ([]ᵀ-⁺-∘ B γ δ j))
          (⟦B⟧ [ ( γ  ∘ᴹ  δ ) ⁺ᴹ ]ᵀᴹ)
          (⟦B⟧ [  γ  ⁺ᴹ ]ᵀᴹ [  δ  ⁺ᴹ ]ᵀᴹ)
          j)
      i j
    where
    ⟦B⟧ : Tyᴹ (_ ▹ᴹ _) B
    ⟦B⟧ =  B 

   ⁺-id {A} i  =
    isProp→PathP  i  isPropSubᴹ (_ ▹ᴹ []ᵀ-idᴹ  A  i) _ (⁺-id i))
      (idᴹ ⁺ᴹ)
      idᴹ
      i
   []ᵀ-⁺-id {A} B i  =
    isProp→PathP  i  isPropTyᴹ (_ ▹ᴹ []ᵀ-idᴹ  A  i) ([]ᵀ-⁺-id B i))
      (⟦B⟧ [ idᴹ ⁺ᴹ ]ᵀᴹ)
       B 
      i
    where
    ⟦B⟧ : Tyᴹ (_ ▹ᴹ _) B
    ⟦B⟧ =  B 
   []ᵀ-⁺-id-filler {A} B i j  =
    isProp→SquareP
       i j  isPropTyᴹ (_ ▹ᴹ []ᵀ-idᴹ  A  j) ([]ᵀ-⁺-id-filler B i j))
       i  ⟦B⟧ [ idᴹ ⁺ᴹ ]ᵀᴹ)
       i 
        isProp→PathP  i  isPropTyᴹ _ ([]ᵀ-id B i)) (⟦B⟧ [ idᴹ ]ᵀᴹ)  B  i)
       j 
        ⟦B⟧
          [ isProp→PathP  j  isPropSubᴹ (_ ▹ᴹ []ᵀ-idᴹ  A  j) _ (⁺-id j))
              (idᴹ ⁺ᴹ)
              idᴹ
              j ]ᵀᴹ)
       j 
        isProp→PathP  j  isPropTyᴹ (_ ▹ᴹ []ᵀ-idᴹ  A  j) ([]ᵀ-⁺-id B j))
          (⟦B⟧ [ idᴹ ⁺ᴹ ]ᵀᴹ)
           B 
          j)
      i j
    where
    ⟦B⟧ : Tyᴹ (_ ▹ᴹ _) B
    ⟦B⟧ =  B 

   p-⁺ γ i  =
    isProp→PathP  i  isPropSubᴹ (_ ▹ᴹ _) _ (p-⁺ γ i))
      (pᴹ ∘ᴹ  γ  ⁺ᴹ)
      ( γ  ∘ᴹ pᴹ)
      i
   []ᵀ-p-⁺ B γ i  =
    isProp→PathP  i  isPropTyᴹ (_ ▹ᴹ _) ([]ᵀ-p-⁺ B γ i))
      ( B  [ pᴹ ]ᵀᴹ [  γ  ⁺ᴹ ]ᵀᴹ)
      ( B  [  γ  ]ᵀᴹ [ pᴹ ]ᵀᴹ)
      i
   []ᵀ-p-⁺-filler B γ i j  =
    isProp→SquareP  i j  isPropTyᴹ (_ ▹ᴹ _) ([]ᵀ-p-⁺-filler B γ i j))
       i  []ᵀ-∘ᴹ  B  pᴹ ( γ  ⁺ᴹ) i)
       i  []ᵀ-∘ᴹ  B   γ  pᴹ i)
       j 
         B 
          [ isProp→PathP  j  isPropSubᴹ (_ ▹ᴹ _) _ (p-⁺ γ j))
              (pᴹ ∘ᴹ  γ  ⁺ᴹ)
              ( γ  ∘ᴹ pᴹ)
              j ]ᵀᴹ)
       j 
        isProp→PathP  j  isPropTyᴹ (_ ▹ᴹ _) ([]ᵀ-p-⁺ B γ j))
          ( B  [ pᴹ ]ᵀᴹ [  γ  ⁺ᴹ ]ᵀᴹ)
          ( B  [  γ  ]ᵀᴹ [ pᴹ ]ᵀᴹ)
          j)
      i j
   q-⁺ {A} γ i  =
    isProp→PathP
       i 
        isPropTmᴹ (_ ▹ᴹ _)
          (isProp→PathP  i  isPropTyᴹ (_ ▹ᴹ _) ([]ᵀ-p-⁺ A γ i))
            ( A  [ pᴹ ]ᵀᴹ [  γ  ⁺ᴹ ]ᵀᴹ)
            ( A  [  γ  ]ᵀᴹ [ pᴹ ]ᵀᴹ)
            i)
          (q-⁺ γ i))
      (qᴹ [  γ  ⁺ᴹ ]ᵗᴹ)
      qᴹ
      i

   p-⟨⟩ a i  =
    isProp→PathP  i  isPropSubᴹ _ _ (p-⟨⟩ a i)) (pᴹ ∘ᴹ   a  ⟩ᴹ) idᴹ i
   []ᵀ-p-⟨⟩ B a i  =
    isProp→PathP  i  isPropTyᴹ _ ([]ᵀ-p-⟨⟩ B a i))
      ( B  [ pᴹ ]ᵀᴹ [   a  ⟩ᴹ ]ᵀᴹ)
       B 
      i
   []ᵀ-p-⟨⟩-filler B a i j  =
    isProp→SquareP  i j  isPropTyᴹ _ ([]ᵀ-p-⟨⟩-filler B a i j))
       i  []ᵀ-∘ᴹ  B  pᴹ   a  ⟩ᴹ i)
       i  []ᵀ-idᴹ  B  i)
       j 
         B 
          [ isProp→PathP  j  isPropSubᴹ _ _ (p-⟨⟩ a j))
              (pᴹ ∘ᴹ   a  ⟩ᴹ)
              idᴹ
              j ]ᵀᴹ)
       j 
        isProp→PathP  i₁  isPropTyᴹ _ ([]ᵀ-p-⟨⟩ B a i₁))
          ( B  [ pᴹ ]ᵀᴹ [   a  ⟩ᴹ ]ᵀᴹ)
           B 
          j)
      i j
   q-⟨⟩ {A} a i  =
    isProp→PathP
       i 
        isPropTmᴹ _
          (isProp→PathP  i  isPropTyᴹ _ ([]ᵀ-p-⟨⟩ A a i))
            ( A  [ pᴹ ]ᵀᴹ [   a  ⟩ᴹ ]ᵀᴹ)
             A 
            i)
          (q-⟨⟩ a i))
      (qᴹ [   a  ⟩ᴹ ]ᵗᴹ)
       a 
      i

   U  = Uᴹ
   U-[] γ i  = U-[]ᴹ  γ  i
   U-[]-∘ {Θ} γ δ i j  =
    isProp→SquareP  i j  isPropTyᴹ _ (U-[]-∘ γ δ i j))
       i  U-[]ᴹ ( γ  ∘ᴹ  δ ) i)
       i 
        compPathP' {B = Tyᴹ  Θ }
           i  U-[]ᴹ  γ  i [  δ  ]ᵀᴹ)
           i  U-[]ᴹ  δ  i)
          i)
       j  []ᵀ-∘ᴹ Uᴹ  γ   δ  j)
       j  Uᴹ)
      i j
   U-[]-id i j  =
    isProp→SquareP  i j  isPropTyᴹ _ (U-[]-id i j))
       i  U-[]ᴹ idᴹ i)
       i  Uᴹ)
       j  []ᵀ-idᴹ Uᴹ j)
       j  Uᴹ)
      i j

    [ γ ]ᵘ  =    [  γ  ]ᵘᴹ
   []ᵘ-filler  γ i  =
    isProp→PathP  i  isPropTmᴹ _ (U-[]ᴹ  γ  i) ([]ᵘ-filler  γ i))
      (⟦Â⟧ [  γ  ]ᵗᴹ)
      (⟦Â⟧ [  γ  ]ᵘᴹ)
      i
    where
    ⟦Â⟧ : Tmᴹ _ Uᴹ 
    ⟦Â⟧ =   
   []ᵘ-∘  γ δ i  =
    isProp→PathP  i  isPropTmᴹ _ _ ([]ᵘ-∘  γ δ i))
      (   [  γ  ∘ᴹ  δ  ]ᵘᴹ)
      (   [  γ  ]ᵘᴹ [  δ  ]ᵘᴹ)
      i
   []ᵘ-id  i  =
    isProp→PathP  i  isPropTmᴹ _ _ ([]ᵘ-id  i)) (   [ idᴹ ]ᵘᴹ)    i

   El   = Elᴹ   
   El-[]  γ i  = El-[]ᴹ     γ  i
   El-[]-∘ {Θ}  γ δ i j  =
    isProp→SquareP  i j  isPropTyᴹ _ (El-[]-∘  γ δ i j))
       i  El-[]ᴹ    ( γ  ∘ᴹ  δ ) i)
       i 
        compPathP' {B = λ A  Tyᴹ  Θ  A}
           i  El-[]ᴹ     γ  i [  δ  ]ᵀᴹ)
           i  El-[]ᴹ (   [  γ  ]ᵘᴹ)  δ  i)
          i)
       j  []ᵀ-∘ᴹ (Elᴹ   )  γ   δ  j)
       j 
        Elᴹ
          (isProp→PathP  j  isPropTmᴹ _ _ ([]ᵘ-∘  γ δ j))
            (   [  γ  ∘ᴹ  δ  ]ᵘᴹ)
            (   [  γ  ]ᵘᴹ [  δ  ]ᵘᴹ)
            j))
      i j
   El-[]-id  i j  =
    isProp→SquareP  i j  isPropTyᴹ _ (El-[]-id  i j))
       i  El-[]ᴹ    idᴹ i)
       i  Elᴹ   )
       j  []ᵀ-idᴹ (Elᴹ   ) j)
       j 
        Elᴹ
          (isProp→PathP  j  isPropTmᴹ _ _ ([]ᵘ-id  j))
            (   [ idᴹ ]ᵘᴹ)
              
            j))
      i j

   Π A B  = Πᴹ  A   B 
   Π-[] A B γ i  = Π-[]ᴹ  A   B   γ  i
   Π-[]-∘ {Θ} A B γ δ i j  =
    isProp→SquareP  i j  isPropTyᴹ _ (Π-[]-∘ A B γ δ i j))
       i  Π-[]ᴹ  A   B  ( γ  ∘ᴹ  δ ) i)
       i 
        compPathP' {B = λ A  Tyᴹ  Θ  A}
           i  Π-[]ᴹ  A   B   γ  i [  δ  ]ᵀᴹ)
           i  Π-[]ᴹ ( A  [  γ  ]ᵀᴹ) (⟦B⟧ [  γ  ⁺ᴹ ]ᵀᴹ)  δ  i)
          i)
       j  []ᵀ-∘ᴹ (Πᴹ  A   B )  γ   δ  j)
       j 
        Πᴹ
          ([]ᵀ-∘ᴹ  A   γ   δ  j)
          (isProp→PathP
             j  isPropTyᴹ (_ ▹ᴹ []ᵀ-∘ᴹ  A   γ   δ  j) ([]ᵀ-⁺-∘ B γ δ j))
            (⟦B⟧ [ ( γ  ∘ᴹ  δ ) ⁺ᴹ ]ᵀᴹ)
            (⟦B⟧ [  γ  ⁺ᴹ ]ᵀᴹ [  δ  ⁺ᴹ ]ᵀᴹ)
            j))
      i j
    where
    ⟦B⟧ : Tyᴹ (_ ▹ᴹ _) B
    ⟦B⟧ =  B 
   Π-[]-id A B i j  =
    isProp→SquareP  i j  isPropTyᴹ _ (Π-[]-id A B i j))
       i  Π-[]ᴹ  A   B  idᴹ i)
       i  Πᴹ  A   B )
       j  []ᵀ-idᴹ (Πᴹ  A   B ) j)
       j 
        Πᴹ
          ([]ᵀ-idᴹ  A  j)
          (isProp→PathP  j  isPropTyᴹ (_ ▹ᴹ []ᵀ-idᴹ  A  j) ([]ᵀ-⁺-id B j))
            (⟦B⟧ [ idᴹ ⁺ᴹ ]ᵀᴹ)
             B 
            j))
      i j
    where
    ⟦B⟧ : Tyᴹ (_ ▹ᴹ _) B
    ⟦B⟧ =  B 

   app f  = appᴹ  f 
   lam b  = lamᴹ  b 
   lam-[] b γ i  =
    isProp→PathP  i  isPropTmᴹ _ (Π-[]ᴹ _ _ _ i) (lam-[] b γ i))
      (lamᴹ  b  [  γ  ]ᵗᴹ)
      (lamᴹ (⟦b⟧ [  γ  ⁺ᴹ ]ᵗᴹ))
      i
    where
    ⟦b⟧ : Tmᴹ (_ ▹ᴹ _) _ b
    ⟦b⟧ =  b 
   Π-β b i  =
    isProp→PathP  i  isPropTmᴹ _ _ (Π-β b i)) (appᴹ (lamᴹ  b ))  b  i
   Π-η f i  =
    isProp→PathP  i  isPropTmᴹ _ _ (Π-η f i))  f  (lamᴹ (appᴹ  f )) i

   in-X x  = in-Xᴹ x
   in-Y y  = in-Yᴹ y