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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% ECLiPSe module for solving Crossfigure Puzzle #9, from Thinks.com.
%
% This module written by Warwick Harvey, IC-Parc, wh@icparc.ic.ac.uk.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
:- module(cf009).
 
:- export cf009/1.
 
:- lib(fd).
:- use_module(crossfig).
 
%
% cf009(M):
%   Top-level goal for solving the puzzle.
%
 
cf009(M) :-
    constrain(M, Vars),
    labeling(Vars),
    print_matrix(M).
 
 
constrain(M, MVars) :-
    dim(M, [9, 9]),
    dim(T, [9, 9]),
 
 
    % Set up the constraints between the matrix elements and the
    % clue numbers.
 
    across(M, T, A1, 2, 1, 1),
    across(M, T, A3, 3, 1, 4),
    across(M, T, A5, 2, 1, 8),
    across(M, T, A7, 4, 2, 1),
    across(M, T, A8, 4, 2, 6),
    across(M, T, A9, 3, 3, 4),
    across(M, T, A11, 3, 4, 1),
    across(M, T, A13, 3, 4, 7),
    across(M, T, A15, 2, 5, 3),
    across(M, T, A16, 2, 5, 6),
    across(M, T, A17, 3, 6, 1),
    across(M, T, A20, 3, 6, 7),
    across(M, T, A22, 3, 7, 4),
    across(M, T, A24, 4, 8, 1),
    across(M, T, A25, 4, 8, 6),
    across(M, T, A27, 2, 9, 1),
    across(M, T, A28, 3, 9, 4),
    across(M, T, A29, 2, 9, 8),
 
    down(M, T, D1, 2, 1, 1),
    down(M, T, D2, 4, 1, 2),
    down(M, T, D3, 3, 1, 4),
    down(M, T, D4, 3, 1, 6),
    down(M, T, D5, 4, 1, 8),
    down(M, T, D6, 2, 1, 9),
    down(M, T, D10, 2, 3, 5),
    down(M, T, D11, 3, 4, 1),
    down(M, T, D12, 3, 4, 3),
    down(M, T, D13, 3, 4, 7),
    down(M, T, D14, 3, 4, 9),
    down(M, T, D18, 4, 6, 2),
    down(M, T, D19, 2, 6, 5),
    down(M, T, D21, 4, 6, 8),
    down(M, T, D22, 3, 7, 4),
    down(M, T, D23, 3, 7, 6),
    down(M, T, D24, 2, 8, 1),
    down(M, T, D26, 2, 8, 9),
 
    init_matrix(M, T, MVars),
 
    % Make a nice graphical display of the search if the user is
    % using TkECLiPSe.
    make_display_matrix(M, matrix),
 
 
    % Set up the clue constraints.
 
    /*
    Across
 
     1 20 across divided by twelve
     3 Four times 19 down
     5 29 across minus nine
     7 A square number
     8 9 across times 6 down
     9 10 down times six
    11 8 across divided by nine
    13 11 down minus twelve
    15 6 down plus nineteen
    16 A prime number
    17 13 down minus twenty-seven
    20 14 down plus ninety
    22 17 across minus twenty-five
    24 8 across minus 648
    25 5 down minus 287
    27 16 across minus forty-seven
    28 Eight times 15 across
    29 24 down minus thirty
    */
 
    A1 #= A20 / 12,
    A3 #= 4 * D19,
    A5 #= A29 - 9,
    square(A7),
    A8 #= A9 * D6,
    A9 #= 6 * D10,
    A11 #= A8 / 9,
    A13 #= D11 - 12,
    A15 #= D6 + 19,
    prime(A16),
    A17 #= D13 - 27,
    A20 #= D14 + 90,
    A22 #= A17 - 25,
    A24 #= A8 - 648,
    A25 #= D5 - 287,
    A27 #= A16 - 47,
    A28 #= 8 * A15,
    A29 #= D24 - 30,
 
    /*
    Down
 
     1 26 down minus twenty-one
     2 8 across plus 212
     3 28 across minus 198
     4 22 across minus forty
     5 18 down minus 575
     6 A square number
    10 A prime number
    11 11 across minus fifteen
    12 Eleven times 10 down
    13 13 across plus twenty-one
    14 8 across divided by twelve
    18 Five times 7 across
    19 Two times 6 down
    21 Five times 12 down
    22 8 across divided by nine
    23 18 down divided by eight
    24 9 across divided by three
    26 Two times 10 down
    */
 
    D1 #= D26 - 21,
    D2 #= A8 + 212,
    D3 #= A28 - 198,
    D4 #= A22 - 40,
    D5 #= D18 - 575,
    square(D6),
    prime(D10),
    D11 #= A11 - 15,
    D12 #= 11 * D10,
    D13 #= A13 + 21,
    D14 #= A8 / 12,
    D18 #= 5 * A7,
    D19 #= 2 * D6,
    D21 #= 5 * D12,
    D22 #= A8 / 9,
    D23 #= D18 / 8,
    D24 #= A9 / 3,
    D26 #= 2 * D10.