3
4nqueens(N, Q) :-
5 hide_nqueens(N, N, [], Q).
6
7% Pick queens one at a time and test against all previous queens.
8hide_nqueens(X, N, Qi, Qo) :-
9 X > 0,
10 hide_pickqueen(X, Y, N),
11 not hide_attack(X, Y, Qi),
12 X1 is X - 1,
13 hide_nqueens(X1, N, [q(X, Y) | Qi], Qo).
14hide_nqueens(0, _, Q, Q).
15
16
18hide_pickqueen(X, Y, Y) :-
19 Y > 0,
20 q(X, Y).
21hide_pickqueen(X, Y, N) :-
22 N > 1,
23 N1 is N - 1,
24 hide_pickqueen(X, Y, N1).
25
27hide_attack(X, _, [q(X, _) | _]). 28hide_attack(_, Y, [q(_, Y) | _]). 29hide_attack(X, Y, [q(X2, Y2) | _]) :- 30 Xd is X2 - X,
31 hide_abs(Xd, Xd2),
32 Yd is Y2 - Y,
33 hide_abs(Yd, Yd2),
34 Xd2 = Yd2.
35hide_attack(X, Y, [_ | T]) :-
36 hide_attack(X, Y, T).
37
38q(X, Y) :- not hide_negq(X, Y).
39hide_negq(X, Y) :- not q(X, Y).
40
41hide_abs(X, X) :- X >= 0.
42hide_abs(X, Y) :- X < 0, Y is X * -1.
43
44?- nqueens(4, Q).