pi/src/Core/Normalize.idr

94 lines
2.3 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-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-05-13 19:46:05 +02:00
app : 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
app f@(VClos env (TTopInd c st)) x = logS ("-ind applied to " ++ show x)
2022-07-21 00:05:45 +02:00
>> pure (VApp f x)
app (VClos env (TNatInd _ z s)) (VNatTr n) = do
z' <- eval env z
s' <- eval env s
assert_total (nind z' s' n) -- :(
where
nind : Value -> Value -> Nat -> PI Value
nind z s 0 = pure z
nind z s (S n) = do
rec <- nind z s n
sn <- app s (VNatTr n)
app sn rec
2022-07-21 04:18:50 +02:00
app f@(VClos env (TNatInd _ z s)) x = logS ("-ind applied to " ++ show x)
>> pure (VApp f x)
app (VClos env (TSigInd _ _ c f)) (VPair a b) = do
f' <- eval env f
fa <- app f' a
app fa b
app f@(VClos env (TSigInd _ _ c p)) x = logS ("Σ-ind applied to " ++ show x)
>> pure (VApp f x)
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
eval : Ctx n -> Term n -> PI Value
2022-07-21 00:05:45 +02:00
eval env (TVar i) = pure (index i env)
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 TZero = pure (VNatTr 0)
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
eval env (TSuc n) = do
2022-07-21 00:05:45 +02:00
n' <- eval env n
case n' of
VNatTr n => pure (VNatTr (S n))
x => logS ("suc applied to " ++ show x)
>> pure (VClos env (TSuc n))
2022-07-21 04:18:50 +02:00
eval env (TPair a b) = do
a' <- eval env a
b' <- eval env b
pure (VPair a' b')
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-05-13 19:46:05 +02:00
whnf : Value -> PI Value
whnf (VClos env tr) = eval env tr
2022-05-13 19:46:05 +02:00
whnf (VApp f x) = do
f' <- whnf f
x' <- whnf x
app f' x'
2022-07-21 19:51:55 +02:00
whnf (VPair a b) = do
a' <- whnf a
b' <- whnf b
pure (VPair a' b')
2022-05-13 19:46:05 +02:00
whnf v = pure v