Verify guards efficiently by using a previous guard theorem.
(prove-guard f1 (disable h))
Example of typical usage:
(defun f2 (x)
(prove-guard fn thy)
(prove-guard fn thy alt-thy)
(prove-guard fn thy alt-thy verbose)
where fn is a known function symbol and thy and alt-thy,
when supplied and non-nil, are theory expressions.
This proof-builder macro attempts to prove a theorem, typically a
guard proof obligation, by applying the hint :guard-theorem fn in
a carefully controlled, efficient manner (using the :fancy-use proof-builder macro). This proof is attempted in the theory, thy, if
supplied and non-nil, else in the current-theory. If that proof
fails, then a single, ordinary prover call is made with that :use hint
and in the following theory: alt-thy if supplied and non-nil, else
thy if supplied and non-nil, else the current-theory. If the
proof has not yet succeeded and the original theory is not nil or
(current-theory :here), then a final proof is attempted in the same
careful manner as the first proof attempt.
Output is inhibited by default. However, if verbose is t then
output is as specified by the enclosing environment; and if verbose is
any other non-nil value, then output is mostly inhibited for that attempt
by use of the proof-builder command, :quiet. In all of those
non-nil cases for the verbose input, a little message will be
started at the beginning of the second and third proof attempts, if any.
For a few small examples, see community book
For a way to use lemma instances other than guard theorems, see ACL2-pc::fancy-use.
Hacker tip: Invoke (trace$ acl2::pc-fancy-use-fn) to see the
proof-builder instruction created when invoking prove-guard.