/* BAGOF : bagof evaluable predicate

                                                 SYSTEM
                                                 Lawrence
                                                 Updated: 14 October 81
*/


                         % Simple minded bagof

bagof(X,P,_) :-
         recorda($bagof,$bagof,_),
         call(P),
         recorda($bagof,X,_),
         fail.

bagof(_,_,List) :-
         $collect_bag([],List).


$collect_bag(Sofar,Ans) :-
         $get_next(Next),
         !,
         $collect_bag([Next|Sofar],Ans).

$collect_bag(Ans,Ans).


$get_next(Next) :-
         recorded($bagof,Next,ID),
         erase(ID),
         !,
         Next \== $bagof.




