我必须以包含 9 个向量(每个长度为 9)的向量格式解决数独难题。鉴于向量是 Prolog 中的链表,我认为如果我首先将拼图转换为 2D 数组格式,搜索会更快。
示例拼图:
puzzle(P) :- P =
[[_,_,8,7,_,_,_,_,6],
[4,_,_,_,_,9,_,_,_],
[_,_,_,5,4,6,9,_,_],
[_,_,_,_,_,3,_,5,_],
[_,_,3,_,_,7,6,_,_],
[_,_,_,_,_,_,_,8,9],
[_,7,_,4,_,2,_,_,5],
[8,_,_,9,_,5,_,2,3],
[2,_,9,3,_,8,7,6,_]].
我正在使用 ECLiPSe CLP 来实现求解器。到目前为止,我想出的最好的方法是编写一个这样的域:
domain(P):-
dim(P,[9,9]),
P[1..9,1..9] :: 1..9.
和一个用于拼图的转换器(参数 P 是给定的拼图,Sudoku 是带有二维数组的新定义的网格)。但是我无法将给定初始拼图的值链接到我的二维数组。
convertVectorsToArray(Sudoku,P):-
( for(I,1,9),
param(Sudoku,P)
do
( for(J,1,9),
param(Sudoku,P,I)
do
Sudoku[I,J] is P[I,J]
)
).
在此之前,我尝试使用 array_list ( http://eclipseclp.org/doc/bips/kernel/termmanip/array_list-2.html ),但我不断收到类型错误。我之前是怎么做的:
convertVectorsToArray(Sudoku,P):-
( for(I,1,9),
param(Sudoku,P)
do
( for(J,1,9),
param(Sudoku,P,I)
do
A is Sudoku[I],
array_list(A,P[I])
)
).
当我的数独最终以以下格式输出示例拼图 P 时:
Sudoku = []([](_Var1, _Var2, 8, 7, ..., 6), [](4, ...), ...)
那么我会很开心。
更新
我再次尝试使用 array_list;它几乎适用于以下代码:
convertVectorsToArray(Sudoku,P):-
( for(I,1,9),
param(Sudoku,P)
do
X is Sudoku[I],
Y is P[I],
write(I),nl,
write(X),nl,
write(Y),nl,
array_list(X, Y)
).
那里的写入是为了查看向量/数组的外观。由于某种原因,它在第二次迭代(而不是 9 次)处停止,并将示例拼图的其余部分作为向量的向量输出。只有第一个向量被正确分配。
更新2
虽然我确定 jschimpf 给出的答案是正确的,但我也想出了自己的实现:
convertVectorsToArray(Sudoku,[],_).
convertVectorsToArray(Sudoku,[Y|Rest],Count):-
X is Sudoku[Count],
array_list(X, Y),
NewCount is Count + 1,
convertVectorsToArray(Sudoku,Rest,NewCount).
感谢您对为什么它以前不起作用的补充解释!