eight_queens(Queens) :-
    Queens = [1/_, 2/_, 3/_, 4/_, 5/_, 6/_, 7/_, 8/_],
    safe(Queens).

safe([]).
safe([X/Y|Qs]) :-
    safe(Qs),
    member(Y, [1,2,3,4,5,6,7,8]),
    not_attacked(X/Y, Qs).

not_attacked(_, []).
not_attacked(X/Y, [X1/Y1|Qs]) :-
    % X =\= X1,		% this constraint is implied by the representation
    Y =\= Y1,
    abs(Y1-Y) =\= abs(X1-X),
    not_attacked(X/Y, Qs).
