prolog中字母表求解器的数独
但这解决了一个包含1到9个数字的数独问题,我需要做一些事情将1到9转换成一个to I 我想的是遍历网格中的每个元素,并相应地检查值,然后用相应的字母表替换它 我如何遍历和替换这些数字,或者是否有更好的方法来解决这个问题 错误:prolog中字母表求解器的数独,prolog,backtracking,sudoku,Prolog,Backtracking,Sudoku,但这解决了一个包含1到9个数字的数独问题,我需要做一些事情将1到9转换成一个to I 我想的是遍历网格中的每个元素,并相应地检查值,然后用相应的字母表替换它 我如何遍历和替换这些数字,或者是否有更好的方法来解决这个问题 错误: 谢谢D要将1..9间隔中的数字转换为A..I间隔中的字母,可以使用以下目标: :- use_module(library(clpfd)). go(Rows):- foreach(J in 1..9, K in 1..9, Number = Rows[J,K],
谢谢D要将
1..9
间隔中的数字转换为A..I
间隔中的字母,可以使用以下目标:
:- use_module(library(clpfd)).
go(Rows):-
foreach(J in 1..9, K in 1..9, Number = Rows[J,K],
Code is 0'A + Number - 1, char_code(Letter, Code), Rows[J,K] is Letter,nl)
sudoku(Rows) :-
append(Rows, Vs), Vs ins 1..9,
maplist(all_distinct, Rows),
transpose(Rows, Columns),
maplist(all_distinct, Columns),
Rows = [A,B,C,D,E,F,G,H,I],
blocks(A, B, C),
blocks(D, E, F),
blocks(G, H, I),
maplist(label, Rows),
blocks([], [], []).
blocks([A,B,C|Bs1], [D,E,F|Bs2], [G,H,I|Bs3]) :-
all_distinct([A,B,C,D,E,F,G,H,I]),
blocks(Bs1, Bs2, Bs3).
例如:
Code is 0'A + Number - 1, char_code(Letter, Code)
假设解决方案矩阵由列表列表表示,则可以使用以下方法完成转换:
?- Number = 4, Code is 0'A + Number - 1, char_code(Letter, Code).
Number = 4,
Code = 68,
Letter = 'D'.
但是可以使用
maplist
谓词简化转换代码。我把它留给你做练习。提示:定义一个辅助谓词,它接受一个数字并返回相应的字母。还有,如何在2d矩阵中用其字母等价物覆盖该数字?不能覆盖数字。只需使用maplist
谓词或编写递归遍历2d矩阵的代码,将数字解映射为字母解即可。如果你卡住了,试着用你的代码编辑问题。go(Rows):-foreach(1..9中的J,1..9中的K,Number=Rows[J,K],code是0'a+Number-1,char_code(字母,代码),Rows[J,K]是字母,nl)。
请不要在注释中写代码解决方案。相反,编辑您的原始帖子并在那里添加代码。谢谢。更新了我的答案,为转换谓词提供了一个可移植的替代方案。您是否有机会使用Prolog系统并参考其他Prolog系统的参考资料?这可以解释这个错误。
convert_matrix([], []).
convert_matrix([Row| Rows], [ConvertedRow| ConvertedRows]) :-
convert_row(Row, ConvertedRow),
convert_matrix(Rows, ConvertedRows).
convert_row([], []).
convert_row([Number| Numbers], [Letter| Letters]) :-
Code is 0'A + Number - 1,
char_code(Letter, Code),
convert_row(Numbers, Letters).