:- use_module(library(clpfd)).

queens(N,L) :-
        length(L,N),            % L Liste von Variablen der Laenge N
        domain(L,1,N),          % Wertebereich jeder Dame: Zeilennummer

        all_safe(L),            % Damen nicht gegenseitig schlagbar

        labeling([ff],L).       % Strategie: first fail

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

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

% Damen koennen waagerecht und diagonal schlagen (D: Spaltenabstand)
no_attack(Q,Q1,D) :-
        Q #\= Q1,   % nicht in gleicher Zeile
        Q #\= Q1+D, % nicht diagonal schlagen
        Q #\= Q1-D.

    