私は古典的な宣教師(M)と人食い人種(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()を通過した1つだけが、可能な限り次の状態と見なされます。状態がすでに存在する場合、その状態は使用されません。私のプログラムはDFSで実行できるので、move()およびsafe()述語に問題はないと思います。BFS述語がDFSコードに基づいて変更されていますが、機能しません。