|
% Data una lista di liste ritorna la sottolista più corta
% Questo programma l''ho utilizzato in un grafo per ricercare il percorso più breve (tra quelli possibili).
% Track mi indica tutti i percorsi (evitando le ripetizioni e cicli infiniti)
% Per utilizzare questo programma bisogna definire prima tutti gli edge(a, b) ovvero tutti gli archi drl grafo; a e b sono i nodi.
track(X, X, [X], _).
track(X, Y, [X, Y], _) :- edge(X, Y).
track(X, Y, [X|Path], V) :-
edge(X, Z),
not(member(Z, V)),
track(Z, Y, Path, [X|V]).
% È il funtore da richiamare secondo questa sintassi
% ?- bestTrack(nodoIniziale, nodoFinale, L, []).
% L''unica variabile è L
bestTrack(X, Y, L, V) :-
findall(A, track(X, Y, A, V), L1),
scorriLista(L1, L, _).
scorriLista([M], L, C) :-
L = M,
length(M, C).
scorriLista([M1|T], L, C) :-
length(M1, C1),
scorriLista(T, M2, C2),
newShortest(M1, C1, M2, C2, L, C).
% Mi indica la lista più corta
newShortest(_, N1, M, N, L, C) :-
N1>N,
L = M,
C = N.
newShortest(L1, N1, _, N, L, C) :-
N >= N1,
L = L1,
C = N1.
|
|