Dpto. Sistemas Informáticos y Programación, UCM, Madrid
IntroductionStarting at a seminal paper published by J. Jaffar and J.L. Lassez in 1987 [JL87], Constraint Logic Programming (CLP) has developed as a powerful programming paradigm which supports a clean combination of logic (in the form of Horn clauses) and domain-specific methods for constraint satisfaction, simplification and optimization. The well established mathematical foundations of logic programming [Llo87, Apt90] have been succesfully extended to CLP [JMMS96]. Simultaneously, practical applications of CLP have arisen in many fields. Good introductions to the theory, implementation issues and programming applications of CLP languages can be found in [JM94,MS98]. On the other hand, the combination of logic programming with other declarative programming paradigms (especially functional programming) has been widely investigated during the last decade, leading to useful insights for the design of more expressive declarative languages. The first attempt to combine functional and logic languages was done by J.A. Robinson and E.E. Sibert when proposing the language LOGLISP [RS82]. Some other early proposals for the design of functional + logic languages are described in [De86]. A more recent survey of the operational principles and implementation techniques used for the integration of functions into logic programming can be found in [Han94b].Declarative programming, in the wide sense, should provide a logical semantics for programs. Nevertheless, many of the early proposals for the integration of functional and logic programming had no clear logical basis. Among the logically well-founded approaches, most proposals (as e.g. [JLM84, GM87, Höl89]) have suggested to use equational logic. This allows to represent programs as sets of oriented equations, also known as rewrite rules, whose computational use can rely on a well established theory [DJ90,Klo92,BN98]. Goals (also called queries) for a functional logic program can be represented as systems of equations, and narrowing (a natural combination of rewriting and unification, originally proposed as a theorem proving tool [Sla74, Lan75, Fay79, Hul80]) can be used as a goal solving mechanism.