pre(ProgIn,ProgOut) :- transform(ProgIn,[],ProgOut). transform([],Preds,PredCalls) :- sort(Preds,UniquePreds), makepredcalls(UniquePreds,PredCalls). transform([(Head :- Body)|RestProgIn],Preds,[NewClause|RestProgOut]) :- functor(Head,Name,Arity), NewPreds = [Name/Arity | Preds], NewClause = (my_pred(Head) :- Body), transform(RestProgIn,NewPreds,RestProgOut). makepredcalls([],[]). makepredcalls([Name/Arity|R],[(Head :- my_pred(Head))|S]) :- functor(Head,Name,Arity), makepredcalls(R,S).