Overview
This section 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 The
Craft of Prolog by Richard O'Keefe, MIT Press, 1990, 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 database changes.
- Use cuts sparingly, and only at proper places.
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.
- Use disjunctions sparingly, always put parentheses around
them, never put parentheses around the individual disjuncts, and
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.