mysetof(X,P,S) :- mysetof(X,P,[],S), !.mysetof(X,P,ACC,ACC) :- not(new_element(X,P,ACC)), !.mysetof(X,P,ACC,S) :- subst(X,Y,P,Q), new_element(X,P,ACC), append(ACC,[X],ACC1), mysetof(Y,Q,ACC1,S).new_element(X,P,S) :- call(P), not(member(X,S)).subst(_,_,P,P) :- atomic(P), !.subst(X,Y,P,Y) :- P == X, !.subst(_,_,P,P) :- var(P), !.subst(X,Y,P,Q) :- P =.. [PFUN|PARG], subst_list(X,Y,PARG,QARG), Q =.. [PFUN|QARG].subst_list(_,_,[],[]).subst_list(X,Y,[PH|PTAIL],[QH|QTAIL]) :- subst(X,Y,PH,QH), subst_list(X,Y,PTAIL,QTAIL).not(P) :- call(P), !, fail.not(_).member(X,[X|_]).member(X,[_|T]) :- member(X,T).append([],L,L).append([H|TAIL],L2,[H|NEWTAIL]) :- append(TAIL,L2,NEWTAIL).p(0).p(1).p(2).p(0).p(2).p(3).