Major Section: SWITCHES-PARAMETERS-AND-MODES
This utility is intended for system hackers, not standard ACL2 users.
See finalize-event-user to see how to supply code to be run at the end of
events. We assume familiarity with finalize-event-user
; here we
focus on how to supply code for the beginning as well as the end of events.
As with finalize-event-user, you attach your own function of argument
list (ctx qbody state)
to initialize-event-user
.
(See finalize-event-user for discussion of ctx
and body
.) The
attachment should return state
and have a trivial guard,
requiring (implicitly) only that state
satisfies state-p
unless you
use trust tags to avoid that requirement. For example:
(defattach initialize-event-user initialize-event-user-test)
Why would you want to do this? Presumably you are building a system on top
of ACL2 and you want to track your own data. For example, suppose you want
to save the time in some state global variable, my-time
. You could
do the following.
(defun my-init (ctx body state) (declare (xargs :stobjs state :guard-hints (("Goal" :in-theory (enable read-run-time)))) (ignore ctx body)) (mv-let (seconds state) (read-run-time state) (f-put-global 'start-time seconds state))) (defun my-final (ctx body state) (declare (xargs :stobjs state :guard-hints (("Goal" :in-theory (enable read-run-time)))) (ignore ctx body)) (mv-let (seconds state) (read-run-time state) (prog2$ (if (boundp-global 'start-time state) (cw "Time: ~x0 seconds~%" (- seconds (fix (@ start-time)))) (cw "BIG SURPRISE!~%")) (f-put-global 'end-time seconds state)))) (defattach initialize-event-user my-init) (defattach finalize-event-user my-final)Here is an abbreviated log, showing the time being printed at the end.
ACL2 !>(thm (equal (append (append x y) x y x y x y x y) (append x y x y x y x y x y))) *1 (the initial Goal, a key checkpoint) is pushed for proof by induction. .... ACL2 Error in ( THM ...): See :DOC failure. ******** FAILED ******** Time: 869/100 seconds ACL2 !>