首页 > 解决方案 > Eclipse-clp 中的 nth1 谓词可能存在错误?

问题描述

我正在 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 中的错误还是我遗漏了什么?

标签: prologeclipse-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)
    ).

但是,最简单的方法是将数据直接写入矩阵(如本示例代码中所做的那样),那么您根本不需要任何转换:

P = []([](1,_,_, _,_,_, _,_,_),
       [](_,_,2, 7,4,_, _,_,_),
       ...
       [](_,_,_, _,_,1, _,3,_)).

顺便说一句,可以通过 eclipse-clp-bugs@lists.sf.net 报告 ECLiPSe 错误


推荐阅读