pi/src/Normalize.idr

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