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 that 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 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 second argument is a list containing
the term solutions(all)
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,3]
when the last argument contains any variables not
appearing earlier in the clause (including the clause head).