module Eval where

open import Prelude
open import Term

private
  variable
    a b : Ty
    Γ : Context

module Den (ξ : BaseTy  Set) where

  Value : Ty  Set
  Value (` α)   = ξ α
  Value (a  b) = Value a  Value b

  data Env : Context  Set where
    []  : Env []
    _∷_ : (v : Value a) (ρ : Env Γ)  Env (a  Γ)

  lookup : Env Γ  a  Γ  Value a
  lookup (v  ρ) zero = v
  lookup (v  ρ) (suc x) = lookup ρ x

  eval : Env Γ  Term Γ a  Value a
  eval ρ (var x)   = lookup ρ x
  eval ρ (abs t)   = λ v  eval (v  ρ) t
  eval ρ (app t u) = eval ρ t (eval ρ u)