$ queen(N,R) :- range(1,N,Ns), queens(Ns,[],R).

$ range(N,N,[N]) :- !.
$ range(M,N,[M|Ns]) :- plus(M,1,M1), range(M1,N,Ns).

$ queens([],R,R).
$ queens(Unplaced,Safe,R) :- del(Q,Unplaced,U1),
     not(attack(Q,1,Safe)),
     queens(U1,[Q|Safe],R).

$ attack(X,N,[Y|_]) :- plus(Y,N,X).
$ attack(X,N,[Y|_]) :- plus(X,N,Y).
$ attack(X,N,[_|Ys]) :- plus(N,1,N1), attack(X,N1,Ys).
