Release 3 had the notion of multiple language modes:
sicstus. Release 4 does not have this notion. The syntax and
semantics of the Prolog language correspond to the previous
iso language mode.
The exact rules for translating DCG rules to plain Prolog clauses have not been laid down in a standard, but there is a broad consensus in the Prolog community about what they should mean. One of the guiding principles is that the translation should be steadfast, in particular that the translated code should always treat its last argument as an output argument and not use it “too early”. In some cases, a non-steadfast translation was produced in release 3. This has been corrected in release 4.
In release 3, terms containing attributed variables and blocked goals
could be asserted, copied, and gathered as solutions to
findall/3 and similar predicates. The copy would contain new
attributed variables with the attributes copied.
This operation could be very expensive, could yield unexpected results
and was not always safe e.g. in the context of CLPFD constraints.
In release 4, the semantics of this operation has changed: in the
copy, an attributed variable is simply replaced by a plain, brand new
variable. Of course, if the same attributed variable occurs more than
once, the same plain variable will occur in the corresponding places
in the copy. If the attributes are relevant, the program can obtain
them by using the new built-in predicate
copy_term/3 described below.
The infix operator `#' (bitwise exclusive or) has been renamed to `\'.
Atoms can now contain the
NUL character, i.e. character code
zero. It is classified as white space and must therefore be entered
using escapes. As an example
'a\0\a' is a three character atom
as separated by a
Internally, atom names and other encoded strings, use the non-shortest
form `0xC0 0x80' to encode
NUL. This is similar to how
is handled by Tcl/Tk and Java.
wcx Prolog flag have been dropped.
The following Prolog flag is new:
wcx property has been dropped.
The following properties are new:
wcx/1option of release 3.
The following keywords are new:
The set of built-in predicates has changed slightly. The following predicates have been removed:
put/[1,2]. We have provided
skip_byte/[1,2]as an ISO style replacement for
userargument. In most cases, the “respective predicate” is one of the non-ISO style predicate mentioned above, so there was no point in keeping the shorthand.
set_prolog_flag/2with specific arguments, and so can be trivially replaced.
call_residue_vars/2, which should suffice in most cases where
call_residue/2was used; see below.
prolog:undo/1. The argument should have a module prefix.
:- use_module/2directives, and so the shorthand was dropped.
The following predicates have been added:
call/1. For example,
call(p(1,2), a, b)is equivalent to
call(p(1,2, a, b)).
Executes the procedure call Goal, unifying Vars with
the list of residual variables that have blocked goals or attributes
attached to them.
copy_term(+Term, -Copy, -Body)
Makes a copy of Term
in which all variables have been replaced by new variables
that occur nowhere outside the newly created term.
If Term contains attributed variables,
Body is unified with a term such that executing Body
will reinstate equivalent attributes on the variables in Copy.
Otherwise, Body is unified with
Some predicates have been changed slightly; in most cases, this affects predicates that take a list of options.
is_mutable/1has been renamed to
mutable/1, in analogy with
module/1has been renamed to
set_module/1, to avoid possible confusion with the
format/[2,3], the semantics of the `~@' spec has changed slightly: the goal Arg is called as if by
\+ \+Arg, i.e. any bindings made by the goal are lost.
wcx/1option has been dropped. Takes new options:
ignore_underscores/1option has been dropped. The
qlhas been dropped. The
searchare new. The
glob/1option is new, allowing to match file names against a pattern.
qlhas been dropped.
encoding/1, subsuming the
wcx/1option of release 3, and
eol/1, are new options, corresponding to the respective stream properties.
quoted_charset/1option is new, reflecting the value of the Prolog flag with the same name.
halt/1now raises an internal exception like
halt/0. This gives surrounding Prolog and C code an opportunity to perform cleanup.
[calls,choice_points,instructions]. The Resolution argument now takes one of the values:
user:term_expansion/[2,4] is replaced by the hook:
user:term_expansion(Term1, Layout1, Tokens, Term2, Layout2, [Token|Tokens]).
The purpose of the new argument Tokens is to support multiple, independent expansion rules. The purpose of the arguments Layout1 and Layout2 is to support source-linked debugging of term-expanded code. Each expansion rule should have its unique identifying token Token.
user:goal_expansion/3 is replaced by the following per-module hook:
M:goal_expansion(Term1, Layout1, Module, Term2, Layout2).
Typically, Module has imported the predicate Term1 from module M. The purpose of the arguments Layout1 and Layout2 is to support source-linked debugging of goal-expanded code.