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 68 69 70 71 72 73
|
/*-------------------------------------------------------------------------*/
/* Benchmark (Finite Domain) */
/* */
/* Name : crypta.pl */
/* Title : crypt-arithmetic */
/* Original Source: P. Van Hentenryck's book */
/* Adapted by : Daniel Diaz for GNU Prolog */
/* Date : September 1992 */
/* */
/* Solve the operation: */
/* */
/* B A I J J A J I I A H F C F E B B J E A */
/* + D H F G A B C D I D B I F F A G F E J E */
/* ----------------------------------------- */
/* = G J E G A C D D H F A F J B F I H E E F */
/* */
/* Solution: */
/* [A,B,C,D,E,F,G,H,I,J] */
/* [1,2,3,4,5,6,7,8,9,0] */
/*-------------------------------------------------------------------------*/
q :-
get_fd_labeling(Lab),
statistics(runtime, _),
crypta(Lab, LD),
statistics(runtime, [_, Y]),
write(LD),
nl,
write('time : '),
write(Y),
nl.
crypta(Lab, LD) :-
fd_set_vector_max(9),
LD = [A, B, C, D, E, F, G, H, I, J],
fd_domain(LD, 0, 9),
fd_domain([Sr1, Sr2], 0, 1),
fd_domain([B, D, G], 1, 9),
fd_all_different(LD),
A + 10 * E + 100 * J + 1000 * B + 10000 * B + 100000 * E + 1000000 * F + E + 10 * J + 100 * E + 1000 * F + 10000 * G + 100000 * A + 1000000 * F #= F + 10 * E + 100 * E + 1000 * H + 10000 * I + 100000 * F + 1000000 * B + 10000000 * Sr1,
C + 10 * F + 100 * H + 1000 * A + 10000 * I + 100000 * I + 1000000 * J + F + 10 * I + 100 * B + 1000 * D + 10000 * I + 100000 * D + 1000000 * C + Sr1 #= J + 10 * F + 100 * A + 1000 * F + 10000 * H + 100000 * D + 1000000 * D + 10000000 * Sr2,
A + 10 * J + 100 * J + 1000 * I + 10000 * A + 100000 * B + B + 10 * A + 100 * G + 1000 * F + 10000 * H + 100000 * D + Sr2 #= C + 10 * A + 100 * G + 1000 * E + 10000 * J + 100000 * G,
lab(Lab, LD).
lab(normal, L) :-
fd_labeling(L).
lab(ff, L) :-
fd_labelingff(L).
get_fd_labeling(Lab) :-
argument_counter(C),
get_labeling1(C, Lab).
get_labeling1(1, normal).
get_labeling1(2, Lab) :-
argument_value(1, Lab).
:- initialization(q).
|