/*
 * ej-03-08.pl
 *
 */

/*
 * generaGrafo/3
 *
 * generaGrafo(Original, Resultado, LongitudDeCamino)
 */

generaGrafo(grafo(Nodos, Aristas1), grafo(Nodos, Aristas2), K) :-
	genera_todas_aristas(Nodos, grafo(Nodos, Aristas1), Aristas2, K).


camino_longitud_dada(DesdeNodo, HastaNodo, N, Grafo) :-
	arista(DesdeNodo, OtroNodo, Grafo),
	K is N - 1,
	camino_longitud_dada( OtroNodo, HastaNodo, K, Grafo).


arista(Desde, Hasta, grafo(_Nodos, Aristas)) :-
	member( [Desde, Hasta], Aristas ).

arista(Desde, Hasta, grafo(_Nodos, Aristas)) :-
	member( [Hasta, Desde], Aristas ).



/*
 * genera_todas_aristas(Nodos, Grafo, ListaAristas, LongitudDeCamino)
*/

genera_todas_aristas( []. _Grafo, _ListaAristas, _LongitudDeCamino).

genera_todas_aristas( [N|Ns], G, A, K ) :-
	genera_aristas_nodo(N, Ns, G, An, K),
	genera_todas_aristas(Ns, G, As, K),
	append(An, As, A).


/*
 * genera_aristas_nodo(Nodo, OtrosNodos, Grafo, Aristas, K)
*/

genera_aristas_nodo( _NodoActual, [], _Grafo, [], _LongCamino).

genera_aristas_nodo(N1, [N2|Ns], G, [[N1,N2]|As], K) :-
	camino_longitud_dada(N1, N2, K, G), !,
	genera_aristas_nodo(N1, Ns, G, As, K).

genera_aristas_nodo(N1, [_N2|Ns], G, A, K) :-
	genera_aristas_nodo(N1, Ns, G, A, K).

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