2016-03-24 130 views
0

我想解決一個問題,我需要評估二進制表達式樹的值。返回遞歸結果

tree_calc(Tree, Eval) 

其中Eval應持有的最終結果和Tree必須是形式:

tree(LeftNode, Operator, RightNode) 

如果我創建tree功能根據上面的表格,我怎麼傳遞的結果如果沒有一個空變量來存儲結果,計算會返回遞歸嗎?

我的理解是,一個額外的變量總是需要存儲的結果。提前

道歉,因爲我相信我誤解基本的東西。

感謝您的幫助。

+2

你需要考慮在** **的關係方面:你需要定義一個*關係*這樣的樹和值之間。具有兩個參數的謂詞足以做到這一點。關於唯一需要定義的內容是:樹,它的孩子的價值(如果有的話)和樹的價值之間的關係是什麼? – mat

回答

1

在此背景下,tree是不是要調用功能,也不是什麼序言會稱其爲謂語tree(LeftNode, Operator, RightNode)只是一個術語,它用作表示樹的結構。因此,例如,(2 + 3) * 4將由tree(tree(2,+,3), *, 4)表示。你會打電話給謂詞tree_calc(tree(tree(2,+,3),*,4), Eval),並期望查詢產生,Eval = 20。在這種情況下,術語tree/3不包含結果。

要給出如何在謂語訪問tree/3一個例子,這裏有一個簡單的謂詞計算最簡單的樹(所以沒有遞歸樹葉):

tree_calc(tree(L, Op, R), E) :- 
    % Neither L or R are of the form `tree/3` 
    compute(Op, L, R, E). 

compute(+, L, R, E) :- E is L + R. 
compute(*, L, R, E) :- E is L * R. 
compute(-, L, R, E) :- E is L - R. 
compute(/, L, R, E) :- E is L/R. 

可以概括compute/4

compute(Op, L, R, E) :- 
    Exp =.. [Op, L, R], 
    E is Exp. 

而且你可以調用它像這樣:

| ?- tree_calc(tree(2,+,3), Eval). 

Eval = 5 

yes 

對於更一般的情況,您需要檢查LR以查看它們本身是否爲tree/3結構,如果是,則遞歸調用tree_calc

Prolog擅長匹配術語模式。因此,如果您檢查統一L = tree(LL, Op, LR)並且成功,則表示Ltree,其左分支LL,操作Op和右分支LR。您可以在序言提示這種行爲發揮,看看它是如何工作的:

| ?- Tree = tree(2, +, 3), Tree = tree(L, Op, R). 

L = 2 
Op = (+) 
R = 3 
Tree = tree(2,+,3) 

yes 
| ?- Tree = tree(2,+,tree(3,*,4)), Tree = tree(L, Op, R). 

L = 2 
Op = (+) 
R = tree(3,*,4) 
Tree = tree(2,+,tree(3,*,4)) 

yes 

| ?- Tree = tree(2,+,tree(3,*,4)), Tree = tree(L, Op, R), R = tree(LR, OpR, RR). 

L = 2 
LR = 3 
Op = (+) 
OpR = (*) 
R = tree(3,*,4) 
RR = 4 
Tree = tree(2,+,tree(3,*,4)) 

yes 
| ?- 
+0

感謝那個潛伏者。我似乎無法理解如何定義上面提到的關係@mat。 「樹」是否應該返回任何東西?或者正如你所提到的那樣,它只是代表樹嗎?另外如果'Tree'變量引用'tree(tree(2,+,3),*,4)'我應該使用'Tree'訪問左右分支嗎?將繼續思考它..感謝您的幫助。 – Archer

+1

@Archer甚至認爲'樹'可能會返回一些東西沒有關係。 Prolog預測不會返回任何東西。他們成功或失敗,並在此過程中,實例化變量以嘗試成功。正如我所提到的,在這種情況下,「tree/3」是一個用於定義數據結構的術語,與C中的「struct」定義數據結構相同(鬆散)。它不會「返回」任何東西。正如我在我的回答中所描述的那樣,您將一個數據結構(使用'tree')傳遞給'tree_calc',並且該查詢將試圖通過對錶達式進行適當評估而獲得成功,從而生成'Eval'。 – lurker

+0

@Archer查看我更新的答案,以獲取關於處理'tree/3'的更多信息。 – lurker