そのため、再帰的な方法を使用して、2 人の間のパスを見つけようとしています。簡単な背景は次のとおりです。私はいくつかの事実を定義しますin(X,Y)
。つまり、誰が関係しているかを示します。in(person1,project1)
、in(person2,project1)
など。現在、2 人が同じプロジェクトにいた場合、または 2 人の間に人のリンク パスがある場合、2 人は関連しています。たとえば、p1 は A で作業し、p2 は A と B で作業し、p3 は B で作業したため、p1 から p2 を経由して p3 へのパスが存在します。これらのパスの長さは任意です。
私はこれを再帰的に解決しようとしていますが(他の方法は見られません)、厄介な問題があります:
related(A,B) :-
in(A,X),
in(B,X),
not(A=B).
chain(A,B) :-
related(A,B).
chain(A,B) :-
related(A,Y),
chain(Y,B).
問題は、パスが繰り返される可能性があることです。p1 から p2 に戻って p1 に無限に戻ることができます。人はパスに 1 回以上存在してはなりません。
追加するリストでこれを修正しようとしました。人が既にリストに含まれている場合、再度追加することはできません。
related(A,B,L) :-
in(A,X),
in(B,X),not(A=B).
chain(A,B,L) :-
related(A,B,L).
chain(A,B,L) :-
related(A,Y,L),
not(member(Y,L)),
append(L,[Y],Q),
chain(Y,B,Q).
そして、それはある程度機能しましたが、大量のランダムなエラーが発生し、一部の人は複数回繰り返し、一部の人は1回だけ繰り返し、その後失敗しました. このアプローチは正しく見えますか? リストを完全に間違って使用していますか?
ありがとうございました。