(Released: 12 August 2025)
We are pleased to announce the Trindemossen-2 release of HOL4.
We now support (and recommend) a new header syntax for
Script.sml
files. Instead of the existing boilerplate
(open HolKernel … val _ = new_theory…
), users write
something like
Theory foo Ancestors real_topology … Libs realLib
to begin their files. This syntax and its options are documented in a
new chapter of the DESCRIPTION manual. Thanks to Mario Carneiro and
Daniel Nezamabadi for the work done implementing this, and then
converting all the script files in src
to use this
syntax.
The simplifier now supports NoAsms
and
IgnAsm
special forms that allow all assumptions (or those
matching the provided pattern, in the case of IgnAsm
) to be
excluded. See the DESCRIPTION and REFERENCE manuals for details. (GitHub
issue)
The automatic termination-finding technology behind
Definition
(and lower-level APIs) is now rather stronger,
especially when dealing with higher order recursions using list
operators. This should reduce the number of times you need to introduce
explicit Termination
-argument blocks to accompany your
definitions. Termination condition extraction and termination relation
guessing now have traces (“Definition.TC extraction” and
“Definition.termination candidates”) that can be examined for
illumination. See
src/tfl/examples/termination_proverScript.sml
for
examples.
All of HOL’s internal files are now stored in/under one
sub-directory of the source directory where user
*Script.sml
files are found. Previously, HOL used
.HOLMK
, .holobjs
, and .hollogs
.
Now everything is stored in/under the sub-directory
.hol
.
To get rid of old directories, which are now just going to be useless clutter, shell command-lines such as
find . -path '*/.hollogs/*' -delete
find . -name '.hollogs' -delete
might be used from the root of your HOL development. Alternatively,
use Holmake -r cleanAll
with your old HOL version, and then
switch.
Under Poly/ML, the hol
and hol.bare
executables can be passed the –-noconfig
command-line flag
to stop them consulting user config files in the user’s home directory
(these have names like hol-config.sml
). Under both Moscow
ML and Poly/ML, configuration files are also ignored if there is a
HOL_NOCONFIG
environment variable set.
oneline
from bossLib
now supports
one-line-ification of mutually recrusive functions. Each function
becomes an equation of its own in the theorem returned by
oneline
.
The Poly/ML implementation now offers a -z
(or
--zero
) command-line option to make the NUL byte be the
end-marker for strings being sent to the compiler. Otherwise, the
compiler makes a best effort guess about when it should interact based
on the presence of semi-colons.
EVERY_CASE_TAC
would loop if the “split-upon” subterm
was already an assumption, but no longer.number
, combinatorics
and
prime
: These theories combine material from
examples/algebra/lib
, etc. They contain some more advanced
results from number theory (in particular properties of prime numbers)
and combinatorics.
monoid
, group
, ring
and
real_algebra
: These theories combine material previously
held in examples/algebra
. A monoid is an algebraic
structure: with a carrier set, a binary operation and an identity
element. A group is an algebraic structure: a monoid with all its
elements invertible. A ring takes into account the interplay between its
additive group and multiplicative monoid.
Tactic.TRANS_TAC
(ported from HOL-Light) applies
transitivity theorem to goal with chosen intermediate term. See its DOC
for more details.
intLib.INTEGER_TAC
and
intLib.INTEGER_RULE
(ported from HOL-Light): simple
decision procedures for equations of multivariate polynomials of
integers, and simple equations about divisibility of integers.
last_assume_tac
has been added. It is the same as
assume_tac
except it adds the new assumption to the top of
the list of assumptions instead of the bottom.
examples/algorithms/dijkstraScript.sml
numLib.prefer_num
has been renamed to
numLib.temp_prefer_num
, which name better describes its
semantics. The prefer_num
entry-point is now used to make a
change “permanent” (again following the naming convention used by many
parsing-related entry-points), which is to say that the overloads made
by this function will be exported to child theories.
The cv translator’s entry points with _pre
now take
a new string argument, e.g., what used to be
cv_trans_pre foo_def
is now
cv_trans_pre "foo_pre" foo_def
. Mutually recursive
functions require a name for each functions. In the string argument,
multiple names are given either with spaces separating them, e.g.,
"foo_pre foo_list_pre"
, or commas separating them, e.g.,
"foo_pre,foo_list_pre"
or
"foo_pre, foo_list_pre"
. The old behaviour (inventing
names) is supported by passing the empty string ""
as the
name, i.e., cv_trans_pre "" foo_def
.
Editor mode implementations have moved in the HOL sources to
tools/editor-modes/{editor-name}
. This may affect editor
initialisations/configurations, particularly if they hard-code a
reference to a particular path. For example, in the recommended setup
for emacs
, users will need to change
(load "<path>/HOL/tools/hol-mode")
(load "<path>/HOL/tools/hol-unicode")
to
(load "<path>/HOL/tools/editor-modes/emacs/hol-mode")
(load "<path>/HOL/tools/editor-modes/emacs/hol-unicode")
The types of DB.find
and DB.match
have
changed so that instead of returning
(string * string) * (thm * class)
they now return
(string * string) * (thm * class * thm_src_location)
Using the #1 o #2
selector should be future-proof
here.
util_probTheory
has been merged into
sigma_algebraTheory
.
In set_relationTheory
, the constant tc
has been renamed to transitive_closure
.
Various adjoin_to…
entry-points in
Theory
have been removed. The biggest incompatibility this
causes is the removal of the <thy>_grammars
binding
from all <thy>Theory
structures. To access the
grammars specific to a particular theory (foo
, say), one
must now write
valOf $ Parse.grammarDB {thyname="foo"}
where the call may fail if the theory is not present in the hierarchy.
ASSUME_NAMED_TAC
now puts the new named assumption
at the top of the assumption list, but below the other named
assumptions. Previously, named assumptions were added to the bottom of
the assumption list (where they might get in the way).
Selecting numbered options in the Moscow ML HOL help system now requires the number choice to be followed by semicolon-newline instead of just a newline character.