2011-11-26 104 views
0

我在編程中遇到了一些困難,我試圖編寫一個謂詞來返回兩個城市之間的所有路徑,儘管此時它返回它在無限循環中找到的第一個路徑。不知道我要出錯的地方,但我一直試圖弄清楚這一點,而且我無處可去。Prolog中的遞歸問題

任何可以提供的幫助將不勝感激。

go:- 
    repeat, 
    f([],0,lon,spa,OP,OD), 
    write(OP), 
    write(OD), 
    fail. 

city(lon). 
city(ath). 
city(spa). 
city(kol). 

path(lon,1,ath). 
path(ath,3,spa). 
path(spa,2,kol). 
path(lon,1,kol). 

joined(X,Y,D):- 
    path(X,D,Y);path(Y,D,X). 

f(Ci_Vi,Di,De,De,PaO,Di):- 
    append([De],Ci_Vi,PaO), 
    !. 
f(Cities_Visited,Distance,Start,Destination,Output_Path,Output_Distance):- 
    repeat, 
    city(X), 
    joined(Start,X,D), 
    not_member(X,Cities_Visited), 
    New_Distance is Distance + D, 
    f([Start|Cities_Visited],New_Distance,X,Destination,Output_Path,Output_Distance). 

not_member(X,List):- 
    member(X,List), 
    !, 
    fail. 
not_member(X,List). 

我期待的輸出是[spa,ath,lon] 4 [spa,kol,lon] 3。

再次,任何幫助,將不勝感激。

非常感謝提前。

回答

1

您的解決方案基本正確。鍵入f([],0,lon,spa,OP,OD),並按預期得到第一個路徑。我可以看到的唯一錯誤是您在搜索謂詞中使用repeat,這就是爲什麼您繼續計算相同的解決方案。 repeat在業務邏輯中幾乎不需要 - 解決方案的回溯已經內置到REP循環中。拿出來,你會得到預期的第二條路徑,然後(正確)失敗。

+0

我只是試圖拿出重複,我仍然得到我的第一個答案的無限重複。 –

+0

這是因爲你在主循環中有另一個'repeat'('go'指令)。直接使用'f([],0,lon,spa,OP,OD)'目標,在第一個解決方案後按';',它會顯示第二個。要以編程方式列舉解決方案,您需要使用'findall/3',而不是'repeat'。 –

+0

啊,我明白了,非常感謝你的幫助,你是一個很好的人。 –