ZDIH6EDAYCMZIQHUEMQVWN4L3UBBY7SHARY6DYQMBZTSTDA4MHXAC type Ctx = [Value]
whnf :: Term -> Env -> Maybe Valwhnf (Var i) env = env !! iwhnf (Pi d r) env = dovd <- (whnf d env)Just $ VPi vd r envwhnf (Lam t) env = Just $ VLam t envwhnf (f :$ a) env = dovf <- whnf f envva <- whnf a envvf $$ vawhnf (Ann t _) env = whnf t envwhnf Star _ = Just VStar
evalInf :: Eval TermInfevalInf env ctx (Global n) = Map.lookup n envevalInf env ctx (Local idx) = ctx !! idxevalInf env ctx Star = Just VStarevalInf env ctx (Ann t _) = evalChk env ctx tevalInf env ctx (App f a) = doa <- evalInf env ctx acase evalChk env ctx f ofJust (VLam b) -> evalChk env (a : ctx) bJust (VPi _ b) -> evalChk env (a : ctx) b_ -> NothingevalInf env ctx (Pi dom t) = Just (VPi dom t)
wk :: Val -> Valwk (VLam t env) = VLam t (ewk env)wk (VPi d r env) = VPi (wk d) r (ewk env)wk VStar = VStarwk (Ne ne) = Ne $ nwk neewk :: Env -> Envewk = map wkcwk :: Ctx -> Ctxcwk = map wk
evalChk :: Eval TermChkevalChk env ctx (Inf term) = evalInf env ctx termevalChk env ctx (Lam body) = Just (VLam body)
nwk :: Ne -> Nenwk (NV i) = NV (i + 1)nwk (n :$$ v) = nwk n :$$ wk vfresh :: Valfresh = Ne (NV 0)eq :: Ctx -> Val -> Val -> Val -> Maybe ()eq _ VStar VStar VStar = return ()eq ctx VStar (VPi d1 r1 env1) (VPi d2 r2 env2) = doeq ctx VStar d1 d2whnfr1 <- (whnf r1 ((Ne (NV 0)) : ewk env1))whnfr2 <- (whnf r2 ((Ne (NV 0)) : ewk env2))eq (fresh : cwk ctx) VStar whnfr1 whnfr2eq ctx (VPi _ r env) f g = dovr <- whnf r ((Ne (NV 0)) : ewk env)vf <- wk f $$ (Ne (NV 0))vg <- wk g $$ (Ne (NV 0))eq (fresh : cwk ctx) vr vf vgeq ctx _ (Ne n1) (Ne n2) = neq ctx n1 n2 >> return ()eq _ _ _ _ = Nothingneq :: Ctx -> Ne -> Ne -> Maybe Valneq ctx (NV i) (NV j) = if i == j then ctx !! i else Nothingneq ctx (n1 :$$ v1) (n2 :$$ v2) = doVPi d r env <- neq ctx n1 n2eq ctx d v1 v2whnf r (v1 : env)neq _ _ _ = Nothing