/* 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