%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%  Programma per la ricerca di cammini su un grafo
%  diretto aciclico.
%  Un grafo G e' rappresentato come una lista di coppie
%  [X,Y], dove X e Y sono nodi di G, e [X,Y] appartiene 
%  a G sse esiste un arco tra X e Y
% 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


% camm(G,X,Y): vero se esiste nel grafo G un cammino  
% dal nodo X al nodo Y

camm(G,X,Y) :-
    member([X,Y],G).
camm(G,X,Y) :-
    member([X,Z],G),
    camm(G,Z,Y).

% Un grafo d'esempio

grafo(1,[[a,b],[a,c],[c,b],[b,d],[c,d]]).

% Goal d'esempio
%
% ?- camm([[a,b],[a,c],[c,b],[b,d],[c,d]],a,d).
% yes
%
% ?- grafo(1,G), camm(G,c,X).
% X = b;
% X = d;
% X = d;
% no
%
% ?- grafo(1,G), camm(G,X,b).
% X = a;
% X = c;
% X = a;
% no

