
safe(N,Qs) :-
	makeList(N,Cols),
	N2 is 2*N+1,
	createSet(N2, Diag1),
	createSet(N2, Diag2),
	ext(0,N,[], Diag1, Diag2, Cols, Final).

ext(Max, Max, Selected, Diag1, Diag2, Cols, Selected).

ext(Row, Max, Selected, Diag1, Diag2, Cols, Final) :-
	delete(C, Cols, RCols),
	diag1of(Row,Col, Max, D1), bind(Diag1, Row, D1),
	diag2of(Row,Col, Max, D2), bind(Diag2, Row, D2),
	N1 is Row+1, 
	ext(N1, [q(Row,C)|Selected], Diag1, Diag2, Cols, Final).

diag1of(Row, Col, Max, M) :- M is R+C-1.
diag2of(Row, Col, Max, M) :- M is R-C+Max.

makeList(0,[]).
makeList(N,[F|R]) :- N>0, N1 is N-1, makeList(N1,R).

createSet(Size,f(X1,X2,X3,X4,X5,X6,X7,X8,X9,X10)). /* temporary kludge */
bind(T,Position,Value) :- arg(Position,T,Value).   /* temporary kludge */


delete(X, [X|R] , R).
delete(X, [Y|R] , [Y|T]) :- delete(X,R,T).

?- /* safe(6,Qs).*/ T = f(a,b,c), arg(2,f(a,b,c),a).

