This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/packages/clp_examples/sudoku.yap

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,_,_
] ).