# Create the board. Link together the squares. sp {create-sudoku-board (state ^superstate nil) --> ( ^board ) ( ^square ^square ^square ^square ^square ^square ^square ^square ^square ) ( ^right ^down ^row 1 ^column 1) #first row ( ^right ^left ^down ^row 1 ^column 2) ( ^right ^left ^down ^row 1 ^column 3) ( ^right ^left ^down ^row 1 ^column 4) ( ^right ^left ^down ^row 1 ^column 5) ( ^right ^left ^down ^row 1 ^column 6) ( ^right ^left ^down ^row 1 ^column 7) ( ^right ^left ^down ^row 1 ^column 8) ( ^left ^down ^row 1 ^column 9) ( ^right ^down ^up ^row 2 ^column 1) #second row ( ^right ^left ^down ^up ^row 2 ^column 2) ( ^right ^left ^down ^up ^row 2 ^column 3) ( ^right ^left ^down ^up ^row 2 ^column 4) ( ^right ^left ^down ^up ^row 2 ^column 5) ( ^right ^left ^down ^up ^row 2 ^column 6) ( ^right ^left ^down ^up ^row 2 ^column 7) ( ^right ^left ^down ^up ^row 2 ^column 8) ( ^left ^down ^up ^row 2 ^column 9) ( ^right ^down ^up ^row 3 ^column 1) #third row ( ^right ^left ^down ^up ^row 3 ^column 2) ( ^right ^left ^down ^up ^row 3 ^column 3) ( ^right ^left ^down ^up ^row 3 ^column 4) ( ^right ^left ^down ^up ^row 3 ^column 5) ( ^right ^left ^down ^up ^row 3 ^column 6) ( ^right ^left ^down ^up ^row 3 ^column 7) ( ^right ^left ^down ^up ^row 3 ^column 8) ( ^left ^down ^up ^row 3 ^column 9) ( ^right ^down ^up ^row 4 ^column 1) #fourth row ( ^right ^left ^down ^up ^row 4 ^column 2) ( ^right ^left ^down ^up ^row 4 ^column 3) ( ^right ^left ^down ^up ^row 4 ^column 4) ( ^right ^left ^down ^up ^row 4 ^column 5) ( ^right ^left ^down ^up ^row 4 ^column 6) ( ^right ^left ^down ^up ^row 4 ^column 7) ( ^right ^left ^down ^up ^row 4 ^column 8) ( ^left ^down ^up ^row 4 ^column 9) ( ^right ^down ^up ^row 5 ^column 1) #fifth row ( ^right ^left ^down ^up ^row 5 ^column 2) ( ^right ^left ^down ^up ^row 5 ^column 3) ( ^right ^left ^down ^up ^row 5 ^column 4) ( ^right ^left ^down ^up ^row 5 ^column 5) ( ^right ^left ^down ^up ^row 5 ^column 6) ( ^right ^left ^down ^up ^row 5 ^column 7) ( ^right ^left ^down ^up ^row 5 ^column 8) ( ^left ^down ^up ^row 5 ^column 9) ( ^right ^down ^up ^row 6 ^column 1) #sixth row ( ^right ^left ^down ^up ^row 6 ^column 2) ( ^right ^left ^down ^up ^row 6 ^column 3) ( ^right ^left ^down ^up ^row 6 ^column 4) ( ^right ^left ^down ^up ^row 6 ^column 5) ( ^right ^left ^down ^up ^row 6 ^column 6) ( ^right ^left ^down ^up ^row 6 ^column 7) ( ^right ^left ^down ^up ^row 6 ^column 8) ( ^left ^down ^up ^row 6 ^column 9) ( ^right ^down ^up ^row 7 ^column 1) #seventh row ( ^right ^left ^down ^up ^row 7 ^column 2) ( ^right ^left ^down ^up ^row 7 ^column 3) ( ^right ^left ^down ^up ^row 7 ^column 4) ( ^right ^left ^down ^up ^row 7 ^column 5) ( ^right ^left ^down ^up ^row 7 ^column 6) ( ^right ^left ^down ^up ^row 7 ^column 7) ( ^right ^left ^down ^up ^row 7 ^column 8) ( ^left ^down ^up ^row 7 ^column 9) ( ^right ^down ^up ^row 8 ^column 1) #eighth row ( ^right ^left ^down ^up ^row 8 ^column 2) ( ^right ^left ^down ^up ^row 8 ^column 3) ( ^right ^left ^down ^up ^row 8 ^column 4) ( ^right ^left ^down ^up ^row 8 ^column 5) ( ^right ^left ^down ^up ^row 8 ^column 6) ( ^right ^left ^down ^up ^row 8 ^column 7) ( ^right ^left ^down ^up ^row 8 ^column 8) ( ^left ^down ^up ^row 8 ^column 9) ( ^right ^up ^up ^row 9 ^column 1) #ninth row ( ^right ^left ^up ^up ^row 9 ^column 2) ( ^right ^left ^up ^up ^row 9 ^column 3) ( ^right ^left ^up ^up ^row 9 ^column 4) ( ^right ^left ^up ^up ^row 9 ^column 5) ( ^right ^left ^up ^up ^row 9 ^column 6) ( ^right ^left ^up ^up ^row 9 ^column 7) ( ^right ^left ^up ^up ^row 9 ^column 8) ( ^left ^up ^up ^row 9 ^column 9)} # Copy puzzle numbers to the squares. sp {elaborate*init*puzzle (state ^board.square ^puzzle ) ( ^row ^column ) ( ^value (^row ^column ^contents ) ) --> ( ^contents )} # Fill blanks in empty puzzle squares. sp {elaborate*init*puzzle*blanks (state ^board.square ^puzzle ) ( ^row ^column ) - ( ^value (^row ^column ) ) --> ( ^contents B)} # Label each square with the group it's in. sp {elaborate*group1 (state ^board.square ) ( ^row { <= 3 } ^column { <= 3 } ) --> ( ^group 1)} sp {elaborate*group2 (state ^board.square ) ( ^row { <= 3 } ^column { >= 4 <= 6 } ) --> ( ^group 2)} sp {elaborate*group3 (state ^board.square ) ( ^row { <= 3 } ^column { >= 7 } ) --> ( ^group 3)} sp {elaborate*group4 (state ^board.square ) ( ^row { >= 4 <= 6 } ^column { <= 3 } ) --> ( ^group 4)} sp {elaborate*group5 (state ^board.square ) ( ^row { >= 4 <= 6 } ^column { >= 4 <= 6 } ) --> ( ^group 5)} sp {elaborate*group6 (state ^board.square ) ( ^row { >= 4 <= 6 } ^column { >= 7 } ) --> ( ^group 6)} sp {elaborate*group7 (state ^board.square ) ( ^row { >= 7 } ^column { <= 3 } ) --> ( ^group 7)} sp {elaborate*group8 (state ^board.square ) ( ^row { >= 7 } ^column { >= 4 <= 6 } ) --> ( ^group 8)} sp {elaborate*group9 (state ^board.square ) ( ^row { >= 7 } ^column { >= 7 } ) --> ( ^group 9)} # Soar needs to know the numbers from 1 to 9. sp {elaborate*integers*from*1*to*9 (state ^superstate nil) --> ( ^integer 1 2 3 4 5 6 7 8 9 )} # Basic operator to fill in a number in a blank square. sp {propose*fill*in*number (state ^board ^integer ) ( ^square ) ( ^contents B ^row ^column ^group ) - { ( ^square ) #if this number is not already on the same row ( ^row ^contents ) } - { ( ^square ) #if this number is not already on the same column ( ^column ^contents ) } - { ( ^square ) #if this number is not already in the same group ( ^group ^contents ) } --> ( ^operator + = ) ( ^name fill-in ^square ^value )} sp {apply*fill*in*number (state ^operator ^board ) ( ^name fill-in ^square ^value ) ( ^contents B ^row ^column ) --> (write (crlf) | Putting number | | into row: | | column: | ) ( ^contents B - ) #change the number ( ^print yes) #set the printing flag } #sp {propose*print*board # (state ^board.print yes) #--> # ( ^operator + > = ) # ( ^name print-board)} sp {prefer*print*to*fill-in (state ^operator + ^operator + ) ( ^name print-board) ( ^name fill-in) --> ( ^operator > )} # Puzzle solved. Print and halt. sp {propose*halt*success (state ^board ) - ( ^square.contents B) --> ( ^operator + > = ) ( ^name halt-success)} sp {apply*halt*success (state ^operator.name halt-success) --> (write (crlf) | Puzzle solved! | ) (halt)} # Cannot complete this partial solution. Give up. sp {propose*halt*failure (state ^board ) - { ( ^operator + ) ( ^name fill-in) } ( ^square.contents B) --> ( ^operator + = ) ( ^name halt-failure)} sp {apply*halt*failure (state ^operator.name halt-failure) --> (write (crlf) | I failed to solve the puzzle. Sorry. | ) (halt)}