Overview
This chapter gives a number of tips on how to organize your programs for
increased efficiency.
A lot of clarity and efficiency is gained by sticking to a few basic
rules. This list is necessarily very incomplete. The reader is
referred to textbooks such as [O'Keefe 90] for a thorough exposition of
the elements of Prolog programming style and techniques.
- Don't write code in the first place if there is a library predicate that
will do the job.
- Write clauses representing base case before clauses representing recursive
cases.
- Input arguments before output arguments in clause heads and goals.
- Use pure data structures instead of data base changes.
- Use cuts sparingly, and only at proper places (see Cut). A
cut should be placed at the exact point that it is known that the
current choice is the correct one: no sooner, no later.
- Make cuts as local in their effect as possible. If a predicate is
intended to be determinate, define it as such; do not rely on
its callers to prevent unintended backtracking.
- Binding output arguments before a cut is a common source of programming
errors, so don't do it.
- Replace cuts by if-then-else constructs if the test is simple enough
(see Conditionals and Disjunction).
- Use disjunctions sparingly, always put parentheses around
them, never put parentheses around the individual disjuncts,
never put the
;
at the end of a line.
- Write the clauses of a predicate so that
they discriminate on the principal functor of the first argument (see
below). For maximum efficiency, avoid "defaulty" programming
("catch-all" clauses).
- Don't use lists (
[...]
), "round lists" ((...)
), or
braces ({...}
) to represent compound terms, or "tuples", of
some fixed arity. The name of a compound term comes for free.