Guest editor's introduction
The Journal of Logic Programming
The design of programming languages is an art involving difficult trade-offs between expressiveness, efficiency, and semantic simplicity. The developments of logic programming and Prolog are typical examples of this tension. Logic programming, by sacrificing the full expressiveness of predicate calculus, opens the door to efficient implementations of programming languages based on logic. Prolog, by imposing further restrictions on logic programming such as a depth-first search strategy and a
... t-to-right computation rule, achieves a compromise between expressiveness and efficiency that is particularly appropriate for a variety of applications such as natural language and symbolic processing. The shortcomings of Prolog have often been stressed in the past, yet few other logic programming languages have achieved so much popularity and it is still hard to come up with better incarnations of the logic programming ideal. Constraint logic programming (CLP) is probably one of the most promising attempts in this direction. CLP is based on the idea of replacing unification by constraint solving as the kernel operation of logic programming languages. CLP is a scheme that can be instantiated to various constraint solvers depending on the class of applications targeted. For instance, languages like Prolog III, CHIP, and CLP(21 embed constraint systems over real or rational numbers, Booleans, and finite sets of integers. The idea underlying CLP is amazingly simple retrospectively, yet it is far-reaching for a number of reasons that we can only outline in this introduction. From a semantic standpoint, CLP generalizes and simplifies the theory of logic programming because constraints are conceptually simpler than unifiers. From a programmer standpoint, CLP amplifies the traditional advantages of logic programming without sacrificing its strengths. In particular, CLP enhances our ability to work with partial information (generalizing the logic variable), increases the multidirectionality of programs, and improves the expressiveness and declarative nature of the language. Finally, CLP opens new horizons and application areas for logic programming. For instance, the foregoing CLP languages have been applied to numerous problems in operations research, design, biology, decision-support systems, and artificial intelligence, to name a few. They are now used in industry to solve practical problems that were previously considered outside the application domain of logic programming. Perhaps the nicest feature of CLP is its balance between semantic simplicity and practicality that is at the heart of logic programming since its inception.