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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| :- use_module(library(clpfd)).
parcours :-
Etapes= [[(rouge, 10), (vert, 15), bleu(20)],
[(vert,12), (rouge,12), (bleu, 15), (jaune, 17)],
[(vert, 12), (rouge, 14)],
[(bleu, 17), (jaune, 10), (vert, 8)]],
length(Etapes, L),
length(Poids, L),
% on donne une limite aux poids
Poids ins 0..100,
maplist(etudie, Etapes, Couleur, Poids),
[NB, NJ, NR, NV] ins 0..4,
% on totalise les couleurs
total(Couleur, 0, 0, 0, 0, NB, NJ, NR, NV),
% on calcule la longueur du parcours
sum(Poids, #=, Len),
% on veut deux bleux
NB #= 2,
% on ne veut pas de vert
NV #= 0,
% on calcule pour minimiser le parcours
labeling([min(Len)], [NB, NJ, NR, NV]),
maplist(affiche, Couleur),
nl,
writeln(Len).
etudie(Etape, R, N) :-
member((C, N), Etape),
test(C, R).
test(C, R) :-
C = bleu, R = [1,0,0,0];
C = jaune, R = [0,1,0,0];
C = rouge, R = [0,0,1,0];
C = vert, R = [0,0,0,1].
total([], B, J, R, V, B, J, R, V).
total([[NB, NJ, NR, NV]|T], B1, J1, R1, V1, B, J, R, V) :-
B2 #= B1 + NB,
J2 #= J1 + NJ,
R2 #= R1 + NR,
V2 #= V1 + NV,
total(T, B2, J2, R2, V2, B, J, R, V).
affiche([1,0,0,0]) :-
write('bleu ').
affiche([0,1,0,0]) :-
write('jaune ').
affiche([0,0,1,0]) :-
write('rouge ').
affiche([0,0,0,1]) :-
write('vert '). |
Partager