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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
/*-------------------------------------------------------------------------*/
/* Benchmark (Finite Domain) */
/* */
/* Name : multipl.pl */
/* Title : unknown multiplication */
/* Original Source: Daniel Diaz - INRIA France */
/* Adapted by : Daniel Diaz for GNU Prolog */
/* Date : June 1995 */
/* */
/* Find the value of each digit verifying the following multiplication and */
/* such that each digit (0,1,...,9) appears excatly twice: */
/* */
/* X1 X2 X3 */
/* * X4 X5 X6 */
/* ----------- */
/* X7 X8 X9 */
/* + X10 X11 X12 */
/* + X13 X14 X15 */
/* = ------------------- */
/* X16 X17 X18 X19 X20 */
/* */
/* Solution: */
/* [X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20]*/
/* [ 1, 7, 9, 2, 2, 4, 7, 1, 6, 3, 5, 8, 3, 5, 8, 4, 0, 0, 9, 6]*/
/*-------------------------------------------------------------------------*/
q :-
get_fd_labeling(Lab),
statistics(runtime, _),
mult(Lab, LD),
statistics(runtime, [_, Y]),
write(LD),
nl,
write('time : '),
write(Y),
nl.
mult(Lab, LD) :-
fd_set_vector_max(9),
LD = [X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20],
fd_domain(LD, 0, 9),
fd_atmost(2, LD, 0),
fd_atmost(2, LD, 1),
fd_atmost(2, LD, 2),
fd_atmost(2, LD, 3),
fd_atmost(2, LD, 4),
fd_atmost(2, LD, 5),
fd_atmost(2, LD, 6),
fd_atmost(2, LD, 7),
fd_atmost(2, LD, 8),
fd_atmost(2, LD, 9),
/* This is much slower...
fd_exactly(2,LD,0),
fd_exactly(2,LD,1),
fd_exactly(2,LD,2),
fd_exactly(2,LD,3),
fd_exactly(2,LD,4),
fd_exactly(2,LD,5),
fd_exactly(2,LD,6),
fd_exactly(2,LD,7),
fd_exactly(2,LD,8),
fd_exactly(2,LD,9),
*/
Y #= 100 * X1 + 10 * X2 + X3,
Z1 #= 100 * X7 + 10 * X8 + X9,
Z2 #= 100 * X10 + 10 * X11 + X12,
Z3 #= 100 * X13 + 10 * X14 + X15,
X6 * Y #= Z1,
X5 * Y #= Z2,
X4 * Y #= Z3,
100 * X7 + 10 * X8 + X9 + 1000 * X10 + 100 * X11 + 10 * X12 + 10000 * X13 + 1000 * X14 + 100 * X15 #= 10000 * X16 + 1000 * X17 + 100 * X18 + 10 * X19 + X20,
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).
|