/* Das N-Damen-Problem: */ allqueens(N,Ds):- queens1(range 1 N,[],Ds),false. queens(N,Ds):- queens1(range 1 N,[],Ds). queens1([],Ds,Es):-Ds=Es. queens1(Dsunp,Dssicher,Ds):- select(D, Dsunp, Ds1unp) , noattack(D,Dssicher), queens1(Ds1unp,[D|Dssicher],Ds). range N1 N2 :=if (N1 = N2) then [N1]. range N1 N2 :=if (N1 ~= N2) then [N1|range (N1+1) N2]. sicher([D|Ds]):- sicher(Ds),noattack(D,Ds). sicher([]). select(Y,[X|Xs],Zs) :- X=Y,Zs=Xs. select(Y,[X|Xs],[Z|Zs]) :- X=Z,select(Y,Xs,Zs). noattack(X,Xs):-noattack1(X,1,Xs). noattack1(X,N,[]). noattack1(X,N,[Y|Ys]):- ((X ~= (Y+N) ) , ( X~= (Y-N) ) ) , noattack1(X,(N+1),Ys). append [X|Ys] Zs := [X|append Ys Zs]. append [] Zs := Zs. /* goals: queens(8,DS) allqueens(8,DS) */