module CC.Term.Eval import CC.Name import CC.Term import CC.Thinning import Data.SnocList.Elem -- Evaluation ------------------------------------------------------------------ export app : (n : Name) -> Env local global -> Term (local :< n) -> Lazy (Value global) -> Value global export eval : Env local global -> Term local -> Value global app n env t v = eval (env :< (n, v)) t eval env (Var k n prf) = index env k prf eval env (Let n ty val t) = eval (env :< (n, eval env val)) t eval env Set = VSet eval env (Pi Nothing t u) = VFunc env t u eval env (Pi (Just n) t u) = VPi n (eval env t) env u eval env (Abs n t) = VAbs env n t eval env (App t u) = case eval env t of Ntrl n => Ntrl $ VApp n (eval env u) VAbs env' n t => assert_total $ app n env' t (eval env u) _ => assert_total $ idris_crash "eval invariant broken" -- Quoting --------------------------------------------------------------------- export quote : {ctx : _} -> Value ctx -> Term ctx quoteNtrl : {ctx : _} -> Neutral ctx -> Term ctx quote (Ntrl n) = quoteNtrl n quote VSet = Set quote (VPi n t env u) = Pi (Just n) (quote t) (assert_total $ quote $ eval (liftEnv [ Env local global -> Term local -> Term global normalise env t = quote $ eval env t -- Conversion ------------------------------------------------------------------ export convert : {ctx : Context} -> Value ctx -> Value ctx -> Bool convertNtrl : {ctx : Context} -> Neutral ctx -> Neutral ctx -> Bool convert VSet VSet = True convert (VFunc env t u) (VFunc env' t' u') = assert_total $ convert (eval env t) (eval env' t') && convert (eval env u) (eval env' u') convert (VFunc env t u) (VPi m t' env' u') = assert_total $ convert (eval env t) t' && convert (eval (wknEnv env (drop id)) u) (eval (liftEnv [