Declarative Programming in Escher

Escher is a declarative, general-purpose programming language which integrates the best features of both functional and logic programming languages. It has types and modules, higher-order and meta-programming facilities, and declarative input/output. Escher also has a collection of system modules, providing numerous operations on standard data types such as integers, lists, characters, strings, sets, and programs. The main design aim is to combine in a practical and comprehensive way the best ideas of existing functional and logic languages, such as Godel, Haskell, and $\lambda$Prolog. Indeed, Escher goes well beyond Godel in its ability to allow function definitions, its higher-order facilities, its improved handling of sets, and its declarative input/output. Escher also goes well beyond Haskell in its ability to run partly-instantiated predicate calls, a familiar feature of logic programming languages which provides a form of non-determinism, and its more flexible handling of equality. The language also has a clean semantics, its underlying logic being (an extension of) Church''s simple theory of types. This report is divided into two parts. The first part provides a tutorial introduction to Escher. In this part there are many example programs to illustrate the various language features. In particular, these example programs are meant to emphasize the significant practical advantages that come from integrating the best features of existing functional and logic languages. The second part contains a formal definition of the Escher language, including its syntax, semantics, and a description of its system modules. To make the report self-contained, an appendix summarizes the key aspects of the simple theory of types.

[1]  Dale A. Miller,et al.  AN OVERVIEW OF PROLOG , 1988 .

[2]  Ehud Shapiro,et al.  Algorithmic Program Debugging , 1983 .

[3]  Michael Hanus,et al.  The Integration of Functions into Logic Programming: From Theory to Practice , 1994, J. Log. Program..

[4]  Simon L. Peyton Jones,et al.  Lazy functional state threads , 1994, PLDI '94.

[5]  Jean-Pierre Jouannaud,et al.  Rewrite Systems , 1991, Handbook of Theoretical Computer Science, Volume B: Formal Models and Sematics.

[6]  Corin A. Gurr,et al.  A self-applicable partial evaluator for the logic programming language Goedel , 1994 .

[7]  Peter B. Andrews An introduction to mathematical logic and type theory - to truth through proof , 1986, Computer science and applied mathematics.

[8]  Justin Zobel,et al.  Nu-prolog reference manual , 1990 .

[9]  Uday S. Reddy,et al.  Imperative functional programming , 1996, CSUR.

[10]  Alonzo Church,et al.  A formulation of the simple theory of types , 1940, Journal of Symbolic Logic.

[11]  J. Lambek,et al.  Introduction to higher order categorical logic , 1986 .

[12]  Lee Naish,et al.  Higher-order logic programming , 1996 .

[13]  Leon Henkin,et al.  Completeness in the theory of types , 1950, Journal of Symbolic Logic.

[14]  Simon L. Peyton Jones,et al.  SIGPLAN Notices Special Issue on the Functional Programming Language Haskell , 1992, ACM SIGPLAN Notices.

[15]  G. Nadathur A higher-order logic as the basis for logic programming , 1987 .

[16]  Pieter Koopman,et al.  Functional programs as executable specifications , 1990 .

[17]  David A. Wolfram,et al.  The Clausal Theory of Types , 1993 .

[18]  M. F.,et al.  Bibliography , 1985, Experimental Gerontology.

[19]  J. Lloyd Foundations of Logic Programming , 1984, Symbolic Computation.

[20]  Wolfgang Thomas,et al.  Handbook of Theoretical Computer Science, Volume B: Formal Models and Semantics , 1990 .

[21]  Philip Wadler,et al.  The essence of functional programming , 1992, POPL '92.