The output of the determinacy checker is quite simple. For each clause containing unexpected nondeterminacy, a single line is printed showing the module, name, arity, and clause number (counting from 1). The form of the information is:
* Non-determinate: module:name/arity (clause number)
A second line for each nondeterminate clause indicates the cause of the nondeterminacy. The recognized causes are:
fail/0
or raise_exception/1
.
fail/0
or raise_exception/1
. In this case, the
clause number of the other clause is mentioned.
The determinacy checker also occasionally prints warnings when
declarations are made too late in the file or not at all. For
example, if you include a dynamic
, nondet
, or
discontiguous
declaration for a predicate after some clauses
for that predicate, or if you put a dynamic
or nondet
declaration for a predicate after a clause that includes a call to
that predicate, the determinacy checker may have missed some
nondeterminacy in your program. The checker also detects undeclared
discontiguous predicates, which may also have undetected
nondeterminacy. Finally, the checker looks for goals in your program
that indicate that predicates are dynamic; if no dynamic
declaration for those predicates, you will be warned.
These warnings take the following form:
! warning: predicate module:name/arity is property. ! Some nondeterminacy may have been missed. ! Add (or move) the directive~n ! :- property module:name/arity. ! near the top of this file.