
findall(X, P, _) :-
	asserta(bag(mark)),
	P,
	asserta(bag(X)),
	fail.
findall(_, _, L) :- collect_bag([], M), !, L = M.

collect_bag(S, L) :-
	getnext(X), !,
	collect_bag([X|S], L).
collect_bag(L, L).

getnext(X) :-
	retract(bag(X)),
	X /= mark.
