所以我試圖使用遞歸方法來找到兩個人之間的路徑。這裏是快速背景: 我定義了一些事實in(X,Y)
。這表明誰是相關的,即。 in(person1,project1)
,in(person2,project1)
等等。現在,任何兩個人如果在同一個項目中相互關聯,或者他們之間存在人與人之間的鏈接路徑。例如p1工作在A p2上工作在A和B上,p3工作在B上,因此有一條從p1到p3到p2的路徑。這些路徑可以是任意長度。在遞歸中使用Prolog列表
我試圖遞歸解決這個(沒有看到任何其他方式),但有一個惱人的問題:
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無盡的時代。一個人不應該在路上超過一次。
我試圖解決這個問題,我添加了一個列表。如果一個人已經在列表中,他們不能再次添加:
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).
它有點工作,但造成一噸的隨機誤差,重複一些人多次,有的只有一次,然後失敗。這種方法看起來不錯嗎?我完全使用列表錯誤嗎?
謝謝。
所有的鏈都是優選的。真正的問題是,一個連鎖店可以多次擁有同一個人,需要有一種方法來防止這種情況發生。稍後我會在家時發佈樣本輸出。 我知道如何在Java,C,C#等中輕鬆完成這個任務,但是prolog正在拋出一個循環。 – Mike