Eclipse-clp 中的 nth1 谓词可能存在错误?
Possible bug with nth1 predicate in Eclipse-clp?
我正在用 Prolog 编写数独求解器。数独本身作为向量的向量给出:
P =
[[1,_,_, _,_,_, _,_,_],
[_,_,2, 7,4,_, _,_,_],
[_,_,_, 5,_,_, _,_,4],
[_,3,_, _,_,_, _,_,_],
[7,5,_, _,_,_, _,_,_],
[_,_,_, _,_,9, 6,_,_],
[_,4,_, _,_,6, _,_,_],
[_,_,_, _,_,_, _,7,1],
[_,_,_, _,_,1, _,3,_]].
我正在使用以下代码将其转换为矩阵:
convert_to_matrix(P, Puzzle) :-
dim(Puzzle, [9, 9]), % create square matrix
( multifor([I, J], 1, 9), % fill array
param(P, Puzzle)
do
nth1(I, P, RowI),
nth1(J, RowI, Elem),
subscript(Puzzle, [I , J], Elem)
).
这对于前 8 行和列工作正常,但每次 I 或 J 为 9 时都会失败。执行 nth1(9, P, RowI) 会使 RowI 成为一个全新的变量,而不是第 9 个 vector/row.执行 nth1(9,RowI, Elem) 不会 return 第 9 个元素(对于第 8 行,它应该 return 1,但 return 是一个新变量)。这是 Eclipse-clp 中的错误还是我遗漏了什么?
你完全正确,这确实是 nth1/3 中的一个错误,在 7.0#45 版本中引入并且只存在!您可以将代码替换为
lol_matrix(Xss, M) :-
length(Xss, N),
dim(M, [N,N]),
( foreach(Xs,Xss), foreacharg(Row,M) do
array_list(Row, Xs)
).
然而,最简单的方法是直接将数据写成矩阵(如本 example code 中所做的),那么您根本不需要任何转换:
P = []([](1,_,_, _,_,_, _,_,_),
[](_,_,2, 7,4,_, _,_,_),
...
[](_,_,_, _,_,1, _,3,_)).
顺便说一句,可以通过 eclipse-clp-bugs@lists.sf.net
报告 ECLiPSe 错误
我正在用 Prolog 编写数独求解器。数独本身作为向量的向量给出:
P =
[[1,_,_, _,_,_, _,_,_],
[_,_,2, 7,4,_, _,_,_],
[_,_,_, 5,_,_, _,_,4],
[_,3,_, _,_,_, _,_,_],
[7,5,_, _,_,_, _,_,_],
[_,_,_, _,_,9, 6,_,_],
[_,4,_, _,_,6, _,_,_],
[_,_,_, _,_,_, _,7,1],
[_,_,_, _,_,1, _,3,_]].
我正在使用以下代码将其转换为矩阵:
convert_to_matrix(P, Puzzle) :-
dim(Puzzle, [9, 9]), % create square matrix
( multifor([I, J], 1, 9), % fill array
param(P, Puzzle)
do
nth1(I, P, RowI),
nth1(J, RowI, Elem),
subscript(Puzzle, [I , J], Elem)
).
这对于前 8 行和列工作正常,但每次 I 或 J 为 9 时都会失败。执行 nth1(9, P, RowI) 会使 RowI 成为一个全新的变量,而不是第 9 个 vector/row.执行 nth1(9,RowI, Elem) 不会 return 第 9 个元素(对于第 8 行,它应该 return 1,但 return 是一个新变量)。这是 Eclipse-clp 中的错误还是我遗漏了什么?
你完全正确,这确实是 nth1/3 中的一个错误,在 7.0#45 版本中引入并且只存在!您可以将代码替换为
lol_matrix(Xss, M) :-
length(Xss, N),
dim(M, [N,N]),
( foreach(Xs,Xss), foreacharg(Row,M) do
array_list(Row, Xs)
).
然而,最简单的方法是直接将数据写成矩阵(如本 example code 中所做的),那么您根本不需要任何转换:
P = []([](1,_,_, _,_,_, _,_,_),
[](_,_,2, 7,4,_, _,_,_),
...
[](_,_,_, _,_,1, _,3,_)).
顺便说一句,可以通过 eclipse-clp-bugs@lists.sf.net
报告 ECLiPSe 错误