In the following example, the domain of the variables x1, x4, x5, x6, x9, x11, x12, x14, x16, x17 is unrestricted, i.e. values of the set {1, ..., 9} ( in the first two rows). By contrast, the domain of the variables in the first two rows, that are not already mentioned above, is determined.
A Sudoku Puzzle | ||||||||
2 | 6 | 8 | 1 | |||||
3 | 7 | 8 | 6 | |||||
4 | 5 | 7 | ||||||
5 | 1 | 7 | 9 | |||||
3 | 9 | 5 | 1 | |||||
4 | 3 | 2 | 5 | |||||
1 | 3 | 2 | ||||||
5 | 2 | 4 | 9 | |||||
3 | 8 | 4 | 6 |
(* the inputlist is a list of triples(a,b,c) where (a,b) is the address of the variable in the grid and c is its value *) val inputlist=[(0,1,2),(0,2,6),(0,6,8),(0,7,1),(1,0,3), (1,3,7),(1,5,8),(1,8,6),(2,0,4),(2,4,5), (2,8,7),(3,1,5),(3,3,1),(3,5,7),(3,7,9), (4,2,3),(4,3,9),(4,5,5),(4,6,1),(5,1,4), (5,3,3),(5,5,2),(5,7,5),(6,0,1),(6,4,3), (6,8,2),(7,0,5),(7,3,2),(7,5,4),(7,8,9), (8,1,3),(8,2,8),(8,6,4),(8,7,6)] fun sudoku1 inputlist space = let val grid = Vector.tabulate(9,fn x => FD.rangeVec(space,9,(1,9))) val grid' = Vector.concat(Vector.toList(grid)) fun flatten([])= [] | flatten(x::xs)= x@flatten(xs) (* box constructs a list of elements representing one 3 x 3 box *) fun box(x,y)= flatten(List.tabulate(3,fn k => List.tabulate(3,fn z =>(k+x,z+y)))) in (* use next constraint,only when imputlist is used; updates the values from inputlist to grid *) List.app(fn(x,y,z) => FD.relI(space, Vector.sub(Vector.sub(grid,x),y),FD.EQ,z))inputlist; (* distinct values in rows *) Vector.app(fn x => FD.distinct(space,x,FD.DOM))grid; (* distinct values in columns *) Vector.appi(fn(i,y)=> FD.distinct(space,Vector.map (fn x => Vector.sub(x,i))grid,FD.DOM))grid; (* distinct values in 3 x 3 boxes *) Vector.app(fn(k,l)=> let val box' = Vector.map(fn(x,y) => Vector.sub(Vector.sub(grid,x),y)) (Vector.fromList(box(k,l))) in FD.distinct(space,box',FD.DOM) end) (#[(0,0),(0,3),(0,6),(3,0),(3,3),(3,6),(6,0),(6,3),(6,6)]); FD.branch(space,grid',FD.B_MIN_MIN,FD.B_SPLIT_MIN); grid end
Given this input list, the problem has an unique solution and can be solved without any search at all.
Andreas Rossberg 2006-08-28