13.1 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 database 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.