% eight_queens([X1,X2,X3,X4,X5,X6,X7,X8]) : the  Xi are the positions (on 
% columns) of eight queens on a chessboard so that no two queens attack each other

eight_queens([X1,X2,X3,X4,X5,X6,X7,X8]) :-
	label_and_check([X1,X2,X3,X4,X5,X6,X7,X8],[1,2,3,4,5,6,7,8],T-T,1).

label_and_check([],[],_,N).
label_and_check([X1|XR],Row_Values,Placed-T,N) :-
	select(X1,Row_Values,Rest_Row),
	T=[X1|T1],
	verify(Placed-T1,X1,N,1),
	N1 is N+1,
	label_and_check(XR,Rest_Row,Placed-T1,N1).

verify(_,_,N,N).
verify([X1|X_s]-_,X,N,M) :-
	D is N-M,
	noattack(X1,X,D),
	M1 is M+1,
	verify(X_s-_,X,N,M1).

noattack(X_i,X,D) :-
	 D1 is X - D,
	 D2 is X + D,
	 X_i \== D1,
	 X_i \== D2.

select(H,[H|R_est],R_est) .
select(X,[H|T],[H|R]) :-
	select(X,T,R).



/* eight_queens([X1,X2,X3,X4,X5,X6,X7,X8]). 
 [-'queens2'].
| ?- eight_queens(L).

L = [1,5,8,6,3,7,2,4]

L = [1,6,8,3,7,4,2,5]

L = [1,7,4,6,8,2,5,3]
...
*/