View source with raw comments or as raw
    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    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
   17% pick a queen for row X.
   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
   26% check if a queen can attack any previously selected queen.
   27hide_attack(X, _, [q(X, _) | _]). % same row
   28hide_attack(_, Y, [q(_, Y) | _]). % same col
   29hide_attack(X, Y, [q(X2, Y2) | _]) :- % same diagonal
   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).