Eclipse-clp中nth1谓词的可能错误?

时间:2019-04-21 15:16:47

标签: prolog 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个向量/行。执行nth1(9,RowI,Elem)不会返回第9个元素(对于第8行,它应该返回1,但返回一个新的Variable)。这是Eclipse-clp中的错误,还是我缺少什么?

1 个答案:

答案 0 :(得分:2)

您绝对正确,这确实是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错误