2014-11-02 70 views
0

我有在序言下列問題麻煩的行程路徑列表,我有一個知識基礎的幾個事實,例如:麻煩在序言

flight(rome,london,ba,1500,150,400). 
flight(london,newyork,airfrance,600,60,200). 
flight(rome,paris,airfrance,1200,120,500). 
flight(paris,newyork,airfrance,600,60,200). 
flight(newyork,london,ba,1500,240,300). 

我只是在獲得的列表感興趣從X到Y的所有可能的路線。我知道我必須使用遞歸規則,並且必須將訪問的地點添加到列表中,以防止週期反覆運行,因爲知識庫中的飛行路徑有幾個週期。

我至今是:

flight_route(X,Y):- 
    flight(X,Y,A,B,C,D). 

trip(X,X,[]). 
trip(X,Z,T) :- 
    flight_route(Y,Z), 
    not(member(Y,T)), 
    trip(X,Y,[Y|T]). 

出於某種原因,當我在看的痕跡,當它試圖檢查不是(會員(Y,T)),但我的規則失敗不能理解爲什麼會這樣。

回答

0

問題出在你定義的trip/3謂詞上。嘗試:

在第一個條款中,當您到達目的地時,無論您如何到達目的地都無關緊要。因此第三個參數中的(匿名)變量。此外,找到從原點開始而不是從目的點開始的路徑可能更有效。可能的問題也可能是您如何調用trip/3謂詞。一定要用在第三個參數上傳遞的空白列表來調用它(如果你不接地T,則呼叫\+ member(Y, T)將總是失敗)。或定義trip/2參數摘要的實現細節:

trip(X, Y) :- 
    trip(X, Y, []). 
+0

謝謝您的回覆,我可以看到你的建議如何有道理,但一我不確定的是如何編寫列表T.在做出更改後,我建議我可以查詢例如(羅馬,紐約)。它返回True。但我不確定如何返回並寫入控制檯列表T的所有可能性。當我查詢(羅馬,紐約,T)。我得到一個錯誤的結果。再次感謝您的建議。 – user2928132 2014-11-02 16:20:14

+0

提示:您可以使用**附加**參數返回兩個連接機場之間的路徑。 (當前)列表參數只是爲了避免週期。 – 2014-11-02 16:28:27

+0

謝謝你的回答Paulo。我想我現在明白了。 – user2928132 2014-11-11 23:07:33