/*
        preduce(Goal,Residue) :-
           Partially reduce Goal to leave the residue Residue.
*/
        preduce(true,true) :-  !.
        preduce((A,B),(PA,PB)) :-  !, preduce(A,PA), preduce(B,PB).
        preduce(A,B) :-  should_fold(A,B), !.
        preduce(A,Residue) :-
           should_unfold(A), !, clause(A,B), preduce(B,Residue).
        preduce(A,A).

%     Program 18.2: A meta-interpreter for determining a residue
