Skip to content

Instantly share code, notes, and snippets.

@hectr
Created December 3, 2024 21:22
Show Gist options
  • Save hectr/a428a85131480944bf2d8539cda34057 to your computer and use it in GitHub Desktop.
Save hectr/a428a85131480944bf2d8539cda34057 to your computer and use it in GitHub Desktop.
Brute-force sudoku solver
% Define digits from 1 to 9
digit(1).
digit(2).
digit(3).
digit(4).
digit(5).
digit(6).
digit(7).
digit(8).
digit(9).
% Decrement rules
decrement(2,1).
decrement(3,2).
decrement(4,3).
decrement(5,4).
decrement(6,5).
decrement(7,6).
decrement(8,7).
decrement(9,8).
% Define is_not_one
is_not_one(2).
is_not_one(A) :- decrement(A, AA), is_not_one(AA).
% Define less_than
less_than(1,A) :- is_not_one(A).
less_than(A,B) :- decrement(A, AA), decrement(B, BB), less_than(AA, BB).
% Define greater_than
greater_than(A,1) :- is_not_one(A).
greater_than(A,B) :- decrement(A, AA), decrement(B, BB), greater_than(AA, BB).
% Define is_different
is_different(A,B) :- less_than(A,B).
is_different(A,B) :- greater_than(A,B).
% Ensure nine different digits
different9(A,B,C,D,E,F,G,H,I) :-
is_different(A,B), is_different(A,C), is_different(A,D), is_different(A,E), is_different(A,F), is_different(A,G), is_different(A,H), is_different(A,I),
is_different(B,C), is_different(B,D), is_different(B,E), is_different(B,F), is_different(B,G), is_different(B,H), is_different(B,I),
is_different(C,D), is_different(C,E), is_different(C,F), is_different(C,G), is_different(C,H), is_different(C,I),
is_different(D,E), is_different(D,F), is_different(D,G), is_different(D,H), is_different(D,I),
is_different(E,F), is_different(E,G), is_different(E,H), is_different(E,I),
is_different(F,G), is_different(F,H), is_different(F,I),
is_different(G,H), is_different(G,I),
is_different(H,I).
% Sudoku solver
sudoku(
A1,A2,A3,A4,A5,A6,A7,A8,A9,
B1,B2,B3,B4,B5,B6,B7,B8,B9,
C1,C2,C3,C4,C5,C6,C7,C8,C9,
D1,D2,D3,D4,D5,D6,D7,D8,D9,
E1,E2,E3,E4,E5,E6,E7,E8,E9,
F1,F2,F3,F4,F5,F6,F7,F8,F9,
G1,G2,G3,G4,G5,G6,G7,G8,G9,
H1,H2,H3,H4,H5,H6,H7,H8,H9,
I1,I2,I3,I4,I5,I6,I7,I8,I9
) :-
% Assign digits to variables
digit(A1), digit(A2), digit(A3), digit(A4), digit(A5), digit(A6), digit(A7), digit(A8), digit(A9),
digit(B1), digit(B2), digit(B3), digit(B4), digit(B5), digit(B6), digit(B7), digit(B8), digit(B9),
digit(C1), digit(C2), digit(C3), digit(C4), digit(C5), digit(C6), digit(C7), digit(C8), digit(C9),
digit(D1), digit(D2), digit(D3), digit(D4), digit(D5), digit(D6), digit(D7), digit(D8), digit(D9),
digit(E1), digit(E2), digit(E3), digit(E4), digit(E5), digit(E6), digit(E7), digit(E8), digit(E9),
digit(F1), digit(F2), digit(F3), digit(F4), digit(F5), digit(F6), digit(F7), digit(F8), digit(F9),
digit(G1), digit(G2), digit(G3), digit(G4), digit(G5), digit(G6), digit(G7), digit(G8), digit(G9),
digit(H1), digit(H2), digit(H3), digit(H4), digit(H5), digit(H6), digit(H7), digit(H8), digit(H9),
digit(I1), digit(I2), digit(I3), digit(I4), digit(I5), digit(I6), digit(I7), digit(I8), digit(I9),
% Ensure all Rows have distinct values
different9(A1,A2,A3,A4,A5,A6,A7,A8,A9),
different9(B1,B2,B3,B4,B5,B6,B7,B8,B9),
different9(C1,C2,C3,C4,C5,C6,C7,C8,C9),
different9(D1,D2,D3,D4,D5,D6,D7,D8,D9),
different9(E1,E2,E3,E4,E5,E6,E7,E8,E9),
different9(F1,F2,F3,F4,F5,F6,F7,F8,F9),
different9(G1,G2,G3,G4,G5,G6,G7,G8,G9),
different9(H1,H2,H3,H4,H5,H6,H7,H8,H9),
different9(I1,I2,I3,I4,I5,I6,I7,I8,I9),
% Ensure all Columns have distinct values
different9(A1,B1,C1,D1,E1,F1,G1,H1,I1),
different9(A2,B2,C2,D2,E2,F2,G2,H2,I2),
different9(A3,B3,C3,D3,E3,F3,G3,H3,I3),
different9(A4,B4,C4,D4,E4,F4,G4,H4,I4),
different9(A5,B5,C5,D5,E5,F5,G5,H5,I5),
different9(A6,B6,C6,D6,E6,F6,G6,H6,I6),
different9(A7,B7,C7,D7,E7,F7,G7,H7,I7),
different9(A8,B8,C8,D8,E8,F8,G8,H8,I8),
different9(A9,B9,C9,D9,E9,F9,G9,H9,I9),
% Ensure all Subgrids have distinct values
different9(A1,A2,A3,B1,B2,B3,C1,C2,C3),
different9(A4,A5,A6,B4,B5,B6,C4,C5,C6),
different9(A7,A8,A9,B7,B8,B9,C7,C8,C9),
different9(D1,D2,D3,E1,E2,E3,F1,F2,F3),
different9(D4,D5,D6,E4,E5,E6,F4,F5,F6),
different9(D7,D8,D9,E7,E8,E9,F7,F8,F9),
different9(G1,G2,G3,H1,H2,H3,I1,I2,I3),
different9(G4,G5,G6,H4,H5,H6,I4,I5,I6),
different9(G7,G8,G9,H7,H8,H9,I7,I8,I9).
@hectr
Copy link
Author

hectr commented Dec 4, 2024

Usage example:

sudoku(4,3,5, 2,6,9, 7,8,A9, % 1
    6,B2,2, 5,7,1, 4,9,3, % 8
    C1,9,7, 8,3,4, 5,6,2, % 1
    8,2,6, D4,9,5, 3,4,7, % 1
    3,7,4, 6,8,2, E7,1,5, % 9
    9,5,F3, 7,4,3, 6,2,8, % 1
    5,1,9, 3,2,6, G7,7,4, % 8
    2,4,8, 9,5,H6, 1,3,6, % 7
    7,6,3, I4,1,8, 2,5,9) % 4

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment