:- use_module(library(clpfd)).

queens(N,L) :-
        length(L,N),            % L Liste von Variablen der Laenge N

        L ins 1..N,             % Wertebereich = Zeilennummern
        all_safe(L),            % Damen nicht gegenseitig schlagbar
        labeling([ff],L).

all_safe([]).
all_safe([Q|Qs]) :- safe(Q,Qs,1), all_safe(Qs).

% Q kann keine QS schlagen
safe(_,[],_).
safe(Q,[Q1|Qs],D) :-
        no_attack(Q,Q1,D),
        D1 #= D+1,
        safe(Q,Qs,D1).

no_attack(Q,Q1,D) :-
        Q #\= Q1,
        Q #\= Q1+D,
        Q #\= Q1-D.

    