:- initialization(main). queens(N,Qs) :- bagof(X, between(1,N,X), Xs), place(Xs,[],Qs). place(Xs,Qs,Res) :- Xs = [] -> Res = Qs ; select(Q,Xs,Ys), not_diag(Q,Qs,1), place(Ys,[Q|Qs],Res) . not_diag(_, [] , _). not_diag(Q, [Qh|Qs], D) :- abs(Q - Qh) =\= D, D1 is D + 1, not_diag(Q,Qs,D1). % for gprolog 1.3.1 between(M,N,X) :- X = M ; M < N -> M1 is M + 1, between(M1,N,X). main :- findall(Qs, (queens(8,Qs), write(Qs), nl), _), halt.