diagX(X,Y,XmY) :- num(X), num(Y), XmY = X - Y. diagY(X,Y,XpY) :- num(X), num(Y), XpY = X + Y. diagXp(D) :- diagX(X,Y,D). diagYp(D) :- diagY(X,Y,D). queen(X,Y) v noQueen(X,Y) :- num(X), num(Y), not block(X,Y). queen(X,Y) v noQueen(X,Y) :- num(Y), num(X), not block(X,Y). % exactly 1 queen in each row/col :- num(X), not assignedRow(X). :- num(X), not assignedCol(X). assignedRow(X):- queen(X,_). assignedCol(X):- queen(_,X). :- queen(X,Y), queen(X,Z), Z != Y. :- queen(X,Y), queen(Z,Y), Z != X. % at most 1 queen on each diagonal :- queen(X,Y), queen(XX,YY), sameDiag(X,Y,XX,YY). sameDiag(X,Y,XX,YY) :- num(X), num(Y), num(XX), num(YY), num(K), XX = X + K, YY = Y + K. sameDiag(X,Y,XX,YY) :- num(X), num(Y), num(XX), num(YY), num(K), XX = X + K, YY = Y - K.