我正在解决经典的 Missionaries(M) 和 Cannibals(C) 问题,起始状态是左岸的 3M 和 3C,目标状态是右岸的 3M、3C。我已经完成了程序中的基本功能,我需要实现搜索策略,例如 BFS 和 DFS。
基本上我的代码是从网上学习的。到目前为止,我可以使用 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 代码进行更改,但它不起作用。