Node:Arithmetic Constraints, Next:Membership Constraints, Previous:Available Constraints, Up:Available Constraints
?Expr RelOp ?Expr
defines an arithmetic constraint. The syntax for Expr and
RelOp is defined by a grammar (see Syntax of Arithmetic Expressions). Note that the expressions are not restricted to being
linear. Constraints over non-linear expressions, however, will usually
yield less constraint propagation than constraints over linear expressions.
In particular, the expressions X / Y
and X mode Y
will block until Y is ground.
Arithmetic constraints can be reified as e.g.
| ?- X in 1..2, Y in 3..5, X#=<Y #<=> B. B = 1, X in 1..2, Y in 3..5 ?
Linear arithmetic constraints maintain (at least) interval-consistency and their reified versions detect (at least) interval-entailment and -disentailment; see The Constraint System.
The following constraints are among the library constraints that general arithmetic constraints compile to. They express a relation between a sum or a scalar product and a value, using a dedicated algorithm that avoids creating any temporary variables holding intermediate values. If you are computing a sum or a scalar product, it can be much more efficient to compute lists of coefficients and variables and post a single sum or scalar product constraint than to post a sequence of elementary constraints.
sum(+Xs, +RelOp, ?Value)
where Xs is a list of integers or domain
variables, RelOp is a relational symbol as above, and
Value is an integer or a domain variable. True if
Xs RelOp Value. Cannot be reified.
scalar_product(+Coeffs, +Xs, +RelOp, ?Value)
where Coeffs is a list of length n of integers, Xs is a list of length n of integers or domain variables, RelOp is a relational symbol as above, and Value is an integer or a domain variable. True if Coeffs*Xs RelOp Value. Cannot be reified.
The following constraint is a domain consistent special case of
scalar_product/4
with RelOp is #=
:
knapsack(+Coeffs, +Xs, ?Value)
where Coeffs is a list of length n of non-negative integers, Xs is a list of length n of non-negative integers or domain variables, and Value is an integer or a domain variable. Any domain variables must have finite bounds. True if Coeffs*Xs = Value. Cannot be reified.