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 exists, 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 ! :- property module:name/arity. ! near the top of this file.