Node:Arithmetic Constraints, Next:Membership 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.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, except equalities, maintain interval-consistency and their reified versions detect 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, which 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 special case of
`scalar_product/4`

where `RelOp` is `#=`

, and
which is domain-consistent in the `Xs`:

`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.