  This paper presents a programming language which includes paradigms that are
usually associated with declarative languages, such as sets, rules and search,
into an imperative (functional) language. Although these paradigms are
separately well known and are available under various programming environments,
the originality of the CLAIRE language comes from the tight integration, which
yields interesting run-time performances, and from the richness of this
combination, which yields new ways in which to express complex algorithmic
patterns with few elegant lines. To achieve the opposite goals of a high
abstraction level (conciseness and readability) and run-time performance
(CLAIRE is used as a C++ preprocessor), we have developed two kinds of
compiler: first, a pattern pre-processor handles iterations over both concrete
and abstract sets (data types and program fragments), in a completely
user-extensible manner; secondly, an inference compiler transforms a set of
logical rules into a set of functions (demons that are used through procedural
attachment).
