This nonterminal is the main mechanism in which residual constraints are
obtained. It is called in every module where it is defined, and
Var has an attribute. Its argument is that variable. In each
module, attribute_goals//1 must describe a list of Prolog goals that are
declaratively equivalent to the goals that caused the attributes of that
module to be present and in their current state. It is always possible
to do this (since these attributes stem from such goals), and it is the
responsibility of constraint library authors to provide this mapping
without exposing any library internals. Ideally and typically, remaining
relevant attributes are mapped to pure and potentially
simplified Prolog goals that satisfy both of the following:
- They are declaratively equivalent to the constraints that were
originally posted.
- They use only predicates that are themselves exported and documented
in the modules they stem from.
The latter property ensures that users can reason about residual
goals, and see for themselves whether a constraint library behaves
correctly. It is this property that makes it possible to thoroughly test
constraint solvers by contrasting obtained residual goals with expected
answers.
This nonterminal is used by copy_term/3,
on which the Prolog top level relies to ensure the basic invariant of
pure Prolog programs: The answer is declaratively equivalent to
the query.
Note that instead of defaulty representations, a Prolog
list is used to represent residual goals. This simplifies
processing and reasoning about residual goals throughout all programs
that need this functionality.