|
|
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).
| |