% naive queens queensn(ShowResult) :- q10(R), ( ShowResult = true -> write(R), nl ; true). q8(R) :- q([1,2,3,4,5,6,7,8], R). q10(R) :- q([1,2,3,4,5,6,7,8,9,10], R). q(L,C):- perm(L,P), pair(L,P,C), safe([],C). perm([],[]). perm(Xs,[Z|Zs]):- sel(Z,Xs,Ys), perm(Ys,Zs). sel(X,[X|Xs],Xs). sel(X,[Y|Ys],[Y|Zs]):- sel(X,Ys,Zs). pair([],[],[]). pair([X|Y],[U|V],[p(X,U)|W]):- pair(Y,V,W). safe(_X,[]). safe(X,[Q|R]):- test(X,Q), safe([Q|X],R). test([],_X). test([R|S],Q):- test(S,Q), nd(R,Q). nd(p(C1,R1),p(C2,R2)):- C is C1-C2, R is R1-R2, C=\=R, NR is R2-R1, C=\=NR. % benchmark interface benchmark(ShowResult) :- queensn(ShowResult). :- include(common).