pi/src/Core/Normalize.idr

78 lines
2.0 KiB
Idris
Raw Normal View History

2022-07-23 03:38:15 +02:00
module Core.Normalize
2022-04-23 15:18:06 +02:00
2022-07-23 03:38:15 +02:00
import Core.Term
import Core.Value
import Core.Misc
2022-04-23 16:38:53 +02:00
2022-05-13 19:46:05 +02:00
import Control.Monad.RWS
import Control.Monad.Identity
import Control.Monad.Either
2022-04-23 16:38:53 +02:00
import Data.Nat
2022-05-13 19:46:05 +02:00
import Data.Vect
2022-07-26 23:07:13 +02:00
import Data.IOArray
import Data.IORef
2022-04-23 16:38:53 +02:00
2022-04-23 15:18:06 +02:00
%default total
2022-04-23 16:38:53 +02:00
2022-04-24 14:30:21 +02:00
mutual
public export
2022-08-06 02:32:09 +02:00
app : {auto deftrs : RefA DTR Value}
-> {auto frst : Ref NST Nat}
-> Value -> Value -> PI Value
2022-07-21 04:18:50 +02:00
app (VClos env (TLam sc)) x = eval (x :: env) sc
2022-07-21 00:05:45 +02:00
2022-07-21 04:18:50 +02:00
app (VClos env (TTopInd c st)) VTop = eval env st
2022-07-21 00:05:45 +02:00
app (VClos env1 (TNatInd _ z s)) (VClos env2 TZero) = eval env1 z
app f@(VClos env1 (TNatInd _ z s)) (VClos env2 (TSuc n)) = assert_total $ do
s' <- eval env1 s
sn <- app (VClos env1 s) (VClos env2 n)
app sn =<< app f (VClos env2 n)
2022-07-21 00:05:45 +02:00
app (VClos env1 (TSigInd _ _ c f)) (VClos env2 (TPair a b)) = assert_total $ do
f' <- eval env1 f
fa <- app f' (VClos env2 a)
app fa (VClos env2 b)
2022-07-21 04:18:50 +02:00
app (VClos env (TJ _ _ _ _ d)) (VClos _ (TRefl _ _)) = eval env d
2022-07-21 00:05:45 +02:00
app f x = pure (VApp f x)
2022-04-24 14:30:21 +02:00
2022-05-13 19:46:05 +02:00
public export
2022-07-26 23:07:13 +02:00
eval : {auto deftrs : RefA DTR Value}
2022-08-06 02:32:09 +02:00
-> {auto frst : Ref NST Nat}
-> Ctx n -> Term n -> PI Value
2022-07-26 23:07:13 +02:00
eval env (TVar i) = pure (index i env)
eval env (TDef i) = do
res <- getArr DTR i
case res of
Just x => pure x
Nothing => oops "TDef term lookup"
2022-07-21 04:18:50 +02:00
eval env TType = pure VType
eval env TTop = pure VTop
eval env TStar = pure VStar
eval env TBot = pure VBot
eval env TNat = pure VNat
eval env (TApp f x) = do
f' <- eval env f
x' <- eval env x
assert_total (app f' x') -- :(
2022-07-21 04:18:50 +02:00
2022-07-21 19:51:55 +02:00
eval env (TLet ty tr tri) = do
tr' <- eval env tr
eval (tr' :: env) tri
eval env tr = pure (VClos env tr)
2022-04-24 14:30:21 +02:00
public export
2022-07-26 23:07:13 +02:00
whnf : {auto deftrs : RefA DTR Value}
2022-08-06 02:32:09 +02:00
-> {auto frst : Ref NST Nat}
-> Value -> PI Value
whnf (VClos env tr) = eval env tr
whnf (VApp f x) = do
f' <- whnf f
x' <- whnf x
app f' x'
whnf v = pure v