1% 4-queens: ((1,2),(2,4),(3,1),(4,3)) and ((1,3),(2,1),(3,4),(4,2)) 2% Retargetable N-queens program. 3 4nqueens(N, Q) :- 5 _nqueens(N, N, [], Q). 6 7% Pick queens one at a time and test against all previous queens. 8_nqueens(X, N, Qi, Qo) :- 9 X > 0, 10 _pickqueen(X, Y, N), 11 not _attack(X, Y, Qi), 12 X1 is X - 1, 13 _nqueens(X1, N, [q(X, Y) | Qi], Qo). 14_nqueens(0, _, Q, Q). 15 16 17% pick a queen for row X. 18_pickqueen(X, Y, Y) :- 19 Y > 0, 20 q(X, Y). 21_pickqueen(X, Y, N) :- 22 N > 1, 23 N1 is N - 1, 24 _pickqueen(X, Y, N1). 25 26% check if a queen can attack any previously selected queen. 27_attack(X, _, [q(X, _) | _]). % same row 28_attack(_, Y, [q(_, Y) | _]). % same col 29_attack(X, Y, [q(X2, Y2) | _]) :- % same diagonal 30 Xd is X2 - X, 31 _abs(Xd, Xd2), 32 Yd is Y2 - Y, 33 _abs(Yd, Yd2), 34 Xd2 = Yd2. 35_attack(X, Y, [_ | T]) :- 36 _attack(X, Y, T). 37 38q(X, Y) :- not _negq(X, Y). 39_negq(X, Y) :- not q(X, Y). 40 41_abs(X, X) :- X >= 0. 42_abs(X, Y) :- X < 0, Y is X * -1. 43 44?- nqueens(4, Q).