:- prompt(_, '').
:- use_module(library(readutil)).
:- use_module(library(clpfd)).
sudoku(Rows) :-
length(Rows, 9), maplist(length_(9), Rows),
append(Rows, Vs), Vs ins 1..9,
maplist(all_distinct, Rows),
transpose(Rows, Columns), maplist(all_distinct, Columns),
Rows = [A,B,C,D,E,F,G,H,I],
blocks(A, B, C), blocks(D, E, F), blocks(G, H, I).
length_(L, Ls) :- length(Ls, L).
blocks([], [], []).
blocks([N1,N2,N3|Ns1], [N4,N5,N6|Ns2], [N7,N8,N9|Ns3]) :-
all_distinct([N1,N2,N3,N4,N5,N6,N7,N8,N9]),
blocks(Ns1, Ns2, Ns3).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
show_sudoku(Puzzle) :-
maplist(label, Puzzle), maplist(portray_clause, Puzzle).
gen_sudoku(Puzzle) :- sudoku(Puzzle), show_sudoku(Puzzle).
solve_sudoku(Puzzle) :- sudoku(Puzzle), show_sudoku(Puzzle).
problem(1, P) :- % shokyuu
P = [[1,_,_,8,_,4,_,_,_],
[_,2,_,_,_,_,4,5,6],
[_,_,3,2,_,5,_,_,_],
[_,_,_,4,_,_,8,_,5],
[7,8,9,_,5,_,_,_,_],
[_,_,_,_,_,6,2,_,3],
[8,_,1,_,_,_,7,_,_],
[_,_,_,1,2,3,_,8,_],
[2,_,5,_,_,_,_,_,9]].
problem(2, P) :- % shokyuu
P = [[_,_,2,_,3,_,1,_,_],
[_,4,_,_,_,_,_,3,_],
[1,_,5,_,_,_,_,8,2],
[_,_,_,2,_,_,6,5,_],
[9,_,_,_,8,7,_,_,3],
[_,_,_,_,4,_,_,_,_],
[8,_,_,_,7,_,_,_,4],
[_,9,3,1,_,_,_,6,_],
[_,_,7,_,6,_,5,_,_]].
problem(3, P) :-
P = [[1,_,_,_,_,_,_,_,_],
[_,_,2,7,4,_,_,_,_],
[_,_,_,5,_,_,_,_,4],
[_,3,_,_,_,_,_,_,_],
[7,5,_,_,_,_,_,_,_],
[_,_,_,_,_,9,6,_,_],
[_,4,_,_,_,6,_,_,_],
[_,_,_,_,_,_,_,7,1],
[_,_,_,_,_,1,_,3,_]].
main:-
problem(1, P),
solve_sudoku(P),
:- main.
Oi0gc2V0X3Byb2xvZ19mbGFnKHZlcmJvc2Usc2lsZW50KS4KOi0gcHJvbXB0KF8sICcnKS4KOi0gdXNlX21vZHVsZShsaWJyYXJ5KHJlYWR1dGlsKSkuCjotIHVzZV9tb2R1bGUobGlicmFyeShjbHBmZCkpLgoKc3Vkb2t1KFJvd3MpIDotCiAgICAgICAgbGVuZ3RoKFJvd3MsIDkpLCBtYXBsaXN0KGxlbmd0aF8oOSksIFJvd3MpLAogICAgICAgIGFwcGVuZChSb3dzLCBWcyksIFZzIGlucyAxLi45LAogICAgICAgIG1hcGxpc3QoYWxsX2Rpc3RpbmN0LCBSb3dzKSwKICAgICAgICB0cmFuc3Bvc2UoUm93cywgQ29sdW1ucyksIG1hcGxpc3QoYWxsX2Rpc3RpbmN0LCBDb2x1bW5zKSwKICAgICAgICBSb3dzID0gW0EsQixDLEQsRSxGLEcsSCxJXSwKICAgICAgICBibG9ja3MoQSwgQiwgQyksIGJsb2NrcyhELCBFLCBGKSwgYmxvY2tzKEcsIEgsIEkpLgoKbGVuZ3RoXyhMLCBMcykgOi0gbGVuZ3RoKExzLCBMKS4KCmJsb2NrcyhbXSwgW10sIFtdKS4KYmxvY2tzKFtOMSxOMixOM3xOczFdLCBbTjQsTjUsTjZ8TnMyXSwgW043LE44LE45fE5zM10pIDotCiAgICAgICAgYWxsX2Rpc3RpbmN0KFtOMSxOMixOMyxONCxONSxONixONyxOOCxOOV0pLAogICAgICAgIGJsb2NrcyhOczEsIE5zMiwgTnMzKS4KCgolJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCgpzaG93X3N1ZG9rdShQdXp6bGUpIDotCiAgICBtYXBsaXN0KGxhYmVsLCBQdXp6bGUpLCBtYXBsaXN0KHBvcnRyYXlfY2xhdXNlLCBQdXp6bGUpLgpnZW5fc3Vkb2t1KFB1enpsZSkgOi0gc3Vkb2t1KFB1enpsZSksIHNob3dfc3Vkb2t1KFB1enpsZSkuCnNvbHZlX3N1ZG9rdShQdXp6bGUpIDotIHN1ZG9rdShQdXp6bGUpLCBzaG93X3N1ZG9rdShQdXp6bGUpLgoKcHJvYmxlbSgxLCBQKSA6LSAlIHNob2t5dXUKICAgICAgICBQID0gW1sxLF8sXyw4LF8sNCxfLF8sX10sCiAgICAgICAgICAgICBbXywyLF8sXyxfLF8sNCw1LDZdLAogICAgICAgICAgICAgW18sXywzLDIsXyw1LF8sXyxfXSwKICAgICAgICAgICAgIFtfLF8sXyw0LF8sXyw4LF8sNV0sCiAgICAgICAgICAgICBbNyw4LDksXyw1LF8sXyxfLF9dLAogICAgICAgICAgICAgW18sXyxfLF8sXyw2LDIsXywzXSwKICAgICAgICAgICAgIFs4LF8sMSxfLF8sXyw3LF8sX10sCiAgICAgICAgICAgICBbXyxfLF8sMSwyLDMsXyw4LF9dLAogICAgICAgICAgICAgWzIsXyw1LF8sXyxfLF8sXyw5XV0uCgoKcHJvYmxlbSgyLCBQKSA6LSAgJSBzaG9reXV1CiAgICAgICAgUCA9IFtbXyxfLDIsXywzLF8sMSxfLF9dLAogICAgICAgICAgICAgW18sNCxfLF8sXyxfLF8sMyxfXSwKICAgICAgICAgICAgIFsxLF8sNSxfLF8sXyxfLDgsMl0sCiAgICAgICAgICAgICBbXyxfLF8sMixfLF8sNiw1LF9dLAogICAgICAgICAgICAgWzksXyxfLF8sOCw3LF8sXywzXSwKICAgICAgICAgICAgIFtfLF8sXyxfLDQsXyxfLF8sX10sCiAgICAgICAgICAgICBbOCxfLF8sXyw3LF8sXyxfLDRdLAogICAgICAgICAgICAgW18sOSwzLDEsXyxfLF8sNixfXSwKICAgICAgICAgICAgIFtfLF8sNyxfLDYsXyw1LF8sX11dLgoKcHJvYmxlbSgzLCBQKSA6LQogICAgICAgIFAgPSBbWzEsXyxfLF8sXyxfLF8sXyxfXSwKICAgICAgICAgICAgIFtfLF8sMiw3LDQsXyxfLF8sX10sCiAgICAgICAgICAgICBbXyxfLF8sNSxfLF8sXyxfLDRdLAogICAgICAgICAgICAgW18sMyxfLF8sXyxfLF8sXyxfXSwKICAgICAgICAgICAgIFs3LDUsXyxfLF8sXyxfLF8sX10sCiAgICAgICAgICAgICBbXyxfLF8sXyxfLDksNixfLF9dLAogICAgICAgICAgICAgW18sNCxfLF8sXyw2LF8sXyxfXSwKICAgICAgICAgICAgIFtfLF8sXyxfLF8sXyxfLDcsMV0sCiAgICAgICAgICAgICBbXyxfLF8sXyxfLDEsXywzLF9dXS4KCgoKCm1haW46LQoJcHJvYmxlbSgxLCBQKSwKCXNvbHZlX3N1ZG9rdShQKSwKCWhhbHQuCgo6LSBtYWluLgo=