2011-10-25 69 views
0

我想編寫一個程序來查找城鎮之間的路由,添加到列表的路徑,然後,廣告結束顯示它。 我認爲添加到列表的作品,但我有顯示列表的問題,不知道如何傳遞一個列表作爲參數使用,當它完成查找路徑?希望你們能幫忙。下面的代碼:序言 - 發送一個列表作爲要顯示的參數

connected(middlesbrough, stockton). 
connected(middlesbrough, darlington). 
connected(stockton, sunderland). 
connected(darlington, thirsk). 
connected(stockton, newcastle). 
connected(newcastle, york). 
connected(thirsk, york). 
connected(york, leeds). 
connected(leeds, huddersfield). 
connected(leeds, dewsbury). 
connected(huddersfield, manchester). 
connected(dewsbury, manchester). 


run(List):- 
    write('Enter Starting City :'), 
    read(Start), 
    write('Enter Finishing City :'), 
    read(End), 
    findroute(Start,End), 
writeList([List]). 

findroute(Start,End):- 
connected(Start,End). 
findroute(Start,End):- 

add(Start, List, [Start | List]), 

connected(Start,Link), findroute(Link,End). 


add(A,B,[A|B]). 

writeList([]).  
writeList([Head | Tail]):- 
    write(Head),    
    nl,        
    writeList(Tail).     

回答

2

findroute/2謂詞不返回列表,所以輸出不能工作。

調用應該是這個樣子:findroute(Start,End,List)

顯然,findroute/2謂語必須改爲findroute/3

findroute(Start,End,[Start,End]):- 
    connected(Start,End). 
findroute(Start,End,List):- 
    connected(Start,Link), 
    add(Start,Rest,List), 
    findroute(Link,End,Rest). 

(提示:一定要理解爲什麼add/3調用工作,即使休息否則你的導師不會相信這段代碼是你的功課!;-))

你可能想要添加一個剪切在結束的時候第一個條款,如果你只想找到最短的路線。

最後,List已經是一個列表,所以在調用writeList/1時不要在它周圍放上方括號!

+0

謝謝,就是這樣。我已經完成了很多編程(java,c#,php),我真的很喜歡它,但是在編程上非常困難。再次感謝,真的很感謝這一點。 – tomsky