Declaratieve Talen/Oplossing K Queens
DT: oplossing voor het probleem K-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).