% calcul d'un chemin le plus court dans un reseau algorithme de Dijkstra % % mindist(Etiquettes permanentes d'entree, % Etiquettes permanentes de sortie, % Etiquettes temporaires d'entree) mindist(Perms, Perms,[]). mindist([(N1,D1)|P1],P2,T1):- liste_des((N,Long),arc(N1,N,Long),Voisins), changer_les_voisins(Voisins,D1,T1,[(N2,D2)|T2]), mindist([(N2,D2),(N1,D1)|P1],P2,T2). % version de setof qui renvoie la liste vide au lieu d'echouer liste_des(A,B,C):-setof(A,B,C),!. liste_des(_,_,[]). % changer_les_voisins (Liste de couples (noeud,longueur), % distance de l'origine jusqu'ici, % etiquettes temporaires d'entree, % etiquettes temporaires de sortie) changer_les_voisins([],D,T,T). changer_les_voisins([(N1,L1)|V1],D,T1,T3):- D1 is D + L1, changer_un_voisin((N1,D1),T1,T2), changer_les_voisins(V1,D,T2,T3). % changer un voisin (Couple (noeud, distance de l'origine), % etiquettes temporaires d'entree, % etiquettes temporaires de sortie) changer_un_voisin(C,[],[]). changer_un_voisin((N,D),[(N1,D1)|T1],[(N,D)|T2]):- D