As mentioned earlier, it is not in general possible to find exactly which places in a program will lead to nondeterminacy. The determinacy checker gives predicates the benefit of the doubt: when it's possible that a predicate will be determinate, it will not be reported. The checker will only report places in your program which will be nondeterminate regardless of which arguments are bound. Despite this, the checker catches most unwanted nondeterminacy in practice.
The determinacy checker looks for the following sources of nondeterminacy:
fail/0
, false/0
, or raise_exception/1
. First
argument indexing is not considered for multifile predicates, because
another file may have a clause for this predicate with the same
principal functor of its first argument.
fail/0
, false/0
, or raise_exception/1
in each arm
of the disjunction but the last, or where the whole disjunction is
followed by a cut, fail/0
, false/0
, or
raise_exception/1
.
fail/0
, false/0
, or
raise_exception/1
, or where it appears in the condition of an
if-then-else construct. Known nondeterminate predicates include hooks
and those declared nondeterminate or dynamic (since they can be
modified, dynamic predicates are assumed to be nondeterminate), plus
the following built-in predicates:
absolute_file_name/3
, when the options list contains
the term solutions(all)
.
atom_concat/3
, when the first two arguments are variables
not appearing earlier in the clause (including the clause head).
bagof/3
, when the second argument contains any variables not
appearing earlier in the clause (including the clause head).
clause/[2,3]
.
current_op/3
, when any argument contains any variables not
appearing earlier in the clause (including the clause head).
current_key/2
, when the second argument contains any variables not
appearing earlier in the clause (including the clause head).
current_predicate/2
, when the second argument contains any variables not
appearing earlier in the clause (including the clause head).
length/2
, when both arguments are variables
not appearing earlier in the clause (including the clause head).
predicate_property/2
, when either argument contains any variables not
appearing earlier in the clause (including the clause head).
recorded/3
.
repeat/0
.
retract/1
.
setof/3
, when the second argument contains any variables not
appearing earlier in the clause (including the clause head).
source_file/[1,2]
when the last argument contains any variables not
appearing earlier in the clause (including the clause head).
sub_atom/5
, when at least two of the second, fourth and fifth
arguments are variables not appearing earlier in the clause (including
the clause head).