-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathqubic-final.pl
547 lines (469 loc) · 59.2 KB
/
qubic-final.pl
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Prolog Qubic alpha-beta expert
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
:- dynamic board/1.
init:-
retractall(board(_)),
assert(board([_Z1, _Z2, _Z3, _Z4,
_Z5, _Z6, _Z7, _Z8,
_Z9, _Z10, _Z11, _Z12,
_Z13, _Z14, _Z15, _Z16,
_Z17, _Z18, _Z19, _Z20,
_Z21, _Z22, _Z23, _Z24,
_Z25, _Z26, _Z27, _Z28,
_Z29, _Z30, _Z31, _Z32,
_Z33, _Z34, _Z35, _Z36,
_Z37, _Z38, _Z39, _Z40,
_Z41, _Z42, _Z43, _Z44,
_Z45, _Z46, _Z47, _Z48,
_Z49, _Z50, _Z51, _Z52,
_Z53, _Z54, _Z55, _Z56,
_Z57, _Z58, _Z59, _Z60,
_Z61, _Z62, _Z63, _Z64
])).
:- init.
%%%%%
%% Generate possible marks on a free spot on the board.
%% Use mark(+,+,-X,-Y,-Z) to query/generate possible moves (X,Y,Z).
%%%%%
mark(Player, [X|_],0,0,0) :- var(X), X=Player.
mark(Player, [_,X|_],0,1,0) :- var(X), X=Player.
mark(Player, [_,_,X|_],0,2,0) :- var(X), X=Player.
mark(Player, [_,_,_,X|_],0,3,0) :- var(X), X=Player.
mark(Player, [_,_,_,_,X|_],1,0,0) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,X|_],1,1,0) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,X|_],1,2,0) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,X|_],1,3,0) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,X|_],2,0,0) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,X|_],2,1,0) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,X|_],2,2,0) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,X|_],2,3,0) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,0,0) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,1,0) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,2,0) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,3,0) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],0,0,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],0,1,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],0,2,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],0,3,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],1,0,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],1,1,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],1,2,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],1,3,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],2,0,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],2,1,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],2,2,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],2,3,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,0,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,1,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,2,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,3,1) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],0,0,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],0,1,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],0,2,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],0,3,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],1,0,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],1,1,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],1,2,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],1,3,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],2,0,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],2,1,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],2,2,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],2,3,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,0,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,1,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,2,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,3,2) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],0,0,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],0,1,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],0,2,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],0,3,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],1,0,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],1,1,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],1,2,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],1,3,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],2,0,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],2,1,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],2,2,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],2,3,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,0,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,1,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,2,3) :- var(X), X=Player.
mark(Player, [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,X|_],3,3,3) :- var(X), X=Player.
%%%%%
%% Move
%%%%%
move(P,(0,0,0),[X1|R],[P|R]) :- var(X1).
move(P,(0,1,0),[X1,X2|R],[X1,P|R]) :- var(X2).
move(P,(0,2,0),[X1,X2,X3|R],[X1,X2,P|R]) :- var(X3).
move(P,(0,3,0),[X1,X2,X3,X4|R],[X1,X2,X3,P|R]) :- var(X4).
move(P,(1,0,0),[X1,X2,X3,X4,X5|R],[X1,X2,X3,X4,P|R]) :- var(X5).
move(P,(1,1,0),[X1,X2,X3,X4,X5,X6|R],[X1,X2,X3,X4,X5,P|R]) :- var(X6).
move(P,(1,2,0),[X1,X2,X3,X4,X5,X6,X7|R],[X1,X2,X3,X4,X5,X6,P|R]) :- var(X7).
move(P,(1,3,0),[X1,X2,X3,X4,X5,X6,X7,X8|R],[X1,X2,X3,X4,X5,X6,X7,P|R]) :- var(X8).
move(P,(2,0,0),[X1,X2,X3,X4,X5,X6,X7,X8,X9|R],[X1,X2,X3,X4,X5,X6,X7,X8,P|R]) :- var(X9).
move(P,(2,1,0),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,P|R]) :- var(X10).
move(P,(2,2,0),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,P|R]) :- var(X11).
move(P,(2,3,0),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,P|R]) :- var(X12).
move(P,(3,0,0),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,P|R]) :- var(X13).
move(P,(3,1,0),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,P|R]) :- var(X14).
move(P,(3,2,0),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,P|R]) :- var(X15).
move(P,(3,3,0),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,P|R]) :- var(X16).
move(P,(0,0,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,P|R]) :- var(X17).
move(P,(0,1,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,P|R]) :- var(X18).
move(P,(0,2,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,P|R]) :- var(X19).
move(P,(0,3,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,P|R]) :- var(X20).
move(P,(1,0,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,P|R]) :- var(X21).
move(P,(1,1,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,P|R]) :- var(X22).
move(P,(1,2,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,P|R]) :- var(X23).
move(P,(1,3,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,P|R]) :- var(X24).
move(P,(2,0,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,P|R]) :- var(X25).
move(P,(2,1,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,P|R]) :- var(X26).
move(P,(2,2,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,P|R]) :- var(X27).
move(P,(2,3,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,P|R]) :- var(X28).
move(P,(3,0,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,P|R]) :- var(X29).
move(P,(3,1,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,P|R]) :- var(X30).
move(P,(3,2,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,P|R]) :- var(X31).
move(P,(3,3,1),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,P|R]) :- var(X32).
move(P,(0,0,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,P|R]) :- var(X33).
move(P,(0,1,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,P|R]) :- var(X34).
move(P,(0,2,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,P|R]) :- var(X35).
move(P,(0,3,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,P|R]) :- var(X36).
move(P,(1,0,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,P|R]) :- var(X37).
move(P,(1,1,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,P|R]) :- var(X38).
move(P,(1,2,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,P|R]) :- var(X39).
move(P,(1,3,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,P|R]) :- var(X40).
move(P,(2,0,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,P|R]) :- var(X41).
move(P,(2,1,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,P|R]) :- var(X42).
move(P,(2,2,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,P|R]) :- var(X43).
move(P,(2,3,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,P|R]) :- var(X44).
move(P,(3,0,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,P|R]) :- var(X45).
move(P,(3,1,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,P|R]) :- var(X46).
move(P,(3,2,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,P|R]) :- var(X47).
move(P,(3,3,2),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,P|R]) :- var(X48).
move(P,(0,0,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,P|R]) :- var(X49).
move(P,(0,1,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,P|R]) :- var(X50).
move(P,(0,2,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,P|R]) :- var(X51).
move(P,(0,3,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,P|R]) :- var(X52).
move(P,(1,0,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,P|R]) :- var(X53).
move(P,(1,1,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,P|R]) :- var(X54).
move(P,(1,2,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,P|R]) :- var(X55).
move(P,(1,3,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,P|R]) :- var(X56).
move(P,(2,0,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,P|R]) :- var(X57).
move(P,(2,1,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,X58|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,P|R]) :- var(X58).
move(P,(2,2,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,X58,X59|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,X58,P|R]) :- var(X59).
move(P,(2,3,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,X58,X59,X60|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,X58,X59,P|R]) :- var(X60).
move(P,(3,0,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,X58,X59,X60,X61|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,X58,X59,X60,P|R]) :- var(X61).
move(P,(3,1,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,X58,X59,X60,X61,X62|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,X58,X59,X60,X61,P|R]) :- var(X62).
move(P,(3,2,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,X58,X59,X60,X61,X62,X63|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,X58,X59,X60,X61,X62,P|R]) :- var(X63).
move(P,(3,3,3),[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,X58,X59,X60,X61,X62,X63,X64|R],[X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16,X17,X18,X19,X20,X21,X22,X23,X24,X25,X26,X27,X28,X29,X30,X31,X32,X33,X34,X35,X36,X37,X38,X39,X40,X41,X42,X43,X44,X45,X46,X47,X48,X49,X50,X51,X52,X53,X54,X55,X56,X57,X58,X59,X60,X61,X62,X63,P|R]) :- var(X64).
%%%%%
%% Record a move: record(+,+,+,+).
%%%%%
record(Player,X,Y,Z) :-
retract(board(B)),
mark(Player,B,X,Y,Z),
assert(board(B)).
%%%%%
%% A winning line is ALREADY bound to Player.
%% win(+Board,+Player) is true or fail.
%% e.g., win([P,P,P|_],P). is NOT correct, because could bind
%%%%%
%%%%% horizontal lines in each level
win([Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
%%%%%% vertical lines in each level
win([Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
%%%%% diagonals in each level
win([Z1,_,_,_,_,Z2,_,_,_,_,Z3,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,Z1,_,_,Z2,_,_,Z3,_,_,Z4,_,_,_|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,Z2,_,_,_,_,Z3,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,Z2,_,_,Z3,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,Z2,_,_,_,_,Z3,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,Z2,_,_,Z3,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,Z2,_,_,_,_,Z3,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,Z2,_,_,Z3,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
%%%%%% 3d vertical lines
win([Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
%%%%%% 3d horizontal lines
win([Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
%%%%%% 3d diagonals
win([_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
%%%%%% diagonals across levels
win([Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
%%%%%% pilares
win([Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
win([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],P) :- Z1==P, Z2==P, Z3==P, Z4==P.
%%%%%
%% A line is open if each position is either free or equals the Player
%%%%%
open([Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,Z2,Z3,Z4],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
%%%%%% vertical lines in each level
open([Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,Z2,_,_,_,Z3,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
%%%%% diagonals in each level
open([Z1,_,_,_,_,Z2,_,_,_,_,Z3,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,Z1,_,_,Z2,_,_,Z3,_,_,Z4,_,_,_|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,Z2,_,_,_,_,Z3,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,Z2,_,_,Z3,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,Z2,_,_,_,_,Z3,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,Z2,_,_,Z3,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,Z2,_,_,_,_,Z3,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,Z2,_,_,Z3,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
%%%%%% 3d vertical lines
open([Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
%%%%%% 3d horizontal lines
open([Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
%%%%%% 3d diagonals
open([_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
%%%%%% diagonals across levels
open([Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
%%%%%% pilares
open([Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
open([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z1,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z2,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z3,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,Z4|_],Player) :- (var(Z1) | Z1 == Player),(var(Z2) | Z2 == Player), (var(Z3) | Z3 == Player), (var(Z4) | Z4 == Player).
%%%%%
%% Calculate the value of a position, o maximizes, x minimizes.
%%%%%
value(Board,100) :- win(Board,o), !.
value(Board,-100) :- win(Board,x), !.
value(Board,E) :-
findall(o,open(Board,o),MAX),
length(MAX,Emax), % # lines open to o
findall(x,open(Board,x),MIN),
length(MIN,Emin), % # lines open to x
E is Emax - Emin.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% using minimax procedure with alpha-beta cutoff.
% Computer (o) searches for best tic tac toe move,
% Human player is x.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
:- assert(lookahead(2)).
:- dynamic spy/0. % debug calls to alpha_beta
% :- assert(spy). % Comment out stop spy.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
search(Position,Depth,(Move,Value)) :-
alpha_beta(o,Depth,Position,-100,100,Move,Value).
alpha_beta(Player,0,Position,_Alpha,_Beta,_NoMove,Value) :-
value(Position,Value),
spy(Player,Position,Value).
alpha_beta(Player,D,Position,Alpha,Beta,Move,Value) :-
D > 0,
findall((X,Y,Z),mark(Player,Position,X,Y,Z),Moves),
Alpha1 is -Beta, % max/min
Beta1 is -Alpha,
D1 is D-1,
evaluate_and_choose(Player,Moves,Position,D1,Alpha1,Beta1,nil,(Move,Value)).
evaluate_and_choose(Player,[Move|Moves],Position,D,Alpha,Beta,Record,BestMove) :-
move(Player,Move,Position,Position1),
other_player(Player,OtherPlayer),
alpha_beta(OtherPlayer,D,Position1,Alpha,Beta,_OtherMove,Value),
Value1 is -Value,
cutoff(Player,Move,Value1,D,Alpha,Beta,Moves,Position,Record,BestMove).
evaluate_and_choose(_Player,[],_Position,_D,Alpha,_Beta,Move,(Move,Alpha)).
cutoff(_Player,Move,Value,_D,_Alpha,Beta,_Moves,_Position,_Record,(Move,Value)) :-
Value >= Beta, !.
cutoff(Player,Move,Value,D,Alpha,Beta,Moves,Position,_Record,BestMove) :-
Alpha < Value, Value < Beta, !,
evaluate_and_choose(Player,Moves,Position,D,Value,Beta,Move,BestMove).
cutoff(Player,_Move,Value,D,Alpha,Beta,Moves,Position,Record,BestMove) :-
Value =< Alpha, !,
evaluate_and_choose(Player,Moves,Position,D,Alpha,Beta,Record,BestMove).
other_player(o,x).
other_player(x,o).
spy(Player,Position,Value) :-
spy, !,
write(Player),
write(' '),
write(Position),
write(' '),
writeln(Value).
spy(_,_,_). % do nothing
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% For testing, use h(+,+,+) to record human move,
%%% supply coordinates. Then call c (computer plays).
%%% Use s to show board.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
h(X,Y,Z) :-
record(x,X,Y,Z),
showBoard.
c :-
board(B),
alpha_beta(o,2,B,-200,200,(X,Y,Z),_Value),
record(o,X,Y,Z),
showBoard.
showBoard :-
board([Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8,Z9,Z10,Z11,Z12,Z13,Z14,Z15,Z16,
Z17,Z18,Z19,Z20,Z21,Z22,Z23,Z24,Z25,Z26,Z27,Z28,Z29,Z30,Z31,Z32,
Z33,Z34,Z35,Z36,Z37,Z38,Z39,Z40,Z41,Z42,Z43,Z44,Z45,Z46,Z47,Z48,
Z49,Z50,Z51,Z52,Z53,Z54,Z55,Z56,Z57,Z58,Z59,Z60,Z61,Z62,Z63,Z64]),
write(' '),mark(Z1),write(' '),mark(Z2),write(' '),mark(Z3),write(' '),mark(Z4),nl,
write(' '),mark(Z5),write(' '),mark(Z6),write(' '),mark(Z7),write(' '),mark(Z8),nl,
write(' '),mark(Z9),write(' '),mark(Z10),write(' '),mark(Z11),write(' '),mark(Z12),nl,
write(' '),mark(Z13),write(' '),mark(Z14),write(' '),mark(Z15),write(' '),mark(Z16),nl,
nl,
write(' '),mark(Z17),write(' '),mark(Z18),write(' '),mark(Z19),write(' '),mark(Z20),nl,
write(' '),mark(Z21),write(' '),mark(Z22),write(' '),mark(Z23),write(' '),mark(Z24),nl,
write(' '),mark(Z25),write(' '),mark(Z26),write(' '),mark(Z27),write(' '),mark(Z28),nl,
write(' '),mark(Z29),write(' '),mark(Z30),write(' '),mark(Z31),write(' '),mark(Z32),nl,
nl,
write(' '),mark(Z33),write(' '),mark(Z34),write(' '),mark(Z35),write(' '),mark(Z36),nl,
write(' '),mark(Z37),write(' '),mark(Z38),write(' '),mark(Z39),write(' '),mark(Z40),nl,
write(' '),mark(Z41),write(' '),mark(Z42),write(' '),mark(Z43),write(' '),mark(Z44),nl,
write(' '),mark(Z45),write(' '),mark(Z46),write(' '),mark(Z47),write(' '),mark(Z48),nl,
nl,
write(' '),mark(Z49),write(' '),mark(Z50),write(' '),mark(Z51),write(' '),mark(Z52),nl,
write(' '),mark(Z53),write(' '),mark(Z54),write(' '),mark(Z55),write(' '),mark(Z56),nl,
write(' '),mark(Z57),write(' '),mark(Z58),write(' '),mark(Z59),write(' '),mark(Z60),nl,
write(' '),mark(Z61),write(' '),mark(Z62),write(' '),mark(Z63),write(' '),mark(Z64),nl,
nl, write(' '), write('-------'), nl,nl.
showBoard(B) :-
B = [Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8,Z9,Z10,Z11,Z12,Z13,Z14,Z15,Z16,
Z17,Z18,Z19,Z20,Z21,Z22,Z23,Z24,Z25,Z26,Z27,Z28,Z29,Z30,Z31,Z32,
Z33,Z34,Z35,Z36,Z37,Z38,Z39,Z40,Z41,Z42,Z43,Z44,Z45,Z46,Z47,Z48,
Z49,Z50,Z51,Z52,Z53,Z54,Z55,Z56,Z57,Z58,Z59,Z60,Z61,Z62,Z63,Z64],
write(' '),mark(Z1),write(' '),mark(Z2),write(' '),mark(Z3),write(' '),mark(Z4),nl,
write(' '),mark(Z5),write(' '),mark(Z6),write(' '),mark(Z7),write(' '),mark(Z8),nl,
write(' '),mark(Z9),write(' '),mark(Z10),write(' '),mark(Z11),write(' '),mark(Z12),nl,
write(' '),mark(Z13),write(' '),mark(Z14),write(' '),mark(Z15),write(' '),mark(Z16),nl,
nl,
write(' '),mark(Z17),write(' '),mark(Z18),write(' '),mark(Z19),write(' '),mark(Z20),nl,
write(' '),mark(Z21),write(' '),mark(Z22),write(' '),mark(Z23),write(' '),mark(Z24),nl,
write(' '),mark(Z25),write(' '),mark(Z26),write(' '),mark(Z27),write(' '),mark(Z28),nl,
write(' '),mark(Z29),write(' '),mark(Z30),write(' '),mark(Z31),write(' '),mark(Z32),nl,
nl,
write(' '),mark(Z33),write(' '),mark(Z34),write(' '),mark(Z35),write(' '),mark(Z36),nl,
write(' '),mark(Z37),write(' '),mark(Z38),write(' '),mark(Z39),write(' '),mark(Z40),nl,
write(' '),mark(Z41),write(' '),mark(Z42),write(' '),mark(Z43),write(' '),mark(Z44),nl,
write(' '),mark(Z45),write(' '),mark(Z46),write(' '),mark(Z47),write(' '),mark(Z48),nl,
nl,
write(' '),mark(Z49),write(' '),mark(Z50),write(' '),mark(Z51),write(' '),mark(Z52),nl,
write(' '),mark(Z53),write(' '),mark(Z54),write(' '),mark(Z55),write(' '),mark(Z56),nl,
write(' '),mark(Z57),write(' '),mark(Z58),write(' '),mark(Z59),write(' '),mark(Z60),nl,
write(' '),mark(Z61),write(' '),mark(Z62),write(' '),mark(Z63),write(' '),mark(Z64),nl,
nl, write(' '), write('-------'), nl,nl.
s :- showBoard.
mark(X) :-
var(X),
write('#').
mark(X) :-
\+var(X),
write(X).