This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/docs/clpqr.md

4.0 KiB

@defgroup clpr Constraint Logic Programming over Rationals and Reals @ingroup SWILibrary @{

YAP now uses the CLP(R) package developed by Leslie De Koninck, 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 not an autoload library and therefore this library must be loaded explicitely before using it:

:- use_module(library(clpr)).

@defgroup CLPR_Solver_Predicates Solver Predicates @ingroup clpr @{

The following predicates are provided to work with constraints:

  • @defgroup CLPR_Syntax Syntax of the predicate arguments @ingroup YAPPackages @{

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 \

@}

@defgroup CLPR_Unification Use of unification @ingroup clpr @{

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

@}

@defgroup CLPR_NonhYlinear_Constraints Non-Linear Constraints @ingroup clpr @{

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)

@}

@}