View source with formatted 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    _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).