module DPRLR.Gluing.DisplayedModel where

open import Cubical.Foundations.Prelude
  using (Level ; Type ; ℓ-suc ; isSet ; isProp→isSet)
open import Cubical.Foundations.HLevels
  using (isSetΣ ; isSetΠ2 ; isSet×)
open import Cubical.Data.Bool.Properties using (isSetBool)
open import Cubical.Data.Sigma hiding (Sub)
open import Cubical.Data.Unit using (isSetUnit*)

open import DPRLR.Simplicial.Hom
open import DPRLR.Simplicial.Contravariant
  using
    ( isContravariant
    ; contravariant-reindex
    ; contravariant-Π
    )
open import DPRLR.Object.Simple.Model
open import DPRLR.Object.Simple.Displayed
open import DPRLR.Gluing.GluingModel
open import DPRLR.Gluing.Simple.Judgment using (_≤ᵍ_ ;  ; r∙ ; ≤→≤ᵍ)
open import DPRLR.Gluing.Simple.Bool using (BOOL∙ ; ⌜_⌝)

module _ {ℓM : Level} (𝓜 : SimpleDirectedCwF ℓM) where

  open SimpleDirectedCwF 𝓜
    renaming
      ( Ctx to Ctxₘ
      ; Ty to Tyₘ
      ; Sub to Subₘ
      ; Tm to Tmₘ
      ; id to idₘ
      ; ε to εₘ
      ; _▷_ to _▷ₘ_
      ; p to pₘ
      ; q to qₘ
      ; _∘_ to _∘ₘ_
      ; _[_]Tm to _[_]Tmₘ
      ; Bool to Boolₘ
      ; _×ᵗʸ_ to _×ᵗʸₘ_
      ; fst to fstₘ
      ; snd to sndₘ
      ; _⇒ᵗʸ_ to _⇒ᵗʸₘ_
      ; app to appₘ
      ; tm-thin to tm-thinₘ
      )

  record CtxPred (Γ° : Ctxₘ) : Type (ℓ-suc ℓM) where
    field
      Γ∙ : Subₘ εₘ Γ°  Type ℓM
      Γ∙-isSet : (γ° : Subₘ εₘ Γ°)  isSet (Γ∙ γ°)

  record TyPred ( : Tyₘ) : Type (ℓ-suc ℓM) where
    field
      A∙ : Tmₘ εₘ   Type ℓM
      cA : isContravariant A∙
      A∙-isSet : ( : Tmₘ εₘ )  isSet (A∙ )

  CTX :
    (Γ° : Ctxₘ)
     CtxPred Γ°
     GluCtx 𝓜
  GluCtx.Γ° (CTX Γ° Γ∙) = Γ°
  GluCtx.Γ∙ (CTX Γ° Γ∙) = CtxPred.Γ∙ Γ∙

  TY :
    ( : Tyₘ)
     TyPred 
     GluTy 𝓜
  GluTy.A° (TY  A∙) = 
  GluTy.A∙ (TY  A∙) = TyPred.A∙ A∙
  GluTy.cA (TY  A∙) = TyPred.cA A∙

  SUB :
    {Γ° Δ° : Ctxₘ}
    {Γ∙ : CtxPred Γ°}
    {Δ∙ : CtxPred Δ°}
    (σ° : Subₘ Γ° Δ°)
     ((γ° : Subₘ εₘ Γ°)  CtxPred.Γ∙ Γ∙ γ°  CtxPred.Γ∙ Δ∙ (σ° ∘ₘ γ°))
     GluSub 𝓜 (CTX Γ° Γ∙) (CTX Δ° Δ∙)
  GluSub.σ° (SUB σ° σ∙) = σ°
  GluSub.σ∙ (SUB σ° σ∙) = σ∙

  TM :
    {Γ° : Ctxₘ} { : Tyₘ}
    {Γ∙ : CtxPred Γ°}
    {A∙ : TyPred }
    ( : Tmₘ Γ° )
     ((γ° : Subₘ εₘ Γ°) (γ∙ : CtxPred.Γ∙ Γ∙ γ°)
         TyPred.A∙ A∙ ( [ γ° ]Tmₘ))
     GluTm 𝓜 (CTX Γ° Γ∙) (TY  A∙)
  GluTm.M° (TM  M∙) = 
  GluTm.M∙ (TM  M∙) = M∙

  TMPredᴰ :
    {Γ° : Ctxₘ} { : Tyₘ}
     CtxPred Γ°
     TyPred 
     Tmₘ Γ° 
     Type ℓM
  TMPredᴰ {Γ° = Γ°} Γ∙ A∙  =
    (γ° : Subₘ εₘ Γ°) (γ∙ : CtxPred.Γ∙ Γ∙ γ°)
     TyPred.A∙ A∙ ( [ γ° ]Tmₘ)

  TMPredᴰ-isSet :
    {Γ° : Ctxₘ} { : Tyₘ}
    (Γ∙ : CtxPred Γ°)
    (A∙ : TyPred )
    ( : Tmₘ Γ° )
     isSet (TMPredᴰ Γ∙ A∙ )
  TMPredᴰ-isSet Γ∙ A∙  =
    isSetΠ2 λ γ° _ 
      TyPred.A∙-isSet A∙ ( [ γ° ]Tmₘ)

  TMPredᴰ-contravariant :
    {Γ° : Ctxₘ} { : Tyₘ}
    (Γ∙ : CtxPred Γ°)
    (A∙ : TyPred )
     isContravariant (TMPredᴰ Γ∙ A∙)
  TMPredᴰ-contravariant Γ∙ A∙ =
    contravariant-Π λ γ° 
      contravariant-Π λ _ 
        contravariant-reindex
              [ γ° ]Tmₘ)
          (TyPred.cA A∙)

  BOOLᴰ : TyPred Boolₘ
  TyPred.A∙ BOOLᴰ =
    GluTy.A∙ (BOOL 𝓜)
  TyPred.cA BOOLᴰ =
    GluTy.cA (BOOL 𝓜)
  TyPred.A∙-isSet BOOLᴰ = λ  
    isSetΣ isSetBool λ b 
      isProp→isSet (tm-thinₘ εₘ Boolₘ  (⌜_⌝ 𝓜 b))

  PRODᴰ : {  : Tyₘ}  TyPred   TyPred   TyPred ( ×ᵗʸₘ )
  TyPred.A∙ (PRODᴰ { = } { = } A∙ B∙) =
    GluTy.A∙ (PROD 𝓜 (TY  A∙) (TY  B∙))
  TyPred.cA (PRODᴰ { = } { = } A∙ B∙) =
    GluTy.cA (PROD 𝓜 (TY  A∙) (TY  B∙))
  TyPred.A∙-isSet (PRODᴰ A∙ B∙)  =
    isSet×
      (TyPred.A∙-isSet A∙ (fstₘ ))
      (TyPred.A∙-isSet B∙ (sndₘ ))

  FUNᴰ : {  : Tyₘ}  TyPred   TyPred   TyPred ( ⇒ᵗʸₘ )
  TyPred.A∙ (FUNᴰ { = } { = } A∙ B∙) =
    GluTy.A∙ (FUN 𝓜 (TY  A∙) (TY  B∙))
  TyPred.cA (FUNᴰ { = } { = } A∙ B∙) =
    GluTy.cA (FUN 𝓜 (TY  A∙) (TY  B∙))
  TyPred.A∙-isSet (FUNᴰ { = } { = } A∙ B∙)  =
    isSetΠ2 λ  M∙ 
      TyPred.A∙-isSet B∙ (appₘ  )

  εᴰ : CtxPred εₘ
  CtxPred.Γ∙ εᴰ =
    GluCtx.Γ∙ (εᵍ 𝓜)
  CtxPred.Γ∙-isSet εᴰ _ =
    isSetUnit*

  _▷ᴰ_ :
    {Γ° : Ctxₘ} { : Tyₘ}
     CtxPred Γ°
     TyPred 
     CtxPred (Γ° ▷ₘ )
  CtxPred.Γ∙ (_▷ᴰ_ {Γ° = Γ°} { = } Γ∙ A∙) =
    GluCtx.Γ∙ (_▷ᵍ_ 𝓜 (CTX Γ° Γ∙) (TY  A∙))
  CtxPred.Γ∙-isSet (Γ∙ ▷ᴰ A∙) δ° =
    isSetΣ
      (CtxPred.Γ∙-isSet Γ∙ (pₘ ∘ₘ δ°))
       _  TyPred.A∙-isSet A∙ (qₘ [ δ° ]Tmₘ))

  prodTmᴰ :
    {Γ° : Ctxₘ} {  : Tyₘ}
     (Γ∙ : CtxPred Γ°)
     (A∙ : TyPred )
     (B∙ : TyPred )
     ( : Tmₘ Γ° ( ×ᵗʸₘ ))
     ((γ° : Subₘ εₘ Γ°) (γ∙ : CtxPred.Γ∙ Γ∙ γ°)
         TyPred.A∙ (PRODᴰ A∙ B∙) ( [ γ° ]Tmₘ))
     GluTm 𝓜 (CTX Γ° Γ∙) (PROD 𝓜 (TY  A∙) (TY  B∙))
  prodTmᴰ Γ∙ A∙ B∙  P∙ =
    record
      {  = 
      ; M∙ = P∙
      }

  funTmᴰ :
    {Γ° : Ctxₘ} {  : Tyₘ}
     (Γ∙ : CtxPred Γ°)
     (A∙ : TyPred )
     (B∙ : TyPred )
     ( : Tmₘ Γ° ( ⇒ᵗʸₘ ))
     ((γ° : Subₘ εₘ Γ°) (γ∙ : CtxPred.Γ∙ Γ∙ γ°)
         TyPred.A∙ (FUNᴰ A∙ B∙) ( [ γ° ]Tmₘ))
     GluTm 𝓜 (CTX Γ° Γ∙) (FUN 𝓜 (TY  A∙) (TY  B∙))
  funTmᴰ Γ∙ A∙ B∙  F∙ =
    record
      {  = 
      ; M∙ = F∙
      }

  gluing-homP :
    {Γ : GluCtx 𝓜} {A : GluTy 𝓜}
    {M N : GluTm 𝓜 Γ A}
    (r : _≤ᵍ_ 𝓜 {Γ = Γ} {A = A} M N)
       
        (γ° : Subₘ εₘ (GluCtx.Γ° Γ)) (γ∙ : GluCtx.Γ∙ Γ γ°)
         GluTy.A∙ A ( [ γ° ]Tmₘ))
       GluTm.M∙ M ≤[ _≤ᵍ_.r° r ] GluTm.M∙ N
  gluing-homP r =
     i γ° γ∙  fst (_≤ᵍ_.r∙ r γ° γ∙) i)
    ,  i γ° γ∙  fst (snd (_≤ᵍ_.r∙ r γ° γ∙)) i)
    ,  i γ° γ∙  snd (snd (_≤ᵍ_.r∙ r γ° γ∙)) i)

  gluing-homP≤ :
    {Γ : GluCtx 𝓜} {A : GluTy 𝓜}
    {M N : GluTm 𝓜 Γ A}
    (h : M  N)
       
        (γ° : Subₘ εₘ (GluCtx.Γ° Γ)) (γ∙ : GluCtx.Γ∙ Γ γ°)
         GluTy.A∙ A ( [ γ° ]Tmₘ))
       GluTm.M∙ M ≤[ hom-map GluTm.M° h ] GluTm.M∙ N
  gluing-homP≤ h =
    gluing-homP (≤→≤ᵍ 𝓜 h)

  GluingDisplayed :
    DisplayedSimpleCwF (ℓ-suc ℓM) ℓM (SimpleDirectedCwF.cwf 𝓜)
  GluingDisplayed =
    record
      { Ctx∙ = CtxPred
      ; Ty∙ = TyPred
      ; Sub∙ = λ {Γ = Γ°} Γ∙ Δ∙ σ° 
          (γ° : Subₘ εₘ Γ°)
           CtxPred.Γ∙ Γ∙ γ°
           CtxPred.Γ∙ Δ∙ (σ° ∘ₘ γ°)
      ; Tm∙ = λ {Γ = Γ°} Γ∙ A∙  
          (γ° : Subₘ εₘ Γ°) (γ∙ : CtxPred.Γ∙ Γ∙ γ°)
           TyPred.A∙ A∙ ( [ γ° ]Tmₘ)
      ; id∙ = λ {Γ = Γ°} {Γ∙ = Γ∙} 
          GluSub.σ∙ (idᵍ 𝓜 (CTX Γ° Γ∙))
      ; _∘∙_ = λ {Γ∙ = Γ∙} {Δ∙ = Δ∙} {Θ∙ = Θ∙} {σ = σ°} {τ = τ°} τ∙ σ∙ 
          GluSub.σ∙
            (_∘ᵍ_ 𝓜
              (SUB {Γ∙ = Θ∙} {Δ∙ = Δ∙} τ° τ∙)
              (SUB {Γ∙ = Γ∙} {Δ∙ = Θ∙} σ° σ∙))
      ; id-left∙ = λ {Γ∙ = Γ∙} {Δ∙ = Δ∙} {σ = σ°} σ∙ i 
          GluSub.σ∙ (id-leftᵍ 𝓜 (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙) i)
      ; id-right∙ = λ {Γ∙ = Γ∙} {Δ∙ = Δ∙} {σ = σ°} σ∙ i 
          GluSub.σ∙ (id-rightᵍ 𝓜 (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙) i)
      ; ∘-assoc∙ =
          λ {Γ∙ = Γ∙} {Δ∙ = Δ∙} {Θ∙ = Θ∙} {Ξ∙ = Ξ∙}
            {σ = σ°} {τ = τ°} {ρ = ρ°} ρ∙ τ∙ σ∙ i 
          GluSub.σ∙
            (∘-assocᵍ 𝓜
              (SUB {Γ∙ = Θ∙} {Δ∙ = Ξ∙} ρ° ρ∙)
              (SUB {Γ∙ = Δ∙} {Δ∙ = Θ∙} τ° τ∙)
              (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙)
              i)
      ; _[_]Tm∙ = λ {Γ∙ = Γ∙} {Δ∙ = Δ∙} {A∙ = A∙} {M = } {σ = σ°} M∙ σ∙ 
          GluTm.M∙
            (_[_]Tmᵍ 𝓜
              (TM {Γ∙ = Δ∙} {A∙ = A∙}  M∙)
              (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙))
      ; Tm-id∙ = λ {Γ∙ = Γ∙} {A∙ = A∙} {M = } M∙ i 
          GluTm.M∙ (Tm-idᵍ 𝓜 (TM {Γ∙ = Γ∙} {A∙ = A∙}  M∙) i)
      ; Tm-∘∙ =
          λ {Γ∙ = Γ∙} {Δ∙ = Δ∙} {Θ∙ = Θ∙} {A∙ = A∙}
            {M = } {τ = τ°} {σ = σ°} M∙ τ∙ σ∙ i 
          GluTm.M∙
            (Tm-∘ᵍ 𝓜
              (TM {Γ∙ = Θ∙} {A∙ = A∙}  M∙)
              (SUB {Γ∙ = Δ∙} {Δ∙ = Θ∙} τ° τ∙)
              (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙)
              i)
      ; ε∙ = εᴰ
      ; ε-sub∙ = λ {Γ = Γ°} {Γ∙ = Γ∙} 
          GluSub.σ∙ (ε-subᵍ 𝓜 {Γ = CTX Γ° Γ∙})
      ; εη∙ = λ {Γ∙ = Γ∙} {σ = σ°} σ∙ i 
          GluSub.σ∙ (εηᵍ 𝓜 (SUB {Γ∙ = Γ∙} {Δ∙ = εᴰ} σ° σ∙) i)
      ; _▷∙_ = λ {Γ = Γ°} {A = } Γ∙ A∙ 
          Γ∙ ▷ᴰ A∙
      ; p∙ = λ {Γ = Γ°} {A = } {Γ∙ = Γ∙} {A∙ = A∙} 
          GluSub.σ∙ (pᵍ 𝓜 {Γ = CTX Γ° Γ∙} {A = TY  A∙})
      ; q∙ = λ {Γ = Γ°} {A = } {Γ∙ = Γ∙} {A∙ = A∙} 
          GluTm.M∙ (qᵍ 𝓜 {Γ = CTX Γ° Γ∙} {A = TY  A∙})
      ; ⟨_,_⟩∙ = λ {Γ∙ = Γ∙} {Δ∙ = Δ∙} {A∙ = A∙} {σ = σ°} {M = } σ∙ M∙ 
          GluSub.σ∙
            (⟨_,_⟩ᵍ 𝓜
              (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙)
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  M∙))
      ; p-⟨⟩∙ = λ {Γ∙ = Γ∙} {Δ∙ = Δ∙} {A∙ = A∙} {σ = σ°} {M = } σ∙ M∙ i 
          GluSub.σ∙
            (p-⟨⟩ᵍ 𝓜
              (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙)
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  M∙)
              i)
      ; q-⟨⟩∙ = λ {Γ∙ = Γ∙} {Δ∙ = Δ∙} {A∙ = A∙} {σ = σ°} {M = } σ∙ M∙ i 
          GluTm.M∙
            (q-⟨⟩ᵍ 𝓜
              (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙)
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  M∙)
              i)
      ; ▷η∙ = λ {Γ = Γ°} {A = } {Γ∙ = Γ∙} {A∙ = A∙} i 
          GluSub.σ∙ (▷ηᵍ 𝓜 {Γ = CTX Γ° Γ∙} {A = TY  A∙} i)
      ; ⟨⟩-∘∙ =
          λ {Γ∙ = Γ∙} {Δ∙ = Δ∙} {Θ∙ = Θ∙} {A∙ = A∙}
            {σ = σ°} {M = } {ρ = ρ°} σ∙ M∙ ρ∙ i 
          GluSub.σ∙
            (⟨⟩-∘ᵍ 𝓜
              (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙)
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  M∙)
              (SUB {Γ∙ = Θ∙} {Δ∙ = Γ∙} ρ° ρ∙)
              i)
      ; Bool∙ = BOOLᴰ
      ; true∙ = λ {Γ = Γ°} {Γ∙ = Γ∙} 
          GluTm.M∙ (TRUE 𝓜 {Γ = CTX Γ° Γ∙})
      ; false∙ = λ {Γ = Γ°} {Γ∙ = Γ∙} 
          GluTm.M∙ (FALSE 𝓜 {Γ = CTX Γ° Γ∙})
      ; if∙ = λ {Γ∙ = Γ∙} {A∙ = A∙} {B = } {T = } {F = } B∙ T∙ F∙ 
          GluTm.M∙
            (IF 𝓜
              (TM {Γ∙ = Γ∙} {A∙ = BOOLᴰ}  B∙)
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  T∙)
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  F∙))
      ; true[]∙ = λ {Γ∙ = Γ∙} {Δ∙ = Δ∙} {σ = σ°} σ∙ i 
          GluTm.M∙ (TRUE[] 𝓜 (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙) i)
      ; false[]∙ = λ {Γ∙ = Γ∙} {Δ∙ = Δ∙} {σ = σ°} σ∙ i 
          GluTm.M∙ (FALSE[] 𝓜 (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙) i)
      ; if[]∙ =
          λ {Γ∙ = Γ∙} {Δ∙ = Δ∙} {A∙ = A∙} {B = } {T = } {F = } {σ = σ°}
            B∙ T∙ F∙ σ∙ i 
          GluTm.M∙
            (IF[] 𝓜
              (TM {Γ∙ = Δ∙} {A∙ = BOOLᴰ}  B∙)
              (TM {Γ∙ = Δ∙} {A∙ = A∙}  T∙)
              (TM {Γ∙ = Δ∙} {A∙ = A∙}  F∙)
              (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙)
              i)
      ; βif-true∙ = λ {Γ∙ = Γ∙} {A∙ = A∙} {T = } {F = } T∙ F∙ 
          gluing-homP≤
            (IF-preserves-β-true 𝓜
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  T∙)
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  F∙))
      ; βif-false∙ = λ {Γ∙ = Γ∙} {A∙ = A∙} {T = } {F = } T∙ F∙ 
          gluing-homP≤
            (IF-preserves-β-false 𝓜
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  T∙)
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  F∙))
      ; _×ᵗʸ∙_ = λ A∙ B∙  PRODᴰ A∙ B∙
      ; pair∙ = λ {A = } {B = } {Γ∙ = Γ∙} {A∙ = A∙} {B∙ = B∙}
          {M = } {N = } M∙ N∙ 
          GluTm.M∙
            (PAIR 𝓜 {A = TY  A∙} {B = TY  B∙}
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  M∙)
              (TM {Γ∙ = Γ∙} {A∙ = B∙}  N∙))
      ; fst∙ = λ {A = } {B = } {Γ∙ = Γ∙} {A∙ = A∙} {B∙ = B∙} {P = } P∙ 
          GluTm.M∙
            (FST 𝓜 {A = TY  A∙} {B = TY  B∙}
              (prodTmᴰ Γ∙ A∙ B∙  P∙))
      ; snd∙ = λ {A = } {B = } {Γ∙ = Γ∙} {A∙ = A∙} {B∙ = B∙} {P = } P∙ 
          GluTm.M∙
            (SND 𝓜 {A = TY  A∙} {B = TY  B∙}
              (prodTmᴰ Γ∙ A∙ B∙  P∙))
      ; pair[]∙ =
          λ {A = } {B = } {Γ∙ = Γ∙} {Δ∙ = Δ∙} {A∙ = A∙} {B∙ = B∙}
            {M = } {N = } {σ = σ°} M∙ N∙ σ∙ i 
          GluTm.M∙
            (PAIR[] 𝓜
              {A = TY  A∙}
              {B = TY  B∙}
              (TM {Γ∙ = Δ∙} {A∙ = A∙}  M∙)
              (TM {Γ∙ = Δ∙} {A∙ = B∙}  N∙)
              (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙)
              i)
      ; fst[]∙ = λ {A = } {B = } {Γ∙ = Γ∙} {Δ∙ = Δ∙} {A∙ = A∙}
          {B∙ = B∙} {P = } {σ = σ°} P∙ σ∙ i 
          GluTm.M∙
            (FST[] 𝓜
              {A = TY  A∙}
              {B = TY  B∙}
              (prodTmᴰ Δ∙ A∙ B∙  P∙)
              (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙)
              i)
      ; snd[]∙ = λ {A = } {B = } {Γ∙ = Γ∙} {Δ∙ = Δ∙} {A∙ = A∙}
          {B∙ = B∙} {P = } {σ = σ°} P∙ σ∙ i 
          GluTm.M∙
            (SND[] 𝓜
              {A = TY  A∙}
              {B = TY  B∙}
              (prodTmᴰ Δ∙ A∙ B∙  P∙)
              (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙)
              i)
      ; β×₁∙ = λ {A = } {B = } {Γ∙ = Γ∙} {A∙ = A∙} {B∙ = B∙}
          {M = } {N = } M∙ N∙ 
          gluing-homP≤
            (PROD-preserves-β₁ 𝓜
              {A = TY  A∙}
              {B = TY  B∙}
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  M∙)
              (TM {Γ∙ = Γ∙} {A∙ = B∙}  N∙))
      ; β×₂∙ = λ {A = } {B = } {Γ∙ = Γ∙} {A∙ = A∙} {B∙ = B∙}
          {M = } {N = } M∙ N∙ 
          gluing-homP≤
            (PROD-preserves-β₂ 𝓜
              {A = TY  A∙}
              {B = TY  B∙}
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  M∙)
              (TM {Γ∙ = Γ∙} {A∙ = B∙}  N∙))
      ; η×∙ = λ {A = } {B = } {Γ∙ = Γ∙} {A∙ = A∙} {B∙ = B∙} {P = } P∙ 
          gluing-homP≤
            (PROD-preserves-η 𝓜
              {A = TY  A∙}
              {B = TY  B∙}
              (prodTmᴰ Γ∙ A∙ B∙  P∙))
      ; _⇒ᵗʸ∙_ = λ A∙ B∙  FUNᴰ A∙ B∙
      ; lam∙ = λ {Γ = Γ°} {A = } {B = } {Γ∙ = Γ∙} {A∙ = A∙} {B∙ = B∙}
          {N = } N∙ 
          GluTm.M∙
            (LAM 𝓜 {Γ = CTX Γ° Γ∙} {A = TY  A∙} {B = TY  B∙}
              (TM {Γ∙ = Γ∙ ▷ᴰ A∙} {A∙ = B∙}  N∙))
      ; app∙ = λ {A = } {B = } {Γ∙ = Γ∙} {A∙ = A∙} {B∙ = B∙}
          {F = } {M = } F∙ M∙ 
          GluTm.M∙
            (APP 𝓜 {A = TY  A∙} {B = TY  B∙}
              (funTmᴰ Γ∙ A∙ B∙  F∙)
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  M∙))
      ; lam[]∙ =
          λ {Γ = Γ°} {Δ = Δ°} {A = } {B = }
            {Γ∙ = Γ∙} {Δ∙ = Δ∙} {A∙ = A∙} {B∙ = B∙}
            {N = } {σ = σ°} N∙ σ∙ i 
          GluTm.M∙
            (LAM[] 𝓜 {Γ = CTX Γ° Γ∙} {Δ = CTX Δ° Δ∙} {A = TY  A∙} {B = TY  B∙}
              (TM {Γ∙ = Δ∙ ▷ᴰ A∙} {A∙ = B∙}  N∙)
              (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙)
              i)
      ; app[]∙ =
          λ {A = } {B = } {Γ∙ = Γ∙} {Δ∙ = Δ∙} {A∙ = A∙} {B∙ = B∙}
            {F = } {M = } {σ = σ°} F∙ M∙ σ∙ i 
          GluTm.M∙
            (APP[] 𝓜
              {A = TY  A∙}
              {B = TY  B∙}
              (funTmᴰ Δ∙ A∙ B∙  F∙)
              (TM {Γ∙ = Δ∙} {A∙ = A∙}  M∙)
              (SUB {Γ∙ = Γ∙} {Δ∙ = Δ∙} σ° σ∙)
              i)
      ; β⇒∙ =
          λ {Γ = Γ°} {A = } {B = } {Γ∙ = Γ∙} {A∙ = A∙} {B∙ = B∙}
            {N = } {M = } N∙ M∙ 
          gluing-homP≤
            (FUN-preserves-β 𝓜
              {A = TY  A∙}
              {B = TY  B∙}
              (TM {Γ∙ = Γ∙ ▷ᴰ A∙} {A∙ = B∙}  N∙)
              (TM {Γ∙ = Γ∙} {A∙ = A∙}  M∙))
      ; η⇒∙ = λ {A = } {B = } {Γ∙ = Γ∙} {A∙ = A∙} {B∙ = B∙} {F = } F∙ 
          gluing-homP≤
            (FUN-preserves-η 𝓜
              {A = TY  A∙}
              {B = TY  B∙}
              (funTmᴰ Γ∙ A∙ B∙  F∙))
      }