Constraint Logic Programming over Rationals and Reals {#clpqr} ===================================================== @ingroup paackages YAP now uses the CLP(R) package developed by <em>Leslie De Koninck</em>, K.U. Leuven as part of a thesis with supervisor Bart Demoen and daily advisor Tom Schrijvers, and distributed with SWI-Prolog. This CLP(R) system is a port of the CLP(Q,R) system of Sicstus Prolog and YAP by Christian Holzbaur: Holzbaur C.: OFAI clp(q,r) Manual, Edition 1.3.3, Austrian Research Institute for Artificial Intelligence, Vienna, TR-95-09, 1995, <http://www.ai.univie.ac.at/cgi-bin/tr-online?number+95-09> This port only contains the part concerning real arithmetics. This manual is roughly based on the manual of the above mentioned *CLP(QR)* implementation. Please note that the clpr library is <em>not</em> an `autoload` library and therefore this library must be loaded explicitely before using it: ~~~~~ :- use_module(library(clpr)). ~~~~~ ### Solver Predicates {#CLPQR_Solver_Predicates} The following predicates are provided to work with constraints: ### Syntax of the predicate arguments {#CLPQR_Syntax} The arguments of the predicates defined in the subsection above are defined in the following table. Failing to meet the syntax rules will result in an exception. ~~~~~ <Constraints> ---> <Constraint> \ single constraint \ | <Constraint> , <Constraints> \ conjunction \ | <Constraint> ; <Constraints> \ disjunction \ <Constraint> ---> <Expression> {<} <Expression> \ less than \ | <Expression> {>} <Expression> \ greater than \ | <Expression> {=<} <Expression> \ less or equal \ | {<=}(<Expression>, <Expression>) \ less or equal \ | <Expression> {>=} <Expression> \ greater or equal \ | <Expression> {=\=} <Expression> \ not equal \ | <Expression> =:= <Expression> \ equal \ | <Expression> = <Expression> \ equal \ <Expression> ---> <Variable> \ Prolog variable \ | <Number> \ Prolog number (float, integer) \ | +<Expression> \ unary plus \ | -<Expression> \ unary minus \ | <Expression> + <Expression> \ addition \ | <Expression> - <Expression> \ substraction \ | <Expression> * <Expression> \ multiplication \ | <Expression> / <Expression> \ division \ | abs(<Expression>) \ absolute value \ | sin(<Expression>) \ sine \ | cos(<Expression>) \ cosine \ | tan(<Expression>) \ tangent \ | exp(<Expression>) \ exponent \ | pow(<Expression>) \ exponent \ | <Expression> {^} <Expression> \ exponent \ | min(<Expression>, <Expression>) \ minimum \ | max(<Expression>, <Expression>) \ maximum \ ~~~~~ ### Use of unification {#CLPQR_Unification} Instead of using the `{}/1` predicate, you can also use the standard unification mechanism to store constraints. The following code samples are equivalent: + Unification with a variable ~~~~~ {X =:= Y} {X = Y} X = Y ~~~~~ + Unification with a number ~~~~~ {X =:= 5.0} {X = 5.0} X = 5.0 ~~~~~ #### Non-Linear Constraints {#CLPQR_NonhYlinear_Constraints} In this version, non-linear constraints do not get solved until certain conditions are satisfied. We call these conditions the _isolation_ axioms. They are given in the following table. ~~~~~ A = B * C when B or C is ground or // A = 5 * C or A = B * 4 \\ A and (B or C) are ground // 20 = 5 * C or 20 = B * 4 \\ A = B / C when C is ground or // A = B / 3 A and B are ground // 4 = 12 / C X = min(Y,Z) when Y and Z are ground or // X = min(4,3) X = max(Y,Z) Y and Z are ground // X = max(4,3) X = abs(Y) Y is ground // X = abs(-7) X = pow(Y,Z) when X and Y are ground or // 8 = 2 ^ Z X = exp(Y,Z) X and Z are ground // 8 = Y ^ 3 X = Y ^ Z Y and Z are ground // X = 2 ^ 3 X = sin(Y) when X is ground or // 1 = sin(Y) X = cos(Y) Y is ground // X = sin(1.5707) X = tan(Y) ~~~~~