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
| puzzle(L) :-
% il y a dix nombres
L = [A,B,C,D,E,F,G,H,I,J],
% compris entre 0 et 9
L ins 0..9,
% tous différents
all_distinct(L),
% le premier est au maximum egal à 4
A #< 5,
% création des contraintes sur les arcs
my_max([A, B, D, F, A], 5),
my_max([B, C, E, B], 3),
my_max([D, B, E, G, D], 4),
my_max([F, D, H, I, F], 4),
my_max([D, G, H, D], 3),
my_max([G, E, C, J, G], 5),
my_max([I, H, G, J, I], 5),
% on calcule les possibilités
label(L).
my_max(L, Max) :-
calcule_max(Max, L, 0, 1).
make_max(Max, [A, B], R) :-
% au maximum la difference est Max
abs(A-B) #=< Max,
% R vaut 1 si la différence est égale à Max
% R vaut 0 sinon
abs(A-B) #= Max #<==> R.
% règle de fin
% S'il n'y a plus qu'un point,
% on unifie la valeur courante de R avec la valeur finale
calcule_max(_, [_], R, R).
% On parcours la liste des arcs
% on ajoute à chaque fois la valeur de R
% qui indique l'égaliré à Max
% Le prédicat a été lancé avec 0
% A la fin on doit avoir 1
% un seul arc doit avoir le maximum
calcule_max(Max, [A, B | T], R1, R) :-
% on calcule la valeur de R pour cet arc
make_max(Max, [A, B], R0),
R2 #= R1 + R0,
% on continue la boucle
calcule_max(Max, [B | T], R2, R). |
Partager