module A201801.STLCStandardDerivations-Traditional where

open import A201801.Prelude
open import A201801.Category
open import A201801.Fin
open import A201801.Vec
open import A201801.AllVec
open import A201801.STLCTypes
open import A201801.STLCStandardTerms
import A201801.STLCStandardDerivations as STLC


--------------------------------------------------------------------------------


infix 3 _⊢_⦂_true
data _⊢_⦂_true :  {g}  Types g  Term g  Type  Set
  where
    var :  {A g I}  {Γ : Types g}
                     Γ ∋⟨ I  A
                     Γ  VAR I  A true

    lam :  {A B g M}  {Γ : Types g}
                       Γ , A  M  B true
                       Γ  LAM M  A  B true

    app :  {A B g M N}  {Γ : Types g}
                         Γ  M  A  B true  Γ  N  A true
                         Γ  APP M N  B true


--------------------------------------------------------------------------------


 :  {g M A}  {Γ : Types g}
               Γ  M  A true
               STLC.⊢ M  A valid[ Γ ]
 (var i)   = STLC.var i
 (lam 𝒟)   = STLC.lam ( 𝒟)
 (app 𝒟 ) = STLC.app ( 𝒟) ( )


 :  {g M A}  {Γ : Types g}
               STLC.⊢ M  A valid[ Γ ]
               Γ  M  A true
 (STLC.var i)   = var i
 (STLC.lam 𝒟)   = lam ( 𝒟)
 (STLC.app 𝒟 ) = app ( 𝒟) ( )


id↓↑ :  {g M A}  {Γ : Types g}
                  (𝒟 : STLC.⊢ M  A valid[ Γ ])
                  (  ) 𝒟  𝒟
id↓↑ (STLC.var i)   = refl
id↓↑ (STLC.lam 𝒟)   = STLC.lam & id↓↑ 𝒟
id↓↑ (STLC.app 𝒟 ) = STLC.app & id↓↑ 𝒟  id↓↑ 


id↑↓ :  {g M A}  {Γ : Types g}
                  (𝒟 : Γ  M  A true)
                  (  ) 𝒟  𝒟
id↑↓ (var i)   = refl
id↑↓ (lam 𝒟)   = lam & id↑↓ 𝒟
id↑↓ (app 𝒟 ) = app & id↑↓ 𝒟  id↑↓ 


--------------------------------------------------------------------------------