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 38 39 40 41 42 43 44 45 46 47
| voisins(X, Y) :-
voisin(X, Y); voisin(Y, X).
% V : ville dont on recherche les voisins
% LV : liste des villes voisines (1 ou 2)
tous_les_voisins(V, LV) :-
bagof(Y, voisins(V, Y), LV).
% prédicat initial de recherche des voisins
liste_voisins(X, L) :-
proche_voisin(X, [X], L).
% X : ville à visiter
% LstV : liste des villes déjà visitée
% LFV : liste finale des voisins
proche_voisin(X, LstV, LFV) :-
tous_les_voisins(X, L1),
% L1 est composée d'une liste de 1 ou 2 villes
etude(L1, LstV, [], LFV).
% LstV : liste des villes déjà visitée
% LV : liste des voisins en construction
% LFV : liste finale des voisins
etude([V1 | T], LstV, LV, LFV) :-
% ville déjà visitée
% on passe à la suite
member(V1, LstV), !,
etude(T, LstV, LV, LFV).
etude([V1 | T], LstV, LV, LFV) :-
% V1 est une ville acceptable
% on l'ajoute à la liste des voisins en construction
append(LV, [V1], LV1),
% on etudie le reste de la liste
etude(T, [V1 | LstV], LV, LFV1),
% on va chercher la liste des voisins de V1
proche_voisin(V1, [V1 | LstV], LFV2),
% on concatène dans l'ordre les villes visitées
append(LV1, LFV1, LFV3),
append(LFV3, LFV2, LFV).
% la liste est vide
% on unifie la liste des voisins en construction
% à la la liste finale
etude([], _LstV, LV, LV). |
Partager