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
).
cXVlZW5zKEFycmF5LCBMZW5ndGgpIDotIGxlbmd0aChBcnJheSwgTGVuZ3RoKSwgcXVlZW5zX3NlYXJjaChbXSwgQXJyYXksIExlbmd0aCkuCgpxdWVlbnNfc2VhcmNoKF8sIFtdLCBfKS4KcXVlZW5zX3NlYXJjaChQYXN0LCBbSGVhZHxUYWlsXSwgUmFuZ2UpIDotIGJldHdlZW4oMSwgUmFuZ2UsIEhlYWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlZW5zX2NvbmRpdGlvbihIZWFkLCBQYXN0LCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZWVuc19zZWFyY2goW0hlYWR8UGFzdF0sIFRhaWwsIFJhbmdlKS4KCnF1ZWVuc19jb25kaXRpb24oXywgW10sIF8pLgpxdWVlbnNfY29uZGl0aW9uKEVsZW1lbnQsIFtIZWFkfFRhaWxdLCBQZW5hbHR5KSA6LSBFbGVtZW50IFw9IEhlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3RhbmNlIGlzIGFicyhFbGVtZW50LUhlYWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXN0YW5jZSBcPSBQZW5hbHR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjKFBlbmFsdHksIE5leHRQZW5hbHR5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlZW5zX2NvbmRpdGlvbihFbGVtZW50LCBUYWlsLCBOZXh0UGVuYWx0eSkuCgo/LSBxdWVlbnMoWCwgOCksIHdyaXRlKFgpLg==