1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
arc(1,2,5). arc(2,3,6). arc(3,4,8).
arc(1,3,10). arc(2,4,7).
arc(1,4,3).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
lireArc(X,Y,L) :- arc(X,Y,L).
lireArc(X,Y,L) :- arc(Y,X,L).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
minimum(X, Y, X) :- X < Y, !.
minimum(_, Y, Y). %sinon
minimum(D,[D]). % pour les liste
minimum(X,[A|B]):- minimum(Y,B),minimum(A,Y,R),X is R.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
app(X,[X|_]). % appartenance à une liste
app(X,[_|L]) :- app(X,L).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
vdc(Depart,Chemin) :-
findall(Cout,lireArc(Depart,_,Cout),L1), % liste les coûts en partant de Départ
minimum(Min,L1), % trouve le minimum des coûts
nth0(M,L1,Min), % trouve l'index du minimum dans la liste
findall(Z,lireArc(Depart,Z,_),L2), % recherche les sommets liés à Départ
nth0(M,L2,SommetRetenu), % trouve le numéro du sommet trouvé
not(app(SommetRetenu,Chemin)),
vdc(SommetRetenu,SuiteDuChemin),
Chemin is [SommetRetenu|SuiteDuChemin]. |
Partager