%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%    Uso setof/3
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% raggiungibili(G,Inizio,R): vero se G e' un grafo ed
% R e' l'insieme di tutti i nodi di G raggiungibili 
% tramite un cammino uscente dal nodo Inizio
% (n.b., R e' rappresentato come una lista di termini
% senza ripetizioni)

raggiungibili(G,Inizio,R) :-
     setof(X,camm(G,Inizio,X),R).

camm(G,X,Y) :-
    member([X,Y],G).
camm(G,X,Y) :-
    member([X,Z],G),
    camm(G,Z,Y).


% Goal d'esempio
%
% ?- raggiungibili([[a,b],[a,c],[c,b],[b,d],[c,d]],a,R).
% R = [b, c, d]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% allpairs(S,Pairs): vero se S e' una lista di termini
% e Pairs e' l'insieme di tutte le coppie [X,Y] tali che
% X ed Y appartengono ad S e X e' diverso da Y,
% ovvero, S = {[X,Y] : X in S and Y in S and X \== Y}

allpairs(S,Pairs) :-
    setof([X,Y], (member(X,S),member(Y,S),X \== Y), Pairs).

% Goal d'esempio
%
% ?- allpairs([1,2,3],S).
% S = [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
