Warning c666: Due to the range of the involved domain this test always succeeds

This warning (introduced in Visual Prolog 7.2) is rather important and should not be neglected.

The warning will be given for code like this:

domains positive = integer [0..].

predicates ppp : (integer X). qqq : (positive Y).

clauses ppp(X) :- Y = X - 13, Y >= 0, % w666 !,       qqq(Y). ppp(_X).

The test Y >= 0 is clearly intended to ensure that qqq is not called with a negative value.

But in reality the code works in a quite different way than the programmer intended.

The type analysis see that Y must have the type positive, and therefore Y must be in the range [0..]. To ensure this property of Y the compiler inserts a range check at the point where Y is calculated. So if X - 13</vp> is negative an out-of-range exception is raised. Subsequently, the test Y >= 0</vp> will always succeed. And this it what is meant by: Due to the range of the involved domain this test always succeeds.

I.e. Y</vp> has type positive</vp> and therefore the test always succeeds.

The warning very is important, because the programmer thought that the code would fail if Y was negative, but in reality an exception is raised.

A good way to eliminate the warning and get the intended behavior (i.e. fail to the next clause) is by using tryConvert</vp>, like this:

clauses ppp(X) :- Y = tryConvert(positive, X - 13), !,       qqq(Y). ppp(_X).

This code tests whether the conversion to positive</vp> is possible, rather than testing with the boundary.