- Modify the Sudoku solver to work on six-by-six puzzles (square are 3x2) and 9x9 puzzles
- Make the Sudoku solver print prettier solutions
Note: since I am using SWI Prolog instead of gprolog as used in the book, there are a few differences:
- :- use_module(library(clpfd)). this statement is used at the beginning to import the all_different/1 predicate.
- This predicate is used instead of fd_all_different/1 to check if all list elements are different.
- +Vars ins +Domain is used instead of fd_domain/2 to validate the domain of list elements.
Here's the solution for six-by-six puzzles:
:- use_module(library(clpfd)). valid([]). valid([H|T]) :- all_different(H), valid(T). sudoku(Puzzle, Solution) :- Solution = Puzzle, Puzzle = [ S11, S12, S13, S14, S15, S16, S21, S22, S23, S24, S25, S26, S31, S32, S33, S34, S35, S36, S41, S42, S43, S44, S45, S46, S51, S52, S53, S54, S55, S56, S61, S62, S63, S64, S65, S66 ], Puzzle ins 1..6, Row1 = [S11, S12, S13, S14, S15, S16], Row2 = [S21, S22, S23, S24, S25, S26], Row3 = [S31, S32, S33, S34, S35, S36], Row4 = [S41, S42, S43, S44, S45, S46], Row5 = [S51, S52, S53, S54, S55, S56], Row6 = [S61, S62, S63, S64, S65, S66], Col1 = [S11, S21, S31, S41, S51, S61], Col2 = [S12, S22, S32, S42, S52, S62], Col3 = [S13, S23, S33, S43, S53, S63], Col4 = [S14, S24, S34, S44, S54, S64], Col5 = [S15, S25, S35, S45, S55, S65], Col6 = [S16, S26, S36, S46, S56, S66], Rect1 = [S11, S12, S13, S21, S22, S23], Rect2 = [S14, S15, S16, S24, S25, S26], Rect3 = [S31, S32, S33, S41, S42, S43], Rect4 = [S34, S35, S36, S44, S45, S46], Rect5 = [S51, S52, S53, S61, S62, S63], Rect6 = [S54, S55, S56, S64, S65, S66], valid([Row1, Row2, Row3, Row4, Row5, Row6, Col1, Col2, Col3, Col4, Col5, Col6, Rect1, Rect2, Rect3, Rect4, Rect5, Rect6]). pretty_print(Puzzle) :- writef("\ +-----+ +-----+\n\ |%d %d %d| |%d %d %d|\n\ |%d %d %d| |%d %d %d|\n\ +-----+ +-----+\n\n\ +-----+ +-----+\n\ |%d %d %d| |%d %d %d|\n\ |%d %d %d| |%d %d %d|\n\ +-----+ +-----+\n\n\ +-----+ +-----+\n\ |%d %d %d| |%d %d %d|\n\ |%d %d %d| |%d %d %d|\n\ +-----+ +-----+", Puzzle).