:- seqex([choose/1, noattack/2, consistent/2, seqExtend/4]). 

safe(N,Queens) :- extend(0,N,[],Queens).

/*extend(M,N,Selected, Queens) :-  write(extend(M,N,Selected, Queens)), nl,
	2=3.*/

extend(M,M,Queens,Queens).

extend(M,N,Selected, Queens) :-   
	M>=3,	seqExtend(M,N,Selected,Queens).

extend(M,N,Selected, Queens) :- 
	M < 3,
	M1 is M+1,
        choose(Q),
	consistent(q(M1,Q), Selected),
	extend(M1, N, [q(M1,Q)|Selected], Queens).

/*seqExtend(M,N,Selected, Queens) :- write(seqExtend(M,N,Selected, Queens)),
	 nl, 2=3.*/
seqExtend(M,M,Queens,Queens).
seqExtend(M,N,Selected, Queens) :-   M<N, M1 is M+1
        , choose(Q)
	, consistent(q(M1,Q), Selected)
	, seqExtend(M1, N, [q(M1,Q)|Selected], Queens).

choose(1).
choose(2).
choose(3).
choose(4).
choose(5).
choose(6).
choose(7).
choose(8). 
/*  choose(9). */


consistent(Q,[]).
consistent(Q, [Q1 | Rest]) :- noattack(Q,Q1) , consistent(Q,Rest).

noattack( q(X1,Y1), q(X2,Y2) ) :- Y1 =\= Y2 ,  X is X1-X2 , Y is Y1-Y2,
				  Z is Y2-Y1 ,  X =\= Y , X =\= Z.


queens(X) :- safe(X,Q).

/* ?-queens(8). */
?- safe(8, Q). 




