##### 10.34.3.1 Arithmetic 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 bound-consistency and their reified versions detect bound-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 sum(Xs) RelOp Value. Cannot be reified. Corresponds roughly to sumlist/2 in library(lists).
scalar_product(+Coeffs, +Xs, +RelOp, ?Value)
scalar_product(+Coeffs, +Xs, +RelOp, ?Value, +Options)
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 sum(Coeffs*Xs) RelOp Value. Cannot be reified.

Options is a list that may include the following option. It can be used to control the level of consistency used by the constraint.

consistency(Cons)
The value is one of the following:
domain
The constraint will maintain arc-consistency. Please note: This option is only meaningful if RelOp is #=, and requires that any domain variables have finite bounds.
bound
value
The constraint will try to maintain bound-consistency (the default).

The following constraints constrain a value to be the minimum (maximum) of a given list of values.

minimum(?Value, +Xs)
where Xs is a list of integers or domain variables, and Value is an integer or a domain variable. True if Value is the minimum of Xs. Cannot be reified. Corresponds to min_member/2 in library(lists).
maximum(?Value, +Xs)
where Xs is a list of integers or domain variables, and Value is an integer or a domain variable. True if Value is the maximum of Xs. Cannot be reified. Corresponds to max_member/2 in library(lists).

Send feedback on this subject.