2012-05-15 153 views
0

我想要做的是找到一些路線和一些安全區域。我做了一些研究,我已經知道我必須添加一個基本步驟和遞歸步驟。我已經實施了,但當我不得不轉移時它不起作用。所以如果它是鄰居,它是有效的,但不是。在prolog中規劃一條路線

這是我有:

p(zwolle,apeldoor,36). 
p(apeldoorn,zutphen,22). 
p(hengelo,zwolle,60). 
p(zutphen,hengelo,45). 
p(arnhem,apeldoorn,30). 
p(arnhem,zutphen,24). 


%basic step 
route(Begin,End,PastCitys):- 
     not(member(End,PastCitys)), 
    p(Begin,End,_). 

%recursief 
route(Begin,End,PastCitys):- 
    p(Begin,Stepover,_), 
     not(member(Stepover,PastCitys)), 
    route(Stepover,End). 

plan(Begin,End):- 
    route(Begin,End,[Begin]). 

任何幫助是值得歡迎

回答

0

這裏有複雜的升序李樹斌提示:

  1. 你拼錯「阿珀爾多倫」一次,所以明顯的測試route(zwolle,apeldoorn)純粹是因爲這一點。
  2. 你需要表達一個事實,即相鄰性是對稱的,這樣你就可以找到一條從A到B的路線,無論這個事實是以某種方式表達的。
  3. 即使存在路線,您仍然可以在發現路線之前進入無限循環的無限循環。爲此,您需要一個「發生檢查」,以防止您在進行遞歸步驟時進入週期。
+0

所以我已經添加了一張支票,但仍然不起作用,我知道它不是雙向的。但那是爲了以後。 你有什麼可以幫助我嗎? –

+0

這兩個改變實際上就是你和成功之間的一切。如果您得到錯誤的答案,請跟蹤電話並比較您所期望的情況。如果您無法弄清楚有什麼不同,請編輯您的問題併發布示例。 –

+0

@JorneDeBlaere不要忘記謂詞'route'應該有三個屬性,而它在遞歸子句中似乎有兩個。 –

0

我想你需要看看Floyd-Warshall algorithm。只需使用Prolog進行編碼即可。遞歸和訪問節點列表的方法並不是最優的(參見Richard O'Keefe,「The Prism of Prolog」,第5.4章)。但是通常warshall算法已經存在於一個圖形操作庫中,您需要研究如何使用它。

+0

謝謝,我要弄清楚。非常有幫助! –