Declaratieve Talen/Oplossing K Queens: verschil tussen versies

Uit Wina Examenwiki
Naar navigatie springen Naar zoeken springen
Merel (overleg | bijdragen)
Geen bewerkingssamenvatting
 
Merel (overleg | bijdragen)
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 ^_^)


(zie niet direct nog optimalisaties, nog iemand ideeën? Merel)
% beginmethode: Opl zal van de vorm [1,2,3,4,5,6,..] zijn


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