- 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.1 Introduction

This library provides CLP(FD): Constraint Logic Programming over
Finite Domains. This is an instance of the general CLP(*X*) scheme
(section 7), extending logic
programming with reasoning over specialised domains.

CLP(FD) lets us reason about **integers** in a way that honors the
relational nature of Prolog. Read **The
Power of Prolog** to understand how this library is meant to be
used in practice.

There are two major use cases of CLP(FD) constraints:

**declarative integer arithmetic**(section A.8.3)- solving
**combinatorial problems**such as planning, scheduling and allocation tasks.

The predicates of this library can be classified as:

*arithmetic*constraints like #=/2, #>/2 and #\=/2 (section A.8.17.1)- the
*membership*constraints in/2 and ins/2 (section A.8.17.2) - the
*enumeration*predicates indomain/1, label/1 and labeling/2 (section A.8.17.3) *combinatorial*constraints like all_distinct/1 and global_cardinality/2 (section A.8.17.4)*reification*predicates such as #<==>/2 (section A.8.17.5)*reflection*predicates such as fd_dom/2 (section A.8.17.6)

In most cases, *arithmetic constraints* (section
A.8.2) are the only predicates you will ever need from this library.
When reasoning over integers, simply replace low-level arithmetic
predicates like `(is)/2`

and `(>)/2`

by the
corresponding CLP(FD) constraints like #=/2
and #>/2 to honor and
preserve declarative properties of your programs. For satisfactory
performance, arithmetic constraints are implicitly rewritten at
compilation time so that low-level fallback predicates are automatically
used whenever possible.

Almost all Prolog programs also reason about integers. Therefore, it
is highly advisable that you make CLP(FD) constraints available in all
your programs. One way to do this is to put the following directive in
your `~/.swiplrc`

initialisation file:

:- use_module(library(clpfd)).

All example programs that appear in the CLP(FD) documentation assume that you have done this.

Important concepts and principles of this library are illustrated by
means of usage examples that are available in a public git repository:
**github.com/triska/clpfd**

If you are used to the complicated operational considerations that
low-level arithmetic primitives necessitate, then moving to CLP(FD)
constraints may, due to their power and convenience, at first feel to
you excessive and almost like cheating. It *isn't*. Constraints are
an integral part of all popular Prolog systems, and they are designed to
help you eliminate and avoid the use of low-level and less general
primitives by providing declarative alternatives that are meant to be
used instead.

When teaching Prolog, CLP(FD) constraints should be introduced
*before* explaining low-level arithmetic predicates and their
procedural idiosyncrasies. This is because constraints are easy to
explain, understand and use due to their purely relational nature. In
contrast, the modedness and directionality of low-level arithmetic
primitives are impure limitations that are better deferred to more
advanced lectures.

We recommend the following reference (PDF: metalevel.at/swiclpfd.pdf) for citing this library in scientific publications:

@inproceedings{Triska12, author = {Markus Triska}, title = {The Finite Domain Constraint Solver of {SWI-Prolog}}, booktitle = {FLOPS}, series = {LNCS}, volume = {7294}, year = {2012}, pages = {307-316} }

More information about CLP(FD) constraints and their implementation
is contained in: **metalevel.at/drt.pdf**

The best way to discuss applying, improving and extending CLP(FD)
constraints is to use the dedicated `clpfd`

tag on
stackoverflow.com.
Several of the world's foremost CLP(FD) experts regularly participate in
these discussions and will help you for free on this platform.