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)
|
2022-07-25 00:35:20 +02:00
|
|
|
|
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
|
|
|
|
|
|
2022-07-25 00:35:20 +02:00
|
|
|
|
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
|
2022-07-25 00:35:20 +02:00
|
|
|
|
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
|