Declaratieve Talen/Oplossing K Queens

Uit Wina Examenwiki
Versie door Merel (overleg | bijdragen) op 17 jun 2006 om 19:47
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Naar navigatie springen Naar zoeken springen

DT: oplossing voor het probleem K-Queens

(zie niet direct nog optimalisaties, nog iemand ideeën? Merel)

% beginmethode: Opl zal van de vorm [1,2,3,4,5,6,..] zijn nqueens(N, Opl) :-

   nqueens(N, 1, [], Opl).

% C is current kolum, Accum van vorm [(1,x), (2,y), ..] nqueens(N, C, Accum, Opl) :-

   (
     check_row_constraint(Accum) -> 
       fail
   ;
     check_diagonal_constraint(N, Accum) ->
       fail
   ;
     C > N ->
       findall(B, member((_,B), Accum), Opl)
   ;
     get_next_choice(N, C, Choice),
     C1 is C + 1,
     nqueens(N, C1, [Choice|Accum], Opl)    
   ).

% constraintchecking check_row_constraint(Accum) :-

   member((A, B), Accum), 
   member((C, D), Accum), 
   A \== C, 
   B == D, !.

% diagonaal rechts naar boven check check_diagonal_constraint(N, Accum) :-

   member((A, B), Accum),
   between(1, N, D),
   D \== 0,
   F is A + D,
   G is B + D,
   member((F, G), Accum).

% diagonaal links naar boven check check_diagonal_constraint(N, Accum) :-

   member((A, B), Accum),
   between(1, N, D),
   D \== 0,
   F is A - D,
   G is B + D,
   member((F, G), Accum).

% volgende keuze get_next_choice(N, C, Choice) :-

   between(1, N, A), 
   Choice = (C, A).