findall(X,P,L) :- asserta(found([])), call(P), rec(X), fail. findall(X,P,L) :- retract(found(L)),!. rec(X) :- retract(found(L)),!, append(L,[X],L1), asserta(found(L1)). append([],X,X). append([X|L1],L2,[X|L3]) :- append(L1,L2,L3).