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
| tuple_possible( [Y1,Y2,Y3,Y4]) :-
% je définis les différents ensembles
E0 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],
E1 = [1,2,3,4,5,6,7,8,12,15,17,18,20],
E2 = [1,2,3,4,5,6,8,12,15,17,18,20],
E3 = [1,2,3,4,6,8,12,15,17,18],
E4 = [1,2,3,4,6,8,15,17,18],
% les 4 variables sont comprises entre 1 et 20
member(Y1,E0),
member(Y2,E0),
member(Y3,E0),
member(Y4,E0),
% Elles sont toutes différentes
% Pour éviter les solutions multiples, autant les ranger
Y1 < Y2, Y2 < Y3, Y3 < Y4,
( (member(Y1, E1), member(Y2, E1));
(member(Y1, E1), member(Y3, E1));
(member(Y1, E1), member(Y4, E1));
(member(Y2, E1), member(Y3, E1));
(member(Y2, E1), member(Y4, E1));
(member(Y3, E1), member(Y4, E1))),
( (member(Y1, E2), member(Y2, E2));
(member(Y1, E2), member(Y3, E2));
(member(Y1, E2), member(Y4, E2));
(member(Y2, E2), member(Y3, E2));
(member(Y2, E2), member(Y4, E2));
(member(Y3, E2), member(Y4, E2))),
( member(Y1, E3);
member(Y2, E3);
member(Y3, E3);
member(Y4, E3)),
% au moins deux n'appartiennent pas à E4
( (\+(member(Y1,E4)), \+(member(Y2,E4)));
(\+(member(Y1,E4)), \+(member(Y3,E4)));
(\+(member(Y1,E4)), \+(member(Y4,E4)));
(\+(member(Y2,E4)), \+(member(Y3,E4)));
(\+(member(Y2,E4)), \+(member(Y4,E4)));
(\+(member(Y3,E4)), \+(member(Y4,E4)))),
% au maximum 2 consecutifs
( ((1 is Y2-Y1), \+(1 is Y3-Y2), \+(1 is Y4-Y3));
(\+(1 is Y2-Y1), (1 is Y3-Y2), \+(1 is Y4-Y3));
(\+(1 is Y2-Y1), \+(1 is Y3-Y2), (1 is Y4-Y3));
(\+(1 is Y2-Y1), \+(1 is Y3-Y2), \+(1 is Y4-Y3))).
test :-
setof(Vars, tuple_possible(Vars), L),
length(L, N),
%writeln(L),
writeln(N). |
Partager