/*
 * ej-03-07.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,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] ] ] ).

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

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

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

visita_nodo(Camino, Nodo, [Vertices,Aristas]) :-
	member(Nodo, Vertices),
	genero_lista_aristas(Aristas, ListaAristas),
	aplano_aristas(ListaAristas, Camino),
	member(Nodo, Camino).

genero_lista_aristas(Aristas, ListaAristas) :-
	sublist(X, Aristas),
	permutation(X, ListaAristas),
	aristas_en_secuencia(ListaAristas).


aristas_en_secuencia( [[_,_]] ).

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


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

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


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