  The semantics and the recursive execution model of Prolog make it very
natural to express language interpreters in form of AST (Abstract Syntax Tree)
interpreters where the execution follows the tree representation of a program.
An alternative implementation technique is that of bytecode interpreters. These
interpreters transform the program into a compact and linear representation
before evaluating it and are generally considered to be faster and to make
better use of resources.
  In this paper, we discuss different ways to express the control flow of
interpreters in Prolog and present several implementations of AST and bytecode
interpreters. On a simple language designed for this purpose, we evaluate
whether techniques best known from imperative languages are applicable in
Prolog and how well they perform. Our ultimate goal is to assess which
interpreter design in Prolog is the most efficient, as we intend to apply these
results to a more complex language. However, we believe the analysis in this
paper to be of more general interest.
