Declaratieve Talen/Oplossing K Queens: verschil tussen versies
Naar navigatie springen
Naar zoeken springen
Geen bewerkingssamenvatting |
|||
Regel 1: | Regel 1: | ||
=DT: oplossing voor het probleem 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, Opl) :- | ||
nqueens(N, 1, [], Opl). | nqueens(N, 1, [], Opl). | ||
% C is current kolum, Accum van vorm [(1,x), (2,y), ..] | % C is current kolum, Accum van vorm [(1,x), (2,y), ..] | ||
nqueens(N, C, Accum, Opl) :- | nqueens(N, C, Accum, Opl) :- | ||
( | ( | ||
Regel 25: | Regel 26: | ||
% constraintchecking | % constraintchecking | ||
check_row_constraint(Accum) :- | check_row_constraint(Accum) :- | ||
member((A, B), Accum), | member((A, B), Accum), | ||
Regel 32: | Regel 34: | ||
% diagonaal rechts naar boven check | % diagonaal rechts naar boven check | ||
check_diagonal_constraint(N, Accum) :- | check_diagonal_constraint(N, Accum) :- | ||
member((A, B), Accum), | member((A, B), Accum), | ||
Regel 41: | Regel 44: | ||
% diagonaal links naar boven check | % diagonaal links naar boven check | ||
check_diagonal_constraint(N, Accum) :- | check_diagonal_constraint(N, Accum) :- | ||
member((A, B), Accum), | member((A, B), Accum), | ||
Regel 50: | Regel 54: | ||
% volgende keuze | % volgende keuze | ||
get_next_choice(N, C, Choice) :- | get_next_choice(N, C, Choice) :- | ||
between(1, N, A), | between(1, N, A), | ||
Choice = (C, A). | Choice = (C, A). |
Versie van 17 jun 2006 19:49
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).