A bag is an anonymous object which can be used to store
information across failures.
A bag is unordered and untyped. Any ECLiPSe term can be stored in a bag.
Bags are referred to by a handle.
An empty bag is created using
bag_create/1,
data is stored in the bag by invoking
bag_enter/2,
and the stored data can be retrieved as a list with
bag_retrieve/2 or
bag_dissolve/2.
A typical application is the
implementation of the findall/3 predicate or similar functionality.
As opposed to the use of record/2 or assert/1, the solution using
bags is more efficient, more robust, and trivially reentrant.
simple_findall(Goal, Solutions) :-
bag_create(Bag),
(
call(Goal),
bag_enter(Bag, Goal),
fail
;
true
),
bag_dissolve(Bag, Solutions).