@@ -101,6 +101,7 @@ simplify :: Context -> Env -> TT Name -> TT Name
101simplify ctxt env t
101simplify ctxt env t
102 = evalState (do val <- eval False ctxt [(sUN "lazy", 0),
102 = evalState (do val <- eval False ctxt [(sUN "lazy", 0),
103 (sUN "assert_smaller", 0),
103 (sUN "assert_smaller", 0),
104+ (sUN "assert_total", 0),
104 (sUN "par", 0),
105 (sUN "par", 0),
105 (sUN "prim__syntactic_eq", 0),
106 (sUN "prim__syntactic_eq", 0),
106 (sUN "fork", 0)]
107 (sUN "fork", 0)]
@@ -112,7 +113,6 @@ simplify ctxt env t
112rt_simplify :: Context -> Env -> TT Name -> TT Name
113rt_simplify :: Context -> Env -> TT Name -> TT Name
113rt_simplify ctxt env t
114rt_simplify ctxt env t
114 = evalState (do val <- eval False ctxt [(sUN "lazy", 0),
115 = evalState (do val <- eval False ctxt [(sUN "lazy", 0),
115− (sUN "assert_smaller", 0),
116 (sUN "par", 0),
116 (sUN "par", 0),
117 (sUN "prim__syntactic_eq", 0),
117 (sUN "prim__syntactic_eq", 0),
118 (sUN "prim_fork", 0)]
118 (sUN "prim_fork", 0)]
@@ -206,6 +206,8 @@ eval traceon ctxt ntimes genv tm opts = ev ntimes [] True [] tm where
206 if u then
206 if u then
207 do let val = lookupDefAcc n (spec || atRepl) ctxt
207 do let val = lookupDefAcc n (spec || atRepl) ctxt
208 case val of
208 case val of
209+ [(Function _ tm, _)] | sUN "assert_total" `elem` stk ->
210+ ev ntimes (n:stk) True env tm
209 [(Function _ tm, Public)] ->
211 [(Function _ tm, Public)] ->
210 ev ntimes (n:stk) True env tm
212 ev ntimes (n:stk) True env tm
211 [(Function _ tm, Hidden)] ->
213 [(Function _ tm, Hidden)] ->
@@ -213,7 +215,7 @@ eval traceon ctxt ntimes genv tm opts = ev ntimes [] True [] tm where
213 [(TyDecl nt ty, _)] -> do vty <- ev ntimes stk True env ty
215 [(TyDecl nt ty, _)] -> do vty <- ev ntimes stk True env ty
214 return $ VP nt n vty
216 return $ VP nt n vty
215 [(CaseOp ci _ _ _ _ cd, acc)]
217 [(CaseOp ci _ _ _ _ cd, acc)]
216− | (acc /= Frozen) &&
218+ | (acc /= Frozen || sUN "assert_total" `elem` stk) &&
217 null (fst (cases_totcheck cd)) -> -- unoptimised version
219 null (fst (cases_totcheck cd)) -> -- unoptimised version
218 let (ns, tree) = getCases cd in
220 let (ns, tree) = getCases cd in
219 if blockSimplify ci n stk
221 if blockSimplify ci n stk
@@ -260,6 +262,9 @@ eval traceon ctxt ntimes genv tm opts = ev ntimes [] True [] tm where
260-- stk top env (finalise tm)) t
262-- stk top env (finalise tm)) t
261-- | otherwise
263-- | otherwise
262 = fmapMB (\tm -> ev ntimes stk top env (finalise tm)) t
264 = fmapMB (\tm -> ev ntimes stk top env (finalise tm)) t
265+ ev ntimes stk top env (App (App (P _ (UN at) _) _) arg)
266+ | at == txt "assert_total" && not simpl
267+ = ev ntimes (UN at : stk) top env arg
263 ev ntimes stk top env (App f a)
268 ev ntimes stk top env (App f a)
264 = do f' <- ev ntimes stk False env f
269 = do f' <- ev ntimes stk False env f
265 a' <- ev ntimes stk False env a
270 a' <- ev ntimes stk False env a
@@ -313,7 +318,8 @@ eval traceon ctxt ntimes genv tm opts = ev ntimes [] True [] tm where
313 do let val = lookupDefAcc n (spec || atRepl) ctxt
318 do let val = lookupDefAcc n (spec || atRepl) ctxt
314 case val of
319 case val of
315 [(CaseOp ci _ _ _ _ cd, acc)]
320 [(CaseOp ci _ _ _ _ cd, acc)]
321+ | acc /= Frozen || sUN "assert_total" `elem` stk ->
316− | acc /= Frozen -> -- unoptimised version
322+ -- unoptimised version
317 let (ns, tree) = getCases cd in
323 let (ns, tree) = getCases cd in
318 if blockSimplify ci n stk
324 if blockSimplify ci n stk
319 then return $ unload env (VP Ref n ty) args
325 then return $ unload env (VP Ref n ty) args