我的代码基本上是从互联网上学习来的。到目前为止,我已经成功地使用DFS方法运行程序,但是我尝试使用BFS运行时,它总是返回false。这是我第一个SWI-Prolog程序,我找不到代码问题出在哪里。
以下是我的代码部分,希望您能帮我找到问题所在:
solve2 :-
bfs([[[3,3,left]]],[0,0,right],[[3,3,left]],Solution),
printSolution(Solution).
bfs([[[A,B,C]]],[A,B,C],_,[]).
bfs([[[A,B,C]|Visisted]|RestPaths],[D,E,F],Visisted,Moves) :-
findall([[I,J,K],[A,B,C]|Visited]),
(
move([A,B,C],[I,J,K],Description),
safe([I,J,K]),
not(member([I,J,K],Visited)
),
NewPaths
),
append(RestPaths,NewPaths,CurrentPaths),
bfs(CurrentPaths,[D,E,F],[[I,J,K]|Visisted],MoreMoves),
Moves = [ [[A,B,C],[I,J,K],Description] | MoreMoves ].
move([A,B,left],[A1,B,right],'One missionary cross river') :-
A > 0, A1 is A - 1.
% Go this state if left M > 0. New left M is M-1
.
.
.
.
.
safe([A,B,_]) :-
(B =< A ; A = 0),
A1 is 3-A, B1 is 3-B,
(B1 =< A1; A1 =0).
我使用findall来查找在进入下一个级别之前的所有可能路径。只有通过safe()测试的路径会被认为是可能的下一个状态。如果状态已经存在,则不会使用该状态。由于我的程序可以使用DFS运行,因此我认为move()与safe()谓词没有问题。我的BFS谓词正在根据我的DFS代码进行更改,但它没有起作用。
findall/3
的元数为3,但是你的代码中只使用了一个参数。同时你使用了变量Visisted
和Visited
。它们应该是一样的吗?尝试缩进你的代码以使其更易读,并添加一些注释。否则,很难理解你使用findall/3
调用和后续块所要实现的目标。 - twinterer