85 lines
1.7 KiB
Prolog
85 lines
1.7 KiB
Prolog
|
|
|
|
:- style_check(all).
|
|
|
|
:- use_module(library(gecode/clpfd)).
|
|
:- use_module(library(maplist)).
|
|
|
|
main :-
|
|
ex(Ex, _),
|
|
sudoku(Ex, _My),
|
|
fail.
|
|
main.
|
|
|
|
sudoku( Ex, Els ) :-
|
|
problem(Ex, Els),
|
|
output(Els).
|
|
|
|
%
|
|
% gecode constraints
|
|
%
|
|
problem(Ex, Els) :-
|
|
length(Els, 81),
|
|
Els ins 1..9,
|
|
M <== matrix( Els, [dim=[9,9]] ),
|
|
% select rows
|
|
foreach( I in 0..8 , all_different(M[I,_]) ),
|
|
% select cols
|
|
foreach( J in 0..8, all_different(M[_,J]) ),
|
|
% select squares
|
|
foreach( [I,J] ins 0..2 ,
|
|
all_different(M[I*3+(0..2),J*3+(0..2)]) ),
|
|
ex(Ex, Els),
|
|
% maplist( bound, Els, Exs),
|
|
labeling( [], Els ).
|
|
|
|
|
|
% The gecode interface doesn't support wake-ups on binding constained variables, this is the closest.
|
|
%
|
|
bound(El, X) :-
|
|
( nonvar(X) -> El #= X ; true ).
|
|
|
|
%
|
|
% output using matrix library
|
|
%
|
|
output(Els) :-
|
|
M <== matrix( Els, [dim=[9,9]] ),
|
|
foreach( I in 0..2 , output(M, I) ),
|
|
output_line.
|
|
|
|
output(M, I) :-
|
|
output_line,
|
|
foreach( J in 0..2 , output_row(M, J+I*3) ).
|
|
|
|
output_row( M, Row ) :-
|
|
L <== M[Row,_],
|
|
format('| ~d ~d ~d | ~d ~d ~d | ~d ~d ~d |~n', L).
|
|
|
|
output_line :-
|
|
format(' ~|~`-t~24+~n', []).
|
|
|
|
ex( 1, [
|
|
_,6,_,1,_,4,_,5,_,
|
|
_,_,8,3,_,5,6,_,_,
|
|
2,_,_,_,_,_,_,_,1,
|
|
8,_,_,4,_,7,_,_,6,
|
|
_,_,6,_,_,_,3,_,_,
|
|
7,_,_,9,_,1,_,_,4,
|
|
5,_,_,_,_,_,_,_,2,
|
|
_,_,7,2,_,6,9,_,_,
|
|
_,4,_,5,_,8,_,7,_
|
|
] ).
|
|
|
|
|
|
ex(2, [
|
|
_,_,1,_,8,_,6,_,4,
|
|
_,3,7,6,_,_,_,_,_,
|
|
5,_,_,_,_,_,_,_,_,
|
|
_,_,_,_,_,5,_,_,_,
|
|
_,_,6,_,1,_,8,_,_,
|
|
_,_,_,4,_,_,_,_,_,
|
|
_,_,_,_,_,_,_,_,3,
|
|
_,_,_,_,_,7,5,2,_,
|
|
8,_,2,_,9,_,7,_,_
|
|
] ).
|