Contents Next

Preface

FaCiLe is a constraint programming library over integer finite domains written in OCaml[5]. It offers all usual constraints system facilities to create and handle finite domain variables, arithmetic expressions and constraints (possibly non-linear), built-in global constraints and search goals. FaCiLe allows to easily build user-defined constraints and goals (including recursive ones) from scratch or by combining simple primitives, making pervasive use of OCaml higher-order functionals to provide a simple and flexible user interface. As FaCiLe is an OCaml library and not ``yet another language'', the user benefits from type inference and strong typing discipline, high level of abstraction, modules and objects system, as well as native code compilation efficiency, garbage collection and replay debugger. All these features of OCaml (among many others) allow to prototype and experiment quickly: modeling, data processing and interface are implemented with the same powerful and efficient language.

This manual is not a document about constraint programming techniques but only a tool description. Users should be familiar with other constraint systems to easily apprehend FaCiLe through the reading of this manual. Beginners can easily find comprehensive information on the Web (e.g. http://www.cs.unh.edu/ccc/archive/). This manual is neither a course about functional programming and users should refer to the official Caml Web site at http://caml.inria.fr/ and the OCaml manual [5] to obtain introductory (as well as advanced) material about the host language of FaCiLe. Hurried readers may also take a look at a short overview appearing in the ALP Newsletter [1].

Since OCaml forbids overloading, FaCiLe unusual looking operators might be a little disconcerting at first sight. Moreover, there is no implicit casting, so explicit conversions between variables (or integer) and arithmetic expressions are compulsory. These features lead to less concise expressions than with poorly typed languages, but then the user knows exactly which operation is executed by the system and cannot erratically mix values of different types. Furthermore, ML style higher-order functionals and powerful type system ease the design and processing of complex data structures without the need of syntactic sugar (iterators, mapping and folding are ``native'' in OCaml). So FaCiLe does not provide endlessly more and more ad hoc functions for each particular case to exhibit the smallest possible code for toy examples, but rather aims at providing simple building blocks and operators to combine them efficiently.

This manual is structured in two main parts:
  1. The user's manual which starts with basic examples to give a taste of FaCiLe, then details the main concepts and eventually discusses more advanced subjects like the design of constraints and goals from scratch.
  2. The reference manual which describes module by module all the functionalities of FaCiLe.
Numerous examples are provided all along the user's manual and more complete ones are available within the standard distribution in the examples directory, as well as a generic Makefile.

Eventually, we would like to thank our first thorough industrial beta-tester, Mattias Waldau, whose suggestions helped us to develop this release.

Good reading.


Contents Next