Can Logic Programming Execute as Fast as Imperative Programming?
Peter Lodewijk Van Roy
The purpose of this dissertation is to provide
constructive proof that the logic programming
language Prolog can be implemented an order of magnitude
more efficiently than the best previous systems,
so that its speed approaches imperative languages
such as C for a significant class of problems.
The driving force in the design is to encode
each occurrence of a general feature of Prolog
as simply as possible.
The resulting system, Aquarius Prolog,
is about five times faster than Quintus Prolog,
a high performance commercial system,
on a set of representative programs.
The design is based on the following ideas:
Because of limitations of the dataflow analysis,
the system is not yet competitive with the C language for all programs.
I outline the work that is needed to close the remaining gap.
- Reduce instruction granularity.
Use an execution model,
the Berkeley Abstract Machine (BAM),
that retains the good features
of the Warren Abstract Machine (WAM),
a standard execution model for Prolog,
but is more easily optimized
and closer to a real machine.
- Exploit determinism.
Compile deterministic programs with efficient conditional branches.
Most predicates written by human programmers are deterministic,
yet previous systems often compile them in an
inefficient manner by simulating conditional branching with backtracking.
- Specialize unification.
Compile unification to the simplest possible code.
Unification is a general pattern-matching operation that
can do many things in the implementation:
pass parameters, assign values to variables,
allocate memory, and do conditional branching.
- Dataflow analysis.
Derive type information by global dataflow analysis
to support these ideas.
Please send all comments to
Peter Van Roy.