Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % A matrix of 9x9 is represented as a list of lists, where each sub-list represents a row of the matrix.
- % The matrix is filled with numbers from 1 to 9, with 0 representing an empty cell.
- % solve(Puzzle) :- Puzzle is a 9x9 matrix representing a sudoku puzzle.
- % The solution to the puzzle is returned in the variable Solution.
- solve(Puzzle, Solution) :-
- % Convert the matrix into a list of 81 elements, with the empty cells represented as zeros.
- flatten(Puzzle, FlatPuzzle),
- % Create a list of variable names, with each variable representing a cell in the puzzle.
- variables(FlatPuzzle, Vars),
- % Create a list of constraints, representing the rules of sudoku.
- constraints(Vars),
- % Solve the puzzle by finding a satisfying assignment for the variables that satisfies the constraints.
- labeling([ff], Vars),
- % Convert the solution from a list of variables back into a 9x9 matrix.
- matrix(Vars, Solution).
- % variables(FlatPuzzle, Vars) :- Vars is a list of Prolog variables, with each variable representing a cell in the puzzle.
- % The length of the list Vars is equal to the number of cells in the puzzle, and the variables are initialized to the values in FlatPuzzle.
- variables([], []).
- variables([0|Tail], [Var|Vars]) :-
- Var #= 0,
- variables(Tail, Vars).
- variables([Val|Tail], [Var|Vars]) :-
- Var #= Val,
- variables(Tail, Vars).
- % constraints(Vars) :- Vars is a list of Prolog variables representing the cells of a sudoku puzzle.
- % This predicate creates a list of constraints that must be satisfied in order to solve the puzzle.
- constraints(Vars) :-
- % Each row must contain the numbers 1 to 9, without repetitions.
- ( for(I,1,9), param(Vars) do
- Row is Vars[(I-1)*9+1..I*9],
- all_different(Row)
- ),
- % Each column must contain the numbers 1 to 9, without repetitions.
- ( for(I,1,9), param(Vars) do
- Col is Vars[I..81+I-9..9],
- all_different(Col)
- ),
- % Each 3x3 sub-grid must contain the numbers 1 to 9, without repetitions.
- ( for(I,0,2), param(Vars) do
- ( for(J,0,2), param(Vars,I) do
- BlockRowStart is 1 + I*3,
- BlockRowEnd is BlockRowStart + 2,
- BlockColStart is 1 + J*3,
- BlockColEnd is BlockColStart + 2,
- Block is Vars[BlockRowStart..BlockRowEnd][BlockColStart..BlockColEnd],
- flatten(Block, FlattenedBlock),
- all_different(FlattenedBlock)
- )
- ).
- % matrix(Vars, Puzzle) :- Puzzle
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement