/*
 * ej-03-07a.pl
 *
 * Defina en Prolog un predicado
 *
 *              visita_nodo(?Camino, ?Nodo, +Grafo)
 *
 * que sea exitoso cuando Camino sea una secuencia de nodos 
 * correspondiente a un camino en Grafo, tal que Camino pasa
 * por el nodo Nodo.
 * Elija una representación adecuada para Grafo y Camino.  El
 * predicado que defina podrá ser consultado con variables para
 * caminos y nodos.  Al definir cada predicado describa
 * *claramente* cuáles son cada uno de sus argumentos, indicando
 * tipo de término, su significado y estructura.
 */



grafo1( [ [a,c,d],
       [ [a,d],[a,c],[c,d] ] ] ).

grafo2( [ [a,b,c,d,h,m,t,w,x],
	          [ [a,m],[a,d],[a,c],[b,c],[b,h],[b,d],[c,d],[t,x],[w,x],
			           [h,t],[d,x] ] ] ).

grafo3( [ [a,b,c,d,h,m,t,w,x],
       [ [a,m],[a,d],[a,c],[b,c],[b,h],[b,d],[c,d],[t,x],[w,x] ] ] ).

prueba_1 :-
	grafo1(G), visita_nodo(Camino, a, G),
	write(Camino), nl, fail.

prueba_1 :-
	write('no hay más caminos.'), nl.

prueba_2 :-
	grafo1(G), visita_nodo(Camino, Nodo, G),
	write(Camino), write(' -> '), write(Nodo), nl, fail.


visita_nodo(Camino, Nodo, [Vertices,Aristas]) :-
	member(Nodo, Vertices),
	genero_lista_aristas_que_pasan_por_nodo(Nodo, Aristas, ListaAristas),
/* nl, write('>>> '), write(ListaAristas), write(' <<<'), nl, */
	aplano_aristas(ListaAristas, Camino),
	member(Nodo, Camino).

																				genero_lista_aristas_que_pasan_por_nodo(N, Aristas, ListaAristas) :-
	sublist(X, Aristas),
	( member([N,_], X) ; member([_,N], X) ),
	permutation(X, ListaAristas),
	aristas_en_secuencia(ListaAristas).


aristas_en_secuencia( [[_,_]] ).

aristas_en_secuencia( [[_,V2],[V2,V3]|As] ) :-
	aristas_en_secuencia( [[V2,V3]|As] ).

aristas_en_secuencia( [[_,V2],[V3,V2]|As] ) :-
	aristas_en_secuencia( [[V2,V3]|As] ).


aplano_aristas( [[V1,V2]], [V1,V2] ).

aplano_aristas( [[V1,V2],[V2,V3]|As], [V1|Vs] ) :-
        aplano_aristas( [[V2,V3]|As], Vs ).

aplano_aristas( [[V1,V2],[V3,V2]|As], [V1|Vs] ) :-
        aplano_aristas( [[V2,V3]|As], Vs ).


/* EOF ej-03-07a.pl */
