File: multipl.pl

package info (click to toggle)
gprolog 1.4.5.0-3
  • links: PTS
  • area: main
  • in suites: bookworm, bullseye, sid, trixie
  • size: 7,924 kB
  • sloc: ansic: 55,584; perl: 18,501; sh: 3,401; makefile: 1,114; asm: 20
file content (100 lines) | stat: -rw-r--r-- 3,397 bytes parent folder | download
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).