Once one has a working solver, it is obvious and attractive to run the
constraints in a clause definition at read time or compile
time and proceed with the answer constraints in place of the original
constraints. This gets you constant folding and in fact the full
algebraic power of the solver applied to the avoidance of computations
at runtime. The mechanism to realize this idea is to use dump/3,
call_residue/2
for the expansion of {}/1
, via hook
predicate user:goal_expansion/3
).