Agda-2.3.2.2: src/core/Thierry/Check.hs
module Check where
import Val
import Conv
import Core.Abs
import Exp1
import Cont
-- checking the correctness of a type, and of an expression
check :: Cont -> Val -> Exp -> G ()
checkT :: Cont -> Exp -> G ()
checkT con ESet = return ()
checkT con (EFun x a b) =
do
checkT con a
v <- return (evalCon con a)
u <- genCon con x v
checkT (upCon x u v con) b
checkT con e = check con Set e
-- check a body of a definition
check con (Fun v f) (ELam x e) =
do
u <- genCon con x v
check (upCon x u v con) (f u) e
check con v (EIdent n) =
do
v' <- return (snd (getVT n con))
eqT (length con) v v'
check con v (EApp n es) =
do
v' <- checkI con (snd (getVT n con)) es
eqT (length con) v v'
check con v (Efun nes) =
mapM_ (checkP con v) nes
check _ _ e = fail ("check " ++ show e)
checkP con (Fun (App h ps) f) (Bcon i e) =
do
(v,w) <- return (getVT i con)
check con (itCurry (apps v ps) (inst w ps) f) e
checkP _ _ _ = fail "checkP"
-- check a vector of exps against an iterated function type
checkI con (Fun a f) (e:es) =
do
check con a e
checkI con (f (evalCon con e)) es
checkI _ v [] = return v
checkI _ _ _ = fail "checkI"