首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Eclipse-clp中的nth1谓词可能有错误?

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

Stack Overflow用户
提问于 2019-04-21 23:16:47
回答 1查看 58关注 0票数 1

我正在用Prolog写一个数独解算器。数独本身作为向量的向量给出:

代码语言:javascript
复制
P =
    [[1,_,_, _,_,_, _,_,_],
     [_,_,2, 7,4,_, _,_,_],
     [_,_,_, 5,_,_, _,_,4],

     [_,3,_, _,_,_, _,_,_],
     [7,5,_, _,_,_, _,_,_],
     [_,_,_, _,_,9, 6,_,_],

     [_,4,_, _,_,6, _,_,_],
     [_,_,_, _,_,_, _,7,1],
     [_,_,_, _,_,1, _,3,_]].

我用下面的代码将它转换成一个矩阵:

代码语言:javascript
复制
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行和前8列很有效,但每次I或J为9时都会失败。执行nth1( 9,P,RowI)会使RowI成为一个全新的变量,而不是第9个向量/行。执行nth1(9,RowI,Elem)不会返回第9个元素(对于第8行,它应该返回1,但返回一个新变量)。这是Eclipse-clp中的一个bug,还是我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-22 07:26:26

你说得太对了,这确实是nth1/3中的一个bug,只在7.0#45版本中引入!你可以用下面的代码替换你的代码

代码语言:javascript
复制
lol_matrix(Xss, M) :-
    length(Xss, N),
    dim(M, [N,N]),
    ( foreach(Xs,Xss), foreacharg(Row,M) do
        array_list(Row, Xs)
    ).

然而,最简单的方法是直接将数据写成矩阵(就像在这个example code中所做的那样),那么您根本不需要任何转换:

代码语言:javascript
复制
P = []([](1,_,_, _,_,_, _,_,_),
       [](_,_,2, 7,4,_, _,_,_),
       ...
       [](_,_,_, _,_,1, _,3,_)).

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55783988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档