safe(Q1X-Q1Y, Q2X-Q2Y) :- between(0, 7, Q1Y), between(0, 7, Q2Y), Q1X =\= Q2X, Q1Y =\= Q2Y, abs(Q1X - Q2X) =\= abs(Q1Y - Q2Y). safe(_, []). safe(QN, [Q | QS]) :- safe(QN, [Q | QS], 1). safe(_, [], _). safe(QN, [Q | QS], QX) :- safe(0-QN, QX-Q), safe(QN, QS, QX + 1). add(Qs, QsN) :- QsN = [Q | Qs], safe(Q, Qs). add(1, Qs, QsN) :- add(Qs, QsN). add(N, Qs, QsN) :- add(Qs, QA), add(M, QA, QsN), succ(M, N). solution(Qs) :- add(8, [], Qs).