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).