pasteah icon

Untitled

pasteah | PRO | 12/09/22 07:36:19 AM UTC | 0 ⭐ | 13155 👁️ | Never ⏰ | []
Prolog |

2.48 KB

|

None

|

0 👍

/

0 👎

% 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
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎