The finite domain library has been used and refined over a 10 year period. As a result it has a great many constraint handling facilities. It is best seen as three libraries.
The first is a library for handling symbolic finite domains, with values like red, machine_1 etc. The built-in constraints on symbolic finite domain variables are equations and disequalities: these constraints can only hold between expressions which are either constants or variables. These constraints can also be used when the domains are numeric.
The second is a library for handling integer variables, and
numerical constraints on those variables.
The library propagates equations and inequalities between linear expressions.
A linear numeric expression is one that can be written in the form
, where each term can, in turn, be
written Number or Number * Variable.
The number can be positive or negative.
An example is the expression 3*X + (-4)*Y + 3 (which we would
normally write 3*X - 4*Y + 3).
The third is a library supporting some built-in complex constraints.
Two examples of such constraints are the alldistinct
constraint, which
constraints a set of variables to take values which are pairwise distinct, and
the atmost
constraint, which constrains at most N variables from a
given set to take a certain value.