File: gardner.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 (122 lines) | stat: -rw-r--r-- 4,761 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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*-------------------------------------------------------------------------*/
/* Benchmark (Finite Domain)                                               */
/*                                                                         */
/* Name           : gardner.pl                                             */
/* Title          : Gardner's prime puzzle problem                         */
/* Original Source: Daniel Diaz - INRIA France                             */
/* Adapted by     : Daniel Diaz for GNU Prolog                             */
/* Date           : February 1997 - modified May 2007                      */
/*                                                                         */
/* Solve the operation:                                                    */
/*                                                                         */
/*        mP       where tP is a string of t prime digits (2,3,5 or 7)     */
/*   x    nP                                                               */
/*   --------                                                              */
/*   = (m+n)P                                                              */
/*                                                                         */
/* Solution:                                                               */
/*                                                                         */
/* M=1 N=1                                                                 */
/*     [5,5,25]                                                            */
/*     [5,7,35]                                                            */
/*     [7,5,35]                                                            */
/*                                                                         */
/* M=4 N=3                                                                 */
/*     [3235,735,2377725]                                                  */
/*     [3323,775,2575325]                                                  */
/*     [3535,773,2732555]                                                  */
/*     [3553,775,2753575]                                                  */
/*     [3555,725,2577375]                                                  */
/*     [3575,777,2777775]                                                  */
/*     [3735,733,2737755]                                                  */
/*     [3755,725,2722375]                                                  */
/*     [5225,527,2753575]                                                  */
/*     [7225,727,5252575]                                                  */
/*     [7253,325,2357225]                                                  */
/*     [7255,355,2575525]                                                  */
/*     [7273,375,2727375]                                                  */
/*     [7275,733,5332575]                                                  */
/*     [7325,373,2732225]                                                  */
/*     [7325,727,5325275]                                                  */
/*     [7335,753,5523255]                                                  */
/*     [7353,375,2757375]                                                  */
/*     [7355,725,5332375]                                                  */
/*     [7375,753,5553375]                                                  */
/*     [7533,335,2523555]                                                  */
/*     [7575,337,2552775]                                                  */
/*     [7735,333,2575755]                                                  */
/*     [7757,355,2753735]                                                  */
/*     [7777,325,2527525]                                                  */
/*-------------------------------------------------------------------------*/

q :-
	get_fd_labeling(Lab),
	write('M ?'),
	read_integer(M),
	write('N ?'),
	read_integer(N),
	statistics(runtime, _),
	(   gardner(M, N, L, Lab),
	    write(L),
	    nl,
	    fail
	;   true
	),
	statistics(runtime, [_, Y]),
	write('time : '),
	write(Y),
	nl.



gardner(M, N, L, Lab) :-
	MN is M + N,
	length(LX, M),
	length(LY, N),
	length(LZ, MN),
	nb(LX, X),
	nb(LY, Y),
	nb(LZ, Z),
	X * Y #= Z,
	L = [X, Y, Z],
	append(LX, LY, LXY),
	append(LXY, LZ, LXYZ),
	lab(Lab, LXYZ).



nb(LX, X) :-
	fd_domain(LX, [2, 3, 5, 7]),
	nb(LX, 0, X).

nb([], N, N).

nb([X|L], I, N) :-
	I1 #= X + I * 10,
	nb(L, I1, N).



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).