Based on the intuitively simple notion of a set of tests
``covering'' the type of the input variables.
Clause: set of primitive tests followed by various
unifications and body goals.
The tests at the beginning determine whether the clause
should be executed or not (may involve pattern
matching, arithmetic tests, type tests, etc.)
For any given clause, we refer to the conjunction of its primitive
tests as ``the test of the clause''.
The disjunction of all the tests of the clauses that define a
particular predicate is referred to as ``the test of that
predicate''.
Example:
p(X, Y):- X > 0, Y is X + 1.
p(X, Y):- X =< 0, Y is -X.
Test of p/2: .
For any call to p/2 with X bound to a integer
and Y free, at least one of the tests will succeed.
``The test of the predicate p/2 covers the type of X''.
Since the rest of the body literals of p/2 are guaranteed not to
fail, at least one of the clauses will not fail, and thus the call
will also not fail.