:- use_module(library(clpfd)).

smm(L) :-
        L = [S,E,N,D,M,O,R,Y],

        domain(L,0,9),          % Wertebereich festlegen

        % Constraints festlegen:
        S #> 0, M #> 0,
        all_different(L),
                       1000 * S + 100 * E + 10 * N + D
                     + 1000 * M + 100 * O + 10 * R + E
        #= 10000 * M + 1000 * O + 100 * N + 10 * E + Y,

        % Werte aufzählen:
        labeling([],L).


queens(N,Qs) :-
        length(Qs,N), % N Damen in der Liste Qs
        domain(Qs,1,N),         % Wertebereich: 1..N
        all_safe(Qs), % alle Damen sind in sicherer Position
        labeling([ff],Qs). % Wertebereich aufzaehlen

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

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,               % nicht in gleicher Zeile!
        Q #\= Q1+D, Q #\= Q1-D. % nicht diagonal schlagbar
