@@ -101,6 +101,7 @@ simplify :: Context -> Env -> TT Name -> TT Name
101101simplify ctxt env t
102102 = evalState (do val <- eval False ctxt [(sUN "lazy", 0),
103103 (sUN "assert_smaller", 0),
104+ (sUN "assert_total", 0),
104105 (sUN "par", 0),
105106 (sUN "prim__syntactic_eq", 0),
106107 (sUN "fork", 0)]
@@ -112,7 +113,6 @@ simplify ctxt env t
112113rt_simplify :: Context -> Env -> TT Name -> TT Name
113114rt_simplify ctxt env t
114115 = evalState (do val <- eval False ctxt [(sUN "lazy", 0),
115− (sUN "assert_smaller", 0),
116116 (sUN "par", 0),
117117 (sUN "prim__syntactic_eq", 0),
118118 (sUN "prim_fork", 0)]
@@ -206,6 +206,8 @@ eval traceon ctxt ntimes genv tm opts = ev ntimes [] True [] tm where
206206 if u then
207207 do let val = lookupDefAcc n (spec || atRepl) ctxt
208208 case val of
209+ [(Function _ tm, _)] | sUN "assert_total" `elem` stk ->
210+ ev ntimes (n:stk) True env tm
209211 [(Function _ tm, Public)] ->
210212 ev ntimes (n:stk) True env tm
211213 [(Function _ tm, Hidden)] ->
@@ -213,7 +215,7 @@ eval traceon ctxt ntimes genv tm opts = ev ntimes [] True [] tm where
213215 [(TyDecl nt ty, _)] -> do vty <- ev ntimes stk True env ty
214216 return $ VP nt n vty
215217 [(CaseOp ci _ _ _ _ cd, acc)]
216− | (acc /= Frozen) &&
218+ | (acc /= Frozen || sUN "assert_total" `elem` stk) &&
217219 null (fst (cases_totcheck cd)) -> -- unoptimised version
218220 let (ns, tree) = getCases cd in
219221 if blockSimplify ci n stk
@@ -260,6 +262,9 @@ eval traceon ctxt ntimes genv tm opts = ev ntimes [] True [] tm where
260262-- stk top env (finalise tm)) t
261263-- | otherwise
262264 = 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
263268 ev ntimes stk top env (App f a)
264269 = do f' <- ev ntimes stk False env f
265270 a' <- ev ntimes stk False env a
@@ -313,7 +318,8 @@ eval traceon ctxt ntimes genv tm opts = ev ntimes [] True [] tm where
313318 do let val = lookupDefAcc n (spec || atRepl) ctxt
314319 case val of
315320 [(CaseOp ci _ _ _ _ cd, acc)]
316− | acc /= Frozen -> -- unoptimised version
321+ | acc /= Frozen || sUN "assert_total" `elem` stk ->
322+ -- unoptimised version
317323 let (ns, tree) = getCases cd in
318324 if blockSimplify ci n stk
319325 then return $ unload env (VP Ref n ty) args