将表谓词从b-prolog转换为gprolog

将表谓词从b-prolog转换为gprolog,prolog,predicate,declarative,knights-tour,Prolog,Predicate,Declarative,Knights Tour,为了好玩,我一直在尝试使用Warnsdorf规则在gprolog中编写骑士之旅()解算器 我发现另一篇关于效率的帖子,它在B-prolog中提供了一个解决方案: 我的问题出现在以下部分: :- table warnsdorff(+,+,+,+,+,-,-,min). warnsdorff(R, C, X, Y, Visits, NewX, NewY, Score) :- possible_knight_moves(R, C, X, Y, Visits, NewX, NewY),

为了好玩,我一直在尝试使用Warnsdorf规则在gprolog中编写骑士之旅()解算器

我发现另一篇关于效率的帖子,它在B-prolog中提供了一个解决方案:

我的问题出现在以下部分:

:- table warnsdorff(+,+,+,+,+,-,-,min).
warnsdorff(R, C, X, Y, Visits, NewX, NewY, Score) :-
    possible_knight_moves(R, C, X, Y, Visits, NewX, NewY),
    possible_moves_count(R, C, NewX, NewY, [(NewX, NewY) | Visits], Score).
B-prolog具有表格谓词,而gprolog没有。我在尝试将表部分转换为gprolog时遇到了很大的困难。实际上,该函数应该返回从当前位置的移动,从而使从新位置的可能移动次数最少(随机选择领带)


任何帮助都将不胜感激。干杯

对于这个问题来说,使用表格可能是矫枉过正。由于求解时已执行
访问
列表,因此只需使用memberchk/2即可。我在SWI Prolog中得到了这个解决方案(顺便说一句,这里实现了tabling,但使用链接到的原始编码无法解决这个难题):

如果你愿意,我可以给你看看Warnsdorff规则。我使用setof/3来获得最小计数,加入
可能的移动/7
可能的移动/6

编辑

根据需要:

warnsdorff(R, C, X, Y, Visits, NewX_, NewY_) :-
    setof((Count, NewX, NewY), (
              possible_knight_moves(R, C, X, Y, Visits, NewX, NewY),
              possible_moves_count(R, C, NewX, NewY, [(NewX, NewY) | Visits], Count)
          ), [(_, NewX_, NewY_)|_]).

为了清楚起见,我已经重命名了输出变量NewX_u,NewY_u,但这与此无关-它也与原始命名一起工作。

我同意,但它确实使代码简单得多。如果您能出示您的Warnsdorff规则,我们将不胜感激。我不太明白你在抵销中用了什么作为目标。我想尝试在凌晨2点在序言中思考不是一个好办法。当not子句(\+memberchk((NewX,NewY,vists))被赋予一个已经在列表中的NewX和NewY时,我可能会遇到一些奇怪的问题\u knight\u moves/7返回“no”。在这种情况发生之前,它需要大约15次迭代。您是否修改了其他部分?更正:它失败,因为它找不到其他移动。我之前的评论毫无意义。问问谷歌博士“骑士之旅序言”。有很多解决方案。“为了好玩”类似的问题开始蜂拥而至,这让我觉得这是一种幻想(见和)
warnsdorff(R, C, X, Y, Visits, NewX_, NewY_) :-
    setof((Count, NewX, NewY), (
              possible_knight_moves(R, C, X, Y, Visits, NewX, NewY),
              possible_moves_count(R, C, NewX, NewY, [(NewX, NewY) | Visits], Count)
          ), [(_, NewX_, NewY_)|_]).