Como puede haber variables en Camino y/o Nodo, trataremos de emplear una estrategia de programación que no corte la posibilidad de que nuestro predicado *genere* soluciones, al estilo del append/3. No queda claro a partir del enunciado si Camino y Nodo pueden ser variables a la vez. Al parecer las diferentes formas de llamar a visita_nodo/3 serán: * visita_nodo(+Camino, +Nodo, +Grafo) * visita_nodo(?Camino, +Nodo, +Grafo) * visita_nodo(+Camino, ?Nodo, +Grafo) * visita_nodo(?Camino, ?Nodo, +Grafo) El Camino entonces debe cumplir con dos condiciones: a) Debe pasar por Nodo. b) Cada par de nodos consecutivos del Camino deben formar una arista del grafo. La representación que elegimos para el Camino será una lista de nodos. Para el grafo adoptaremos la representación de dos listas, la primera de vértices, y la segunda de aristas en forma de pares de vértices. Entonces se puede verificar a) mediante member/2 contra la lista de vértices. Y b) se verifica controlando que cada par de nodos pueda ser member/2 de la lista de aristas. 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( [[V1,V2]], [V2] ). aplano_aristas( [[V1,V2]|As], [V1|Vs] ) :- aplano_aristas( As, Vs ). Puedo hacer una optimización, que es generar una lista de aristas que ya pase por el nodo en cuestión. Esto complica un poco el código, que queda como sigue (ej-03-07a.pl): visita_nodo(Camino, Nodo, [Vertices,Aristas]) :- member(Nodo, Vertices), genero_lista_aristas_que_pasan_por_nodo(Nodo, Aristas, ListaAristas), 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). EOF ej-03-07.txt