Reporting of rules whose application may have caused case splits
When the ACL2 rewriter applies a rule to a term, a goal might
simplify to more than one subgoal. A rule with such an application is called
a ``splitter''. Here, we explain the output produced for splitters when proof
output is enabled (see set-inhibit-output-lst) and such reporting is
turned on (as it is by default) — that is, when the value of
See set-splitter-output for how to turn off, or on, the reporting of splitters. Also see set-case-split-limitations for information on how to control case splits. Note that since splitters are rule applications, splitter output is not generated for case splits that are caused by other than rules, such as the mere presence of calls of the function symbol, if, in the goal.
We begin by describing three types of splitters.
if-intro : The rule application may have introduced a call ofIF , in the sense discussed at the end below.
case-split : For the application of a rule with hypothesis of the form(case-split <hyp>) ,<hyp> did not simplify to true or false.
immed-forced : For the application of a rule with hypothesis of the form(force <hyp>) ,<hyp> did not simplify to true or false, where immediate-force-modep is enabled (see immediate-force-modep).
These three annotations —
There are three kinds of output affected by splitters, illustrated in turn below using examples.
(a) During the proof, gag-mode and raw proof format (see set-raw-proof-format) off
(b) During the proof, gag-mode or raw proof format on
(c) Summary
Of course, (a) and (b) are skipped if proof output is inhibited, and (c) is skipped if summary output is inhibited; see set-inhibit-output-lst.
(a) During the proof, gag-mode and raw proof format (see set-raw-proof-format) off
With gag-mode off (or when using
This simplifies, using the :definitions F (if-intro), G (case-split and if-intro) and H and the :rewrite rules R1, R2 (case-split), and R3 (immed-forced), to the following two conjectures.
Note that any such printing of ``
(b) During the proof, gag-mode or raw proof format on
With gag-mode or raw proof format (see set-raw-proof-format) on, the proof output is abbreviated. However, in these cases ``Splitter Notes'' are printed so that one can still get important information to help control large case splits (by disabling splitter rules as appropriate). These are printed at the point when a goal splits into subgoals. Here, for example, is the Splitter Note that corresponds to the output shown in (a) above. It shows the goal whose simplification has produced a split into more than one subgoal, and it shows how many subgoals have been created.
Splitter note (see :DOC splitter) for Subgoal *1/2.2.1' (2 subgoals). case-split: ((:DEFINITION G) (:REWRITE R2)) immed-forced: ((:REWRITE R3)) if-intro: ((:DEFINITION G) (:DEFINITION F))
No such splitter notes are printed for the use of force (when immediate-force-modep is off).
(c) Summary
Here is a possible summary corresponding to our running example. In the summary, ``Splitter rules'' is omitted if there are no splitter rules, and a splitter type is only mentioned if there is at least one corresponding splitter rule.
Summary Form: ( THM ...) Rules: ((:DEFINITION F) (:DEFINITION G) (:DEFINITION H) (:REWRITE R1) (:REWRITE R2) (:REWRITE R3)) Splitter rules (see :DOC splitter): case-split: ((:DEFINITION G) (:REWRITE R2)) immed-forced: ((:REWRITE R3)) if-intro: ((:DEFINITION G) (:DEFINITION F)) Time: 0.01 seconds (prove: 0.00, print: 0.00, other: 0.00) Prover steps counted: 145
No indication for ``
We conclude by giving the criteria for a rewrite or definition rule application to be a splitter of type
Any rule application meeting the above criteria will be considered a
splitter of type
Finally, note that you may see splits not attributed to splitters. We
believe that this will be uncommon during simplification, though it can occur
for example when a call of