Skip to content

Instantly share code, notes, and snippets.

@DavideCanton
Last active June 16, 2021 21:58
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DavideCanton/02da758389c4c49d4696 to your computer and use it in GitHub Desktop.
Save DavideCanton/02da758389c4c49d4696 to your computer and use it in GitHub Desktop.
Sudoku solver with Clingo
cell_index(0..8).
cell_value(1..9).
% fill with initial values
initial_pos(0, 3, 4).
initial_pos(0, 6, 1).
initial_pos(0, 7, 5).
initial_pos(1, 1, 8).
initial_pos(1, 2, 1).
initial_pos(1, 3, 9).
initial_pos(1, 6, 7).
initial_pos(2, 0, 9).
initial_pos(2, 1, 3).
initial_pos(2, 5, 7).
initial_pos(2, 6, 6).
initial_pos(3, 4, 7).
initial_pos(3, 5, 2).
initial_pos(3, 8, 3).
initial_pos(4, 0, 8).
initial_pos(4, 2, 2).
initial_pos(4, 7, 1).
initial_pos(5, 1, 7).
initial_pos(5, 2, 6).
initial_pos(5, 3, 8).
initial_pos(5, 8, 5).
initial_pos(6, 1, 9).
initial_pos(6, 4, 4).
initial_pos(6, 5, 1).
initial_pos(6, 8, 8).
initial_pos(7, 0, 1).
initial_pos(7, 2, 8).
initial_pos(7, 7, 7).
initial_pos(7, 8, 6).
initial_pos(8, 0, 7).
initial_pos(8, 4, 3).
initial_pos(8, 6, 9).
initial_pos(I, J) :- initial_pos(I, J, _).
empty(I, J) :- cell_index(I), cell_index(J), not initial_pos(I, J).
sudoku_value(I, J, V) :- initial_pos(I, J, V).
1 { sudoku_value(I, J, V) : cell_value(V) } 1 :- empty(I, J).
sq_index(I, N) :- cell_index(I), M = I / 3, N = M * 3.
same_sq(I, I1) :- cell_index(I), cell_index(I1), sq_index(I, IS), sq_index(I1, IS).
:- cell_index(I), sudoku_value(I, J, V), sudoku_value(I, J1, V), J != J1.
:- cell_index(J), sudoku_value(I, J, V), sudoku_value(I1, J, V), I != I1.
:- same_sq(I, I1), same_sq(J, J1), I != I1, sudoku_value(I, J, V), sudoku_value(I1, J1, V).
:- same_sq(I, I1), same_sq(J, J1), J != J1, sudoku_value(I, J, V), sudoku_value(I1, J1, V).
#hide.
#show sudoku_value/3.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment