10.37.9.1 Fragments and Bits

Rationals. The internal data structure for rational numbers is rat(Num,Den). Den is always positive, i.e. the sign of the rational number is the sign of Num. Further, Num and Den are relative prime. Note that integer N looks like rat(N,1) in this representation. You can control printing of terms with user:portray/1.

Partial Evaluation, Compilation. 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 for the expansion of {}/1, via the goal and term expansion hook predicates.

Asserting with Constraints. If you use the database, the clauses you assert might have constraints associated with their variables. You should use projecting_assert/1 instead of assert/1 in order to ensure that only the relevant and projected constraints get stored in the database.

     | ?- {A+B=<33}, projecting_assert(test(A,B)).
     
     {A+B=<33}
     
     | ?- listing(test).
     test(A, B) :-
             {A+B=<rat(33,1)}
     
     | ?- test(A,B).
     
     {A+B=<33}

Send feedback on this subject.