Another important efficiency feature of Quintus Prolog is last call optimization. This is a space optimization technique, which applies when a predicate is determinate at the point where it is about to call the last goal in the body of a clause. For example,
% for(Int, Lower, Upper) % Lower and Upper should be integers such that Lower =< Upper. % Int should be uninstantiated; it will be bound successively on % backtracking to Lower, Lower+1, ... Upper. for(Int, Int, _Upper). for(Int, Lower, Upper) :- Lower < Upper, Next is Lower + 1, for(Int, Next, Upper).
This predicate is determinate at the point where the recursive call is
about to be made, since this is the last clause and the preceding goals
(</2
and is/2
) are determinate. Thus last call
optimization can be applied; effectively, the stack space being used
for the current predicate call is reclaimed before the recursive call is
made. This means that this predicate uses only a constant amount of space,
no matter how deep the recursion.