% -*- Prolog -*-
%
% $Id: 219,v 1.1 2000/11/13 11:55:05 peteg Exp $

:- list(X) ::= [] ; [X | list(X)].
:- compile(not_attack/3).

queens(N,Qs) :-
	range(1,N,Ns),
	queens(Ns,[],Qs).

queens([],Qs,Qs).
queens(UnplacedQs,SafeQs,Qs) :-
	select(UnplacedQs,UnplacedQs1,Q),
	not_attack(SafeQs,Q),
	queens(UnplacedQs1,[Q|SafeQs],Qs).

not_attack(Xs,X) :-
	not_attack(Xs,X,1).

not_attack([],_,_).
not_attack([Y|Ys], X, N) :-
	X =\= Y + N,
%	X =\= Y - N,
	N1 is N + 1,
	not_attack(Ys,X,N1).
%not_attack(_A0, _B0, _C0) :-
%        unify(_A0, [_D0|_E0]),
%        is_not_equal(_B0, +(_D0, _C0)),
%        is_not_equal(_B0, -(_D0, _C0)),
%        is(_F0, +(_C0, 1)),
%        not_attack(_E0, _B0, _F0).

main :- not_attack([4, 2], 7),
	not_attack([5, 2, 4], 7),
	not_attack([3, 5, 2, 8, 6, 4, 7], 1).
