This warning is generated by the compiler for BIPs (built-in predicates)
that are inlined by the compiler and for which the compiler can prove
that they are meaningless. An example is using ==/2
against a not-yet-initialised variable as illustrated in the example
below. This comparison is always false
.
always_false(X) :-
X == Y,
write(Y).
Verifies that if a variable is introduced in a branch and used
after the branch, it is introduced in all branches. This code
aims at bugs following the skeleton below, where 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.