# Prolog - Queens Problem



## whasabi (5. Januar 2014)

Hallo 

Ich hab eine Prolog Datei bekommen, welche mir das 8 queens Problem lösen soll und nun sollen wir eine Fuktion schreiben, welche dann das Problem mit N queens lösen soll...
nur hänge ich leider schon bei dem Programm welches wir bekommen haben

könnt ihr mir vl sagen wie das funktioniert bzw wie ich mir da z.B. eine Lösung ausgeben kann (also vl ein Beispiel schreiben was ich in SWI Prolog eingeben kann und dann kommt eine Lösung?)
Weil wenn ich das Programm schon nicht verstehe wie soll ich dann die N-Lösung noch machen? 



```
% 8queens.pl:
% Program for solving the 8 queens problem
% List is an output argument in which the solution of the problem is written.
% Order of queens is represented with a list of coordinates of rows and columns.
solution(Order):-
Order=[_/0,_/1,_/2,_/3,_/4,_/5,_/6,_/7],
Rows=[0,1,2,3,4,5,6,7],
Diag_Asc=[-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7],
Diag_Des=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],
solve(Order, Rows, Diag_Asc, Diag_Des).
% Arguments of predicate solve are in order:
% -solution of a problem (permitted order of queens);
% before execution of the procedure coordinates of columns need to be instantiated.
% -row of a queen that is currently being processed;
% -list of free descending diagonals which are described by the difference
% between row and column for every belonging field;
% -list of free ascending diagonals which are described by the sum
% between row and column for every belonging field;
solve([],_,_,_).
solve([Row/Column|Tail], R, Da, Dd):-
remove(Row,R,R1), % removes Row in R, rezult is R1
U is -Row+Column,
remove(U, Da, Da1),
S is Row+Column,
remove(S, Dd, Dd1),
solve(Tail, R1, Da1, Dd1).
remove(Element, [Element|Tail], Tail).
remove(Element, [Element1|Tail], [Element1|Tail1]):-
remove(Element,Tail,Tail1).
```


----------



## HonniCilest (13. Januar 2014)

Ich verstehe leider nicht wirklich etwas von Prolog und kann daher nicht wirklich viel mit dem Code anfangen. Ich würde jedoch vermuten, dass der Algorithmus allgemeingültig ist. Daher würde ich damit anfangen Order (0 bis n-1), Rows (0 bis n-1), Diag_Asc (-n+1 bis n-1) und Diag_Des (0 bis 2n-2) allgemeingültig darzustellen, d.h. abhängig von n.


----------

