Bonjour !!

Je tente de programmer l'algorithme du voyageur de commerce.
J'ai des difficultés en prolog, notamment pour écrire tous les prédicats de début et de fin (cas limites).

Voici mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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].
Je suppose qu'il manque les prédicats de condition de début et de fin, mais je ne vois pas comment les écrire dans ce cas là.
De plus, vdc est récursif et comme mon graphe n'est pas orienté, il faut que je m'assure de ne pas repasser 2 fois par un même sommet. Je pense que c'est la structure de mon code qui ne va pas.

Qu'en pensez-vous?

Merci beaucoup.