2012-01-17 92 views
1

我在序言中有以下代碼來產生從一個節點到另一個節點的路徑,但我無法在屏幕上看到我的結果。我只是得到true作爲答案。最後一個變量名稱不綁定到的結果:Prolog代碼不工作

edge(a,b). 
edge(b,d). 
edge(b,c). 
edge(c,d). 

path(A,B,P):- 
       path_1(A,B,[A],P). 

path_1(A,B,P,Path):- last_element(P,S),S=B. 
path_1(A,B,P,Path):- 
        edge(A,X),\+member(X,P),append(P,[X],NewP), 
        path_1(X,B,NewP,NewP). 

last_element([X],X). 
last_element([H|T],X):- 
        last_element(T,X). 

我想要得到的東西,如:K=[a,b,d]等。當我運行這段代碼:path(a,d,K) 但它沒有顯示出來。只有true顯示出來。

想知道爲什麼。謝謝

+0

嘗試'trace'。這會有很大的幫助。 – 0605002 2012-01-17 15:19:20

+0

我已追溯到sooo時間,但無法找到它 – 2012-01-17 15:20:39

回答

0

path/3中的P變量將在實例化path_1/4中的Path變量時被實例化。
但是,你永遠在path_1/4使用Path,因此當你觀察

由於您使用SWI-序言你應該得到這樣的「變量辛格爾頓:[路徑]」警告變量不綁定到的結果。
雖然有時它是確定忽略這樣的警告,大部分代碼是行不通的時代,你預期

+0

感謝您的回覆。我想在這裏理解一些東西。 path_1/4中的最後一行是path_1(X,B,NewP,NewP),所以我認爲「Path」被NewP中的值替換,所以它必須工作。你能向我解釋一下爲什麼不是這樣。謝謝。你說的是對的,但我希望你能幫助我,爲什麼我的想法是錯誤的 – 2012-01-17 15:28:25

+0

'path_1/4'的第一個子句應該將'Path'綁定到'P'。 – twinterer 2012-01-17 15:34:38

+0

好的我已經完成了這個:path_1(A,B,P,Path): - last_element(P,S),S = B,Path = P。但仍然得到相同的「真實」。 Path = P是否錯誤? – 2012-01-17 15:40:27

1

在你的代碼,Path不更新遞歸規則。改變這樣的:

path_1(A,B,P,Path):- 
       edge(A,X),\+member(X,P),append(P,[X],NewP), 
       path_1(X,B,NewP,P1), append([A], P1, Path). 

,它運行良好:)

當它是明確的,有一個A-X邊緣和X-B的路徑,在A-B路徑應該是A + X-B路徑。

+0

我認爲你的最後一行應該追加(NewP,[X],Path)。雖然它還沒有和我一起工作。我不知道爲什麼 – 2012-01-17 16:35:33

+0

更新:)現在它應該工作。 – 0605002 2012-01-17 16:37:49

+0

@Eddy Freeman它工作正確嗎? – 0605002 2012-01-18 20:35:21