queens(Array, Length) :- length(Array, Length), queens_search([], Array, Length).

queens_search(_, [], _).
queens_search(Past, [Head|Tail], Range) :- between(1, Range, Head),
                                           queens_condition(Head, Past, 1),
                                           queens_search([Head|Past], Tail, Range).

queens_condition(_, [], _).
queens_condition(Element, [Head|Tail], Penalty) :- Element \= Head,
                                                   Distance is abs(Element-Head),
                                                   Distance \= Penalty,
                                                   succ(Penalty, NextPenalty),
                                                   queens_condition(Element, Tail, NextPenalty).

?- queens(X, 8), write(X).