Node:Last Call Optimization, Next:Building and Dismantling Terms, Previous:The Determinacy Checker, Up:Writing Efficient Programs
Another important efficiency feature of SICStus 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.