Schelog is an embedding of Prolog-style logic programming in Scheme. “Embedding” means you don’t lose Scheme: You can use Prolog-style and conventional Scheme code fragments alongside each other. Schelog contains the full repertoire of Prolog features, including meta-logical and second-order (“set”) predicates, leaving out only those features that could more easily and more efficiently be done with Scheme subexpressions.
The Schelog implementation uses the approach to logic
programming described in Felleisen [4] and
Haynes [8]. In contrast to earlier Lisp simulations of
Prolog [3],
which used explicit continuation
arguments to store failure (backtrack) information, the
Felleisen and Haynes model uses the implicit reified
continuations of Scheme as provided by the operator
call‑with‑current‑continuation
(aka call/cc
). This
allows Schelog to be an embedding, ie, logic
programming is not built as a new language on top of Scheme,
but is used alongside Scheme’s other features. Both styles
of programming may be mixed to any extent that a project
needs.
The Schelog user does not need to know about the
implementation mechanism or about call/cc
and
continuations to get on with the business of
doing logic programming with Schelog.
This text is a gentle introduction to Schelog syntax and programming. It assumes a working knowledge of Scheme and an awareness of, if not actual programming experience with, Prolog. If you need assistance in either language, you may consult [1, 5, 6, 7, 9, 11] for Scheme, and [2, 10, 12] for Prolog. There are doubtless many other excellent books and online documents available.
2 Predicates
2.1 Predicates Introducing Facts
2.2 Predicates with Rules
2.3 Solving Goals
2.3.1 A Note on #f vs ()
2.4 Asserting Extra Clauses
2.5 Local Variables
3 Using Conventional Scheme Expressions in Schelog
3.1 Constructors
3.2 %is
3.3 Lexical Scoping
3.4 Type Predicates
5 Unification
5.1 The Occurs Check
6 Conjuctions and Disjunctions
7 Manipulating Logic Variables
7.1 Checking for Variables
7.2 Preserving Variables
8 The Cut (!)
8.1 Conditional Goals
8.2 Negation as Failure
10 Glossary of Schelog Primitives