- Documentation
- Reference manual
- The SWI-Prolog library
- library(clpfd): CLP(FD): Constraint Logic Programming over Finite Domains
- Introduction
 - Arithmetic constraints
 - Declarative integer arithmetic
 - Example: Factorial relation
 - Combinatorial constraints
 - Domains
 - Example: Sudoku
 - Residual goals
 - Core relations and search
 - Example: Eight queens puzzle
 - Optimisation
 - Reification
 - Enabling monotonic CLP(FD)
 - Custom constraints
 - Applications
 - Acknowledgments
 - CLP(FD) predicate index
 - Closing and opening words about CLP(FD)
 
 
 - library(clpfd): CLP(FD): Constraint Logic Programming over Finite Domains
 
 - The SWI-Prolog library
 - Packages
 
 - Reference manual
 
A.8.11 Optimisation
We can use labeling/2 
to minimize or maximize the value of a CLP(FD) expression, and generate 
solutions in increasing or decreasing order of the value. See the 
labeling options min(Expr) and max(Expr), 
respectively.
Again, to easily try different labeling options in connection with 
optimisation, we recommend to introduce a dedicated predicate for 
posting constraints, and to use labeling/2 in a separate 
goal. This way, we can observe properties of the core relation in 
isolation, and try different labeling options without recompiling our 
code.
If necessary, we can use once/1 to commit to the first 
optimal solution. However, it is often very valuable to see alternative 
solutions that are also optimal, so that we can choose among 
optimal solutions by other criteria. For the sake of
purity 
and completeness, we recommend to avoid once/1 and other 
constructs that lead to impurities in CLP(FD) programs.
Related to optimisation with CLP(FD) constraints are
library(simplex) 
and CLP(Q) which reason about linear constraints over rational 
numbers.