我试图在Gprolog中实现Warnsdorff的规则来在任意棋盘上生成游览。我发现了一个SO帖子,在B-prolog中提供了一个很好的解决方案,我只需要翻译Warnsdorff步骤(knight's tour efficient solution)。使用Warnsdorff规则的Gprolog骑士之旅
下面是我实现Warnsdorff步骤:从位置
warnsdorffSelect(X, Y, Row, Col, Past, NewX_, NewY_) :-
setof((Count, NewX, NewY), (
possibleMovesFromPosWithBoard(X, Y, Row, Col, Past, NewX, NewY),
countMoves(NewX, NewY, Row, Col, [(NewX, NewY) | Past], Count).
), [(_, NewX_, NewY_)|_]).
possibleMovesFromPosWithBoard/7返回所有的法律动作和countMoves/6返回的从位置移动数。
我的问题发生在函数未能选择导致从新位置移动的最小数目的移动,而是选择返回结果列表中的第一个移动(也就是说,它没有出现被分类)。最后,该计划总是会导致“否”,因为它将自己背上了一个角落。
在此先感谢!
我们有这个[片刻](http://stackoverflow.com/questions/43600928/translating-a-tabled-predicate-from-b -prolog-to-gprolog?s = 3 | 0.0000)前。 – false