ACL2 Version 8.7 (xxx, 20xx) Notes
NOTE! New users can ignore these release notes, because the documentation has been updated to reflect all changes that are recorded here.
Below we roughly organize the changes to ACL2 since Version 8.6 into the following categories of changes: existing features, new features, heuristic and efficiency improvements, bug fixes, changes at the system level, Emacs support, and experimental versions. Each change is described in just one category, though of course many changes could be placed in more than one category.
Note that only ACL2 system changes are listed below. See also note-8-7-books for a summary of changes made to the ACL2 Community Books since ACL2 8.6, including the build system.
The output generated by the induction routine has been slightly changed.
Now, if term
When the summary prints “Modified system attachments”, it now sorts that information before printing it.
Improved the error message when the package name is missing immediately after `#!', as in #!(foo).
The new function symbol
A new feature provides ways to stop certain infinite loops in the waterfall. It is now possible to specify a limit on how many times the waterfall can produce a new subgoal along a branch. It is also possible to specify that the prover should check for ``simple'' loops in the waterfall. The default setting for this new feature limits the branch length to 1000 and enables checking for duplicate goals. See set-subgoal-loop-limits for details. Thanks to Eric Smith for suggesting that we consider supporting loop detection at the goal level.
A new feature provides help in debugging failed proofs involving functional instantiation. In particular, it helps you answer the question ``where did this subgoal come from?'' when looking at a subgoal produced by functionally instantiating a constraint. See set-constraint-tracking.
Applications that use functions with floating-point inputs or outputs (see df) may generate less memory usage, at least in SBCL releases strictly after SBCL Version 2.9 and SBCL github versions after mid-October, 2024. Thanks to Stas Boukarev for enhancing SBCL to support this improvement (made by adding suitable proclaiming in ACL2).
Avoided a potential quadratic blowup in guard generation by
improving how guard obligations are simplified. Specifically, improved the
simplification of ground subterms so that
(defun foo (x y) (declare (xargs :guard t)) (let ((x (+ 1 x))) (case x (1 (natp x)) (2 (consp x)) (3 (rationalp x)) (otherwise (+ x y)))))
Sped up include-book by significantly reducing time in translating
calls of with-output and some other macros (for some technical details
see ACL2 source function
When a function, constant, or macro was defined within an encapsulate form, its definition was evaluated in Lisp with each pass of
evaluating the
Fixed a soundness bug in the proof-builder that could cause goals from forced hypotheses to be created incorrectly. (This bug has been around for at least 10 years and probably for 30 years!)
Fixed a soundness bug based on the use of swap-stobjs on two stobjs of which one is “live”. See live-stobj-in-proof. Thanks to Sol Swords for reporting this bug, including an example and analysis of possible fixes in his report.
Fixed a soundness bug due to the interaction of stobjs and defattach. The fundamental problem was that
A Lisp error is now avoided when saving event-data (see saving-event-data and submitting certain ill-formed attempts at events. Thanks to Eric Smith for sending the following example.
(assign event-data-fal 'event-data-fal) (defuns foo (x) x)
Fixed a bug in the interaction of memoize-partial with utilities
save-and-clear-memoization-settings and restore-memoization-settings. The latter utilities no longer have an effect
on functions created by memoize-partial (or, and this is quite
obscure, on memoization from calls of memoize with a non-
An attachable stobj (see attach-stobj) was created by the
executable (
Fixed a bug in trans* when its use encounters a call of make-event with the
According to the documentation for table, the variable
(SBCL only) Fixed a bug, for ACL2 hosted on SBCL, that was preventing
inlining of functions whose name ends in
A defabsstobj event contains function specs that are each
either a symbol or a list of the form
ACL2 rejected some valid
(defstobj st (a :type (complex rational) :initially #c(0 1))) (defstobj st (a :type (string 1) :initially "a"))The following additional example from Issue 1852 is still rejected, because evenp has a non-trivial guard; its argument must be an integer.
(defstobj st (a :type (satisfies evenp) :initially 0))However, the following variant produces a term,
(defstobj st (a :type (and integer (satisfies evenp)) :initially 0))
Fixed a bug that was causing errors for stobjs introduced with
defstobj keyword argument
Fixed a bug in
Fixed a proof-builder bug that could occasionally cause two goals to exist with the same name.
The
Some ill-formed hard errors, for example from calls of
Modifications have been made that allow ACL2 to be hosted on GCL Version
2.7.0 and presumably later gcl versions; previously only GCL versions
before 2.7.0 could host ACL2. Essentially the only user-visible change (other
than error prevention) is the introduction of list$, a macro
equivalent to list that can be used without a GCL 2.7.0 restriction on
the number of arguments. The most sweeping implementation-level change is the
replacement of an array in support of so-called static honses, the
sbits array, by a structure that avoids a reduced bound on array
dimensions imposed by GCL 2.7.0. Details may be found in a Lisp comment in
the form
The ACL2-only manual is no longer advertised on the ACL2 home page. The
ACL2+Books manual is favored both because it does not have the broken links
found in the ACL2-only manual and because the ACL2+Books manual is helpful for
informing new users about the libraries provided by the community-books. Thanks to Eric Smith for encouraging this change. Note
that the ACL2-only manual may continue to be built in directory
For the built-in
Replaced information about mailing lists in the installation instructions using a link to a corresponding, new documentation topic, mailing-lists. So now, the community can make suitable updates to that page. Thanks to Eric Smith for suggesting this change.
The installation instructions have been moved into the manual; see installation. Thanks to Eric Smith for suggesting this change, which will allow the ACL2 community (specifically, the acl2-books community) to improve those instructions.
By default, the directory where an ACL2 executable is to be built must not
have a pathname that contains spaces, as before. However, now there is a
variable,
References to the old “bleeding edge” manual (https://www.cs.utexas.edu/users/moore/acl2/manuals/latest/') have been replaced by references to the new one (https://acl2.org/doc/).
The documentation for do-loop$ has been extended to illustrate how
to signal a soft error from within the body of a