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