fork download
  1. queens(Array, Length) :- length(Array, Length), queens_search([], Array, Length).
  2.  
  3. queens_search(_, [], _).
  4. queens_search(Past, [Head|Tail], Range) :- between(1, Range, Head),
  5. queens_condition(Head, Past, 1),
  6. queens_search([Head|Past], Tail, Range).
  7.  
  8. queens_condition(_, [], _).
  9. queens_condition(Element, [Head|Tail], Penalty) :- Element \= Head,
  10. Distance is abs(Element-Head),
  11. Distance \= Penalty,
  12. succ(Penalty, NextPenalty),
  13. queens_condition(Element, Tail, NextPenalty).
  14.  
  15. ?- queens(X, 8), write(X).
Success #stdin #stdout #stderr 0.02s 6204KB
stdin
Standard input is empty
stdout
[1, 5, 8, 6, 3, 7, 2, 4]
stderr