2009-12-10 42 views
0

我想寫一個路由功能,但我似乎無法得到所需的結果。這是迄今爲止的代碼。 前身發現被掛N節點,並將它作爲P.序言路由例程

traceroute(_,L) :- member((A,A),L). 
traceroute(N,L) :- 
    predecessor(N,P), 
    append(N,L,L1), 
    traceroute(P,L1). 

當我跑我traceroute(placeA, Y).它返回數據.. Y = [ (_G575, _G575)|_G579] .

基本上是traceroute的第一線,我想如果任何成員是自己的前身,則終止遞歸。第二部分應循環遍歷所有節點並將它們添加到列表(L)中。

節點存儲,例如[(placeA,placeB),(placeB,placeC)和列表應存放像[placeA,placeB,placeC]

我不明白爲什麼我得到這些結果。

回答

2

看起來像這樣的一個解決方案(當它不正確時)通常意味着您沒有在某處應該有的地方(即實例化)某個術語。

我不完全確定你的代碼是如何工作的,但它看起來像你的主要問題是你爲traceroute的第二個參數傳遞一個nonground變量。

在成員調用中,因爲L是非圓的,所以實際上你要求prolog返回一個完全沒有實例化列表的元素的表單項(A,A)。雖然這並沒有使所有的東西,感覺有些時候做這樣的事情是非常有用的,所以序言盡職盡責非接地的要求,並且將(在回溯)生成增加長度的名單(因爲你沒有指定長度的任何地方)在某個點有一個項目(A,A)的變量。即:

?- traceroute(placeA, Y). 
Y = [ (_G271, _G271)|_G275] ; 
Y = [_G274, (_G271, _G271)|_G278] ; 
Y = [_G274, _G277, (_G271, _G271)|_G281] ; 
Y = [_G274, _G277, _G280, (_G271, _G271)|_G284] ; 

您需要可以通過用於Y的值是地面或進一步限制,它需要你的謂詞中甚至可能是兩個值。

即使不實際執行的第二子句此外,你必須有一個類似的問題:L這又是非接地被附加到N個得到L1,然後將其也非接地。由於這個謂詞是以遞歸的方式進行的,所以最終的列表永遠都是非圓的。