This section is a reference to the debugger interaction predicates. A more use-oriented overview of the debugger is in section 2.10.
If you have installed XPCE, you can use the graphical front-end of the tracer. This front-end is installed using the predicate guitracer/0.
trace(Pred, +all)
.
call
,
redo
, exit
, fail
). The atom all
refers to all ports. If the port is preceded by a -
sign, the trace point is cleared for the port. If it is preceded by a +
,
the trace point is set. Tracing a predicate is achieved by
wrapping the predicate using wrap_predicate/4.
Each time a port (of the 4-port model) is passed that has a trace point set, the goal is printed. Unlike trace/0, however, the execution is continued without asking for further information. Examples:
?- trace(hello). | Trace all ports of hello with any arity in any module. |
?- trace(foo/2, +fail). | Trace failures of foo/2 in any module. |
?- trace(bar/1, -all). | Stop tracing bar/1. |
Note that the min_free
parameter of all stacks is
enlarged to 8 K cells if debugging is switched off in order to
avoid excessive GC. GC complicates tracing because it renames the _<NNN>
variables and replaces unreachable variables with the atom
<garbage_collected>
. Calling nodebug/0
does not reset the initial free-margin because several parts of
the top level and debugger disable debugging of system code regions. See
also set_prolog_stack/2.
call
, redo
, exit
, fail
and
unify
. The special shorthand all
refers to all
ports,
full
refers to all ports except for the unify port
(default).
half
refers to the call
, redo
and fail
port.full
.trace
(meaning error
) and fail
.
If the unknown flag
is set to
warning
, unknown/2
reports the value as trace
.
Loading a file using load_files/2 or one of its derived predicates reset the style checking options to their value before loading the file, scoping the option to the remainder of the file and all files loaded after changing the style checking.
false
.
always_false(X) :- X == Y, write(Y).
p(Next)
may be called with Next unbound.
p(Arg) :- ( Cond -> Next = value1 ; true ), p(Next).
If a variable V is intended to be left unbound, one can
use
V=_
. This construct is removed by the compiler and thus has
no implications for the performance of your program.
This check was suggested together with semantic singleton checking. The SWI-Prolog libraries contain about a hundred clauses that are triggered by this style check. Unlike semantic singleton analysis, only a tiny fraction of these clauses proofed faulty. In most cases, the branches failing to bind the variable fail or raise an exception or the caller handles the case where the variable is unbound. The status of this style check is unclear. It might be removed in the future or it might be enhanced with a deeper analysis to be more precise.