Code: Select all
/*
Oefening 5 :
Implement a sudoku-solver (9x9).
Try to make as much use as possible of recursion, i.e.
don't just take the straightforward option where every
position is assigned a different variable, and all
constraints are based on enumerating these
variables...
Hint: Represent a board as a list of rows, which are lists
of numbers.
*/
/*
Voostelling:
[[_, _, _, _, _, _, _, _, _], [_, _, _, _, _, _, _, _, _], [_, _, _, _, _, _, _, _, _], [_, _, _, _, _, _, _, _, _], ...]
*/
element(X) :- L = [1, 2, 3, 4, 5, 6, 7, 8, 9], member(X, L).
solve_sudoku(G,S) :- build_sudoku(G, S), check_sudoku(S), pretty_sudo_print(S).
build_sudoku([],[]).
build_sudoku([OH|OT], [H|T]) :- build_row(OH, H), check_row(H), build_sudoku(OT, T).
build_row([], []).
build_row([OH|OT], [H|T]) :- element(OH), H is OH, build_row(OT, T).
%Controleer heel de sudoku (rijen moeten niet gecontroleerd worden, deze worden al in het opstellen gecontroleerd
check_sudoku(A) :- check_all_columns(A), !, check_all_blocks(A).
%Controleer of alle blokken correct zijn
check_all_blocks([]).
check_all_blocks([A,B,C|Rest]) :- check_three_blocks([A, B, C]), !, check_all_blocks(Rest).
check_three_blocks([[],[],[]]).
check_three_blocks([[A,B,C|R1],[D,E,F|R2],[G,H,I|R3]]) :- check_one_block([A, B, C, D, E, F, G, H, I]), !, check_three_blocks([R1, R2, R3]).
%kan eventueel weg
check_one_block(A) :- all_different(A).
%Controleer of alle kolommen correct zijn
check_all_columns([[],[],[],[],[],[],[],[],[]]).
check_all_columns([[H1|T1],[H2|T2],[H3|T3],[H4|T4],[H5|T5],[H6|T6],[H7|T7],[H8|T8],[H9|T9]]) :-
check_column([H1,H2,H3,H4,H5,H6,H7,H8,H9]), !, check_all_columns([T1,T2,T3,T4,T5,T6,T7,T8,T9]).
%kan eventueel weg
check_column(C) :- all_different(C).
%Controleer of alle rijen correct zijn
check_all_rows([]).
check_all_rows([H|T]) :- check_row(H), !, check_all_rows(T).
%kan eventueel weg
check_row(R) :- all_different(R).
%Ga na of alle ellementen in de gegeven lijst verschillend zijn of niet.
all_different([]).
all_different([H|T]) :- \+ member(H, T), !, all_different(T).
% Dit heb ik gevonden op het internet
% wordt enkel gebruikt voor output
% pretty printing \0/
pretty_sudo_print([]).
pretty_sudo_print([A,B,C|T]) :-
nl,printsudorow(A),
printsudorow(B),
printsudorow(C),
pretty_sudo_print(T).
printsudorow([]) :- nl.
printsudorow([A,B,C|T]) :-
writerepv(A),tab(1),
writerepv(B),tab(1),
writerepv(C),tab(3),
printsudorow(T).
writerepv(X) :-
var(X),!,write(' ').
writerepv(X) :-
write(X).
En ik hoop dat het in die computerklas is, want als ge da ni kunt teste werkt da toch nooit...

alhoewel het toch maar logisch denken is...
Maar moogt ge bij da praktisch examen dan ook u oefeningen gebruiken die ge al hebt gemaakt of niet?