queens(N) :-
length(Board,N),
Board :: 1..N,
( fromto (Board, [Q1|Cols], Cols, []) do
( foreach(Q2, Cols), count(Dist,1,_), param(Q1) do
noattack(Q1, Q2, Dist)
)
), labeling(Board).
noattack(Q1,Q2,Dist) :-
Q1 ## Q2,
Q1 - Q2 ## Dist,
Q2 - Q1 ## Dist.
labeling(AllVars) :-
( foreach(Var,AllVars) do
indomain(Var)
).
|