Declaratieve Talen/Oplossing K Queens: verschil tussen versies

Uit Wina Examenwiki
Naar navigatie springen Naar zoeken springen
Merel (overleg | bijdragen)
Beau (overleg | bijdragen)
redirect naar n-queens
 
Regel 1: Regel 1:
=DT: oplossing voor het probleem K-Queens=
#REDIRECT [[Declaratieve_Talen/Oplossing_N-queens]]
(als iemand nog die wiki opmaak tegoei kan krijgen ^_^)
 
% 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).

Huidige versie van 18 jun 2006 10:21