:- module(_,_). 

% Meta-calls: aggregation predicates 
% ----------------------------------
% Examples of setof/3, bagof/3, findall/3


% Try (asking for more solutions):
% ?- findall(X, member(X,[d,a,b,c,b,d]), L).
% ?- setof(X, member(X,[d,a,b,c,b,d]), L).
% ?- bagof(X, member(X,[d,a,b,c,b,d]), L).
% ?- findall(X, (member(X,[d,a,b,c,b,d]), X @< c), L).

likes(bill,  cider).
likes(dick,  beer).
likes(tom,   beer).
likes(tom,   beer).
likes(tom,   cider).
likes(harry, beer).
likes(jan,   cider).

% Try (asking for more solutions):
% ?- findall(X, likes(X,Y), S).
% ?- findall(X, likes(X,water),S).
%    (empty list)
%
% ?- setof(X, likes(X,Y), S).
% ?- setof(X, Y^likes(X,Y), S).
% ?- setof(X, likes(X,water), S).
% 
% ?- bagof(X, likes(X,Y), S).
% ?- bagof(X, Y^likes(X,Y), S).
% ?- bagof(X, likes(X,water),S).
%    (fails)
% 
% Using a term in the first argument: 
% ?- findall( Y-L ,  setof(X,likes(X,Y),L),  Pairs).
% ?- findall(beer_lover(X), likes(X,beer), S).

% Another setof/3 example: 

subset([],[]).
subset([X|Xs],[X|Ys]) :-
    subset(Xs,Ys).
subset([_|Xs],Ys) :-
    subset(Xs,Ys).

powerset(Set,Pset) :-
    setof(X,subset(Set,X),Pset).

% Try (asking for more solutions):
% ?- subset([1,2,3],S).
% ?- powerset([1,2,3],Pset).
