1#show queen/2.
2
3#program board(n).
4#external attack(n,1..n,h).
5#external attack(1..n,n,v).
6
7target(n,  X,  X,  n,  b,n) :- X = 1..n-1.              % diagonal b
8target(Y,  n-1,n,  Y-1,b,n) :- Y = 2..n-1.              % diagonal b
9target(X,  n-1,X+1,n,  f,n) :- X = 1..n-1.              % diagonal f
10target(n-1,Y,  n,  Y+1,f,n) :- Y = 1..n-2.              % diagonal f
11target(X,  n,  X-1,n,  h,n) :- X = 2..n.                % horizontal
12target(n,  Y,  n-1,Y,  h,n) :- Y = 1..n-1.              % horizontal
13target(Y,  X,  Y,  X-1,v,n) :- target(X,Y,X-1,Y,h,n).   % vertical
14
15{ queen(1..n,n); queen(n,1..n-1) }.
16
17attack(X',Y',D) :- target(X,Y,X',Y',D,n), queen(X,Y).
18attack(X',Y',D) :- target(X,Y,X',Y',D,n), attack(X,Y,D).
19
20:- target(X,Y,X',Y',D,n), attack(X',Y',D), queen(X',Y').
21
22:- not queen(1,n), not attack(1,n,h).
23:- not queen(n,1), not attack(n,1,v).
24