The predicates current_prolog_flag/2 and set_prolog_flag/2 allow the user to examine and modify the execution environment. It provides access to whether optional features are available on this version, operating system, foreign-code environment, command-line arguments, version, as well as runtime flags to control the runtime behaviour of certain predicates to achieve compatibility with other Prolog environments.
bool
can have the values true
and
false
. Some Prolog flags are not defined in all versions,
which is normally indicated in the documentation below as ``if
present and true''. A boolean Prolog flag is true iff the Prolog
flag is present and the Value is the atom true
.
Tests for such flags should be written as below.
( current_prolog_flag(windows, true) -> <Do MS-Windows things> ; <Do normal things> )
Some Prolog flags are scoped to a source file. This implies that if they are set using a directive inside a file, the flag value encountered when loading of the file started is restored when loading of the file is completed. Currently, the following flags are scoped to the source file: generate_debug_info and optimise.
A new thread (see section 8) copies all flags from the thread that created the new thread (its parent).12This is implemented using the copy-on-write tecnhnique. As a consequence, modifying a flag inside a thread does not affect other threads.
user
, default) or a
`system' view. In system view all system code is fully accessible as if
it was normal user code. In user view, certain operations are not
permitted and some details are kept invisible. We leave the exact
consequences undefined, but for example system code can be traced using
system access and system predicates can be redefined.Functor(arg)
is read as if it
was written 'Functor'(arg)
. Some applications use the
Prolog read/1
predicate for reading an application defined script language. In these
cases, it is often difficult to explain to non-Prolog users of the
application that constants and functions can only start with a lowercase
letter. Variables can be turned into atoms starting with an uppercase
atom by calling read_term/2
using the option variable_names
and binding the variables
to their name. Using this feature, F(x) can be turned into valid syntax
for such script languages. Suggested by Robert van Engelen. SWI-Prolog
specific.pl
(default) or pro
(can be selected in the installer))
associated with swipl-win.exe.true
(default) autoloading of library functions is
enabled.true
(default false
), read translates text
between backquotes into a string object (see section
4.23). This flag is mainly for compatibility with LPA Prolog.true
, integer representation is bound
by
min_integer and max_integer.
If false
integers can be arbitrarily large and the min_integer
and
max_integer are
not present. See section 4.26.2.1.-lswipl
if the SWI-Prolog kernel is a shared (DLL). If the
SWI-Prolog kernel is in a static library, this flag also contains the
dependencies.-lswipl
on COFF based
systems. See section 9.5.true
(default), read/1
interprets \
escape sequences in quoted atoms and strings.
May be changed. This flag is local to the module in which it is changed.^
' (see meta_predicate/1).
Supported values are:
true
in swipl-win.exe to indicate the console
supports menus. See also section
4.33.2.library(thread)
. This flag is not available on systems were
we do not know how to get the number of CPUs.true
if this instance of Prolog supports DDE as
described in section 4.41.Disabling these optimisations can cause the system to run out of memory on programs that behave correctly if debug mode is off.
true
, show the context module while printing a
stack-frame in the tracer. Normally controlled using the `C' option of
the tracer.swi
. The code below is a reliable and portable way
to detect SWI-Prolog.
is_dialect(swi) :- catch(current_prolog_flag(dialect, swi), _, fail).
codes
(default), a list of character-codes is returned, if
chars
a list of one-character atoms, if atom
double quotes are the same as single-quotes and finally, string
reads the text into a Prolog string (see section
4.23). See also
atom_chars/2
and atom_codes/2.EMACS
is t
and INFERIOR
is yes
.text
mode. The
initial value is deduced from the environment. See section
2.18.1 for details.true
(default false
), expand $varname
and ~
in arguments of built-in predicates that
accept a file name (open/3, exists_file/1, access_file/2,
etc.). The predicate
expand_file_name/2
can be used to expand environment variables and wildcard patterns. This
Prolog flag is intended for backward compatibility with older versions
of SWI-Prolog.true
(default) generate code that can be debugged using
trace/0, spy/1,
etc. Can be set to false
using the
-nodebug. This flag is scoped within a source file.
Many of the libraries have
:- set_prolog_flag(generate_debug_info, false)
to hide
their details from a normal trace.13In
the current implementation this only causes a flag to be set on the
predicate that causes children to be hidden from the debugger. The name
anticipates on further changes to the compiler.true
if XPCE is around and can be used for graphics.<home>/boot32.prc
(32-bit machines) or
<home>/boot64.prc
(64-bit machines) and to
find its library as
<home>/library
.//
and rem
arithmetic functions. Value depends on the C-compiler used./
/2
(float division) always
return a float, even if applied to integers that can be divided.
f(,,a)
now write f(',',a)
. Unquoted commas can
only be used to separate arguments in functional notation and list
notation, and as a conjunction operator. Unquoted bars can only appear
within lists to separate head and tail like [Head|Tail]
,
and as infix operator for alternation in grammar rules like a -->
b | c.
[a :- b, c].
must now be disambiguated to mean [(a :- b), c].
or [(a
:- b, c)].
X
== -, true.
write X == (-), true.
Currently, this is
not entirely enforced.
true
, SWI-Prolog has been compiled with
large file support (LFS) and is capable to access files larger
than 2GB on 32-bit hardware. Large file-support is default on
installations built using configure that support it and may be
switched off using the configure option --disable-largefile
.false
(default), unification succeeds, creating an infinite
tree. Using true
, unification behaves as unify_with_occurs_check/2,
failing silently. Using error
, an attempt to create a
cyclic term results in an occurs_check
exception. The
latter is intended for debugging unintentional creations of cyclic
terms. Note that this flag is a global flag modifying fundamental
behaviour of Prolog. Changing the flag from its default may cause
libraries to stop functioning properly..so
files) or dynamic link libraries (.DLL
files).true
, compile in optimised mode. The initial value is
true
if Prolog was started with the -O
command-line option. The optimise
flag is scoped to a source file.
Currently optimise compilation implies compilation of arithmetic, and deletion of redundant true/0 that may result from expand_goal/2.
Later versions might imply various other optimisations such as integrating small predicates into their callers, eliminating constant expressions and other predictable constructs. Source code optimisation is never applied to predicates that are declared dynamic (see dynamic/1).
open(pipe(command), mode, Stream)
, etc. are
supported. Can be changed to disable the use of pipes in applications
testing this feature. Not recommended.none
(default) implies no preprocessor.determinism
, which implies the system prompts for
alternatives if the goal succeeded while leaving choicepoints. Many
classical Prolog systems behave as groundness
: they prompt
for alternatives if and only if the query contains variables.qcompile(+Atom)
option of load_files/2.boot32.prc
, the file specified with -x
or the running executable. See also resource/3.true
, print error messages, otherwise suppress them. May
be changed. See also the debug_on_error
Prolog flag. Default is true
, except for the runtime
version.true
, SWI-Prolog is compiled with
-DO_RUNTIME, disabling various useful development features (currently
the tracer and profiler).true
, Prolog has been started from a state
saved with qsave_program/[1,2]..so
for most Unix systems and .dll
for Windows. Used for
locating files using the file_type
executable
.
See also
absolute_file_name/3.false
if the hosting OS does not support signal
handling or the command-line option -nosignals is
active. See
section 9.4.21.1 for
details.false
(no checking), true
(full checking) and loose
. Using checking mode loose
(default), the system accepts byte I/O from text stream that use ISO
Latin-1 encoding and accepts writing text to binary streams.timezone
variable associated
with the POSIX tzset() function. See also convert_time/2.true
, top-level variables starting with an underscore (_
)
are printed normally. If false
they are hidden. This may be
used to hide bindings in complex queries from the top-level.true
(default false
) show the internal
sharing of subterms in the answer substitution. The example below
reveals internal sharing of leaf-nodes in red-black trees as
implemented by the
library(rbtrees)
predicate rb_new/1:
?- set_prolog_flag(toplevel_print_factorized, true). ?- rb_new(X). X = t(_S1, _S1), % where _S1 = black('', _G387, _G388, '').
If this flag is false
, the % where
notation
is still used to indicate cycles as illustrated below. This example also
shows that the implementation reveals the internal cycle length, and not
the minimal cycle length. Cycles of different length are
indistinguishable in Prolog (as illustrated by S == R
).
?- S = s(S), R = s(s(R)), S == R. S = s(S), R = s(s(R)).
~
(tilde) sequences are replaced:
m | Type in
module if not user (see module/1) |
l | Break level if not 0 (see break/0) |
d | Debugging state if not normal execution (see debug/0, trace/0) |
! | History event if history is enabled (see flag history) |
$
variable reference. See section
2.8.true
(false
is the default), garbage
collections and stack-shifts will be reported on the terminal. May be
changed. Values are reported in bytes as G+T,
where G is the global stack value and T the trail
stack value. `Gained' describes the number of bytes reclaimed. `used'
the number of bytes on the stack after GC and `free' the number of bytes
allocated, but not in use. Below is an example output.
% GC: gained 236,416+163,424 in 0.00 sec; used 13,448+5,808; free 72,568+47,440
true
, the
operating system is some version of Unix. Defined if the C-compiler used
to compile this version of SWI-Prolog either defines __unix__
or unix
. On other systems this flag is not available.fail
, the predicate fails silently. If warn
, a
warning is printed, and execution continues as if the predicate was not
defined and if error
(default), an existence_error
exception is raised. This flag is local to each module and inherited
from the module's import-module. Using default setup, this
implies that normal modules inherit the flag from user
,
which in turn inherits the value error
from system
.
The user may change the flag for module user
to change the
default for all application modules or for a specific module. It is
strongly advised to keep the error
default and use dynamic/1
and/or multifile/1
to specify possible non-existence of a predicate.silent
, warning
and error
. The first two create the flag on-the-fly, where warning
prints a message. The value error
is consistent with ISO:
it raises an existence error and does not create the flag. See also create_prolog_flag/3.
The default is silent
, but future versions may change that.
Developers are encouraged to use another value and ensure proper use of create_prolog_flag/3
to create flags for their library.silent
, messages of type informational
and banner
are suppressed. The -q switches
the value from the initial
normal
to silent
.true
the normal consult message will be printed if a
library is autoloaded. By default this message is suppressed. Intended
to be used for debugging purposes.full
, normal
(default) and
silent
. The value of this flag is normally controlled by
the option silent(Bool)
provided by load_files/2.true
(default false
), print messages
indicating the progress of absolute_file_name/[2,3]
in locating files. Intended for debugging complicated file-search paths.
See also file_search_path/2.10000 × Major + 100 × Minor + PatchNote that in releases up to 2.7.10 this Prolog flag yielded an atom holding the three numbers separated by dots. The current representation is much easier for implementing version-conditional statements.
[]
.true
(default), a warning is printed if an implicitly
imported predicate is clobbered by a local definition. See
use_module/1
for details.true
, the
operating system is an implementation of Microsoft Windows (NT/2000/XP,
etc.). This flag is only available on MS-Windows based versions.attributes
option of
write_term/3.
Default is ignore
.true
it prints
bold and underlined text using
overstrike.true
if the XPCE graphics system is
loaded.permission_error
. If the provided Value does not
match the type of the flag, a type_error
is raised.
Some flags (e.g., unknown) are maintained on a per-module basis. The addressed module is determined by the Key argument.
In addition to ISO, SWI-Prolog allows for user-defined Prolog flags.
The type of the flag is determined from the initial value and cannot be
changed afterwards. Defined types are boolean
(if the
initial value is one of false
, true
, on
or off
),
atom
if the initial value is any other atom, integer
if the value is an integer that can be expressed as a 64-bit signed
value. Any other initial value results in an untyped flag that can
represent any valid Prolog term.
The behaviour when Key denotes a non-existent key depends on the Prolog flag user_flags. The default is to define them silently. New code is encouraged to use create_prolog_flag/3 for portability.
read_write
and read_only
. The default is read_write
.boolean
, atom
, integer
, float
and term
. The default is determined from the initial value.
Note that term
restricts the term to be ground.
This predicate behaves as set_prolog_flag/2 if the flag already exists. See also user_flags.