% get the numbers from predicate board num(X) :- board(X). num(X-1) :- num(X), X>1. { queen(X,Y) } :- num(X), num(Y), not block(X,Y). % enforce N queens on the board :- #count{ queens(X,Y) : queen(X,Y) } != N, board(N). % forbid other queen in horizontal and vertical direction :- queen(X,Y), queen(X1,Y), X1 != X. :- queen(X,Y), queen(X,Y1), Y1 != Y. % forbid other queen in diagonal direction :- queen(X,Y), num(Delta), queen(X-Delta,Y-Delta). :- queen(X,Y), num(Delta), queen(X+Delta,Y+Delta). :- queen(X,Y), num(Delta), queen(X+Delta,Y-Delta). :- queen(X,Y), num(Delta), queen(X-Delta,Y+Delta). #show queen/2.