Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog Eclipse clp中nth1谓词可能存在错误?_Prolog_Eclipse Clp - Fatal编程技术网

Prolog Eclipse clp中nth1谓词可能存在错误?

Prolog Eclipse clp中nth1谓词可能存在错误?,prolog,eclipse-clp,Prolog,Eclipse Clp,我正在用Prolog写一个数独解算器。数独本身是一个向量向量: P = [[1,_,_, _,_,_, _,_,_], [_,_,2, 7,4,_, _,_,_], [_,_,_, 5,_,_, _,_,4], [_,3,_, _,_,_, _,_,_], [7,5,_, _,_,_, _,_,_], [_,_,_, _,_,9, 6,_,_], [_,4,_, _,_,6, _,_,_], [_,_,_, _,_

我正在用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,但会返回一个新变量)。这是Eclipse clp中的一个bug,还是我遗漏了什么?

您完全正确,这确实是nth1/3中的一个bug,它是在7.0#45版本中引入的,并且只在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)
    ).
但是,最简单的方法是将数据直接写入矩阵(如本文所述),这样就根本不需要任何转换:

P = []([](1,_,_, _,_,_, _,_,_),
       [](_,_,2, 7,4,_, _,_,_),
       ...
       [](_,_,_, _,_,1, _,3,_)).
顺便说一下,ECLiPSe bug可以通过ECLiPSe clp报告-bugs@lists.sf.net