40 lines
806 B
Idris
40 lines
806 B
Idris
module Normalize
|
|
|
|
import Term
|
|
import Value
|
|
import Misc
|
|
|
|
import Control.Monad.RWS
|
|
import Control.Monad.Identity
|
|
import Control.Monad.Either
|
|
|
|
import Data.Nat
|
|
import Data.Vect
|
|
|
|
%default total
|
|
|
|
mutual
|
|
public export
|
|
app : Value -> Value -> PI Value
|
|
app (VClos env (TLam sc)) x = eval (x :: env) sc
|
|
app f x = pure (VApp f x)
|
|
|
|
public export
|
|
eval : Ctx n -> Term n -> PI Value
|
|
eval env (TVar i _) = pure (index (natToFinLT i) env)
|
|
eval env (TApp f x) = do
|
|
f' <- eval env f
|
|
x' <- eval env x
|
|
assert_total (app f' x') -- :(
|
|
eval env TType = pure VType
|
|
eval env tr = pure (VClos env tr)
|
|
|
|
public export
|
|
whnf : Value -> PI Value
|
|
whnf (VApp f x) = do
|
|
f' <- whnf f
|
|
x' <- whnf x
|
|
app f' x'
|
|
whnf (VClos env tr) = eval env tr
|
|
whnf v = pure v
|