prolog中字母表求解器的数独

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],

但这解决了一个包含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], 
  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).