我想解決一個問題,我需要評估二進制表達式樹的值。返回遞歸結果
tree_calc(Tree, Eval)
其中Eval
應持有的最終結果和Tree
必須是形式:
tree(LeftNode, Operator, RightNode)
如果我創建tree
功能根據上面的表格,我怎麼傳遞的結果如果沒有一個空變量來存儲結果,計算會返回遞歸嗎?
我的理解是,一個額外的變量總是需要存儲的結果。提前
道歉,因爲我相信我誤解基本的東西。
感謝您的幫助。
我想解決一個問題,我需要評估二進制表達式樹的值。返回遞歸結果
tree_calc(Tree, Eval)
其中Eval
應持有的最終結果和Tree
必須是形式:
tree(LeftNode, Operator, RightNode)
如果我創建tree
功能根據上面的表格,我怎麼傳遞的結果如果沒有一個空變量來存儲結果,計算會返回遞歸嗎?
我的理解是,一個額外的變量總是需要存儲的結果。提前
道歉,因爲我相信我誤解基本的東西。
感謝您的幫助。
在此背景下,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
對於更一般的情況,您需要檢查L
和R
以查看它們本身是否爲tree/3
結構,如果是,則遞歸調用tree_calc
。
Prolog擅長匹配術語模式。因此,如果您檢查統一L = tree(LL, Op, LR)
並且成功,則表示L
是tree
,其左分支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
| ?-
感謝那個潛伏者。我似乎無法理解如何定義上面提到的關係@mat。 「樹」是否應該返回任何東西?或者正如你所提到的那樣,它只是代表樹嗎?另外如果'Tree'變量引用'tree(tree(2,+,3),*,4)'我應該使用'Tree'訪問左右分支嗎?將繼續思考它..感謝您的幫助。 – Archer
@Archer甚至認爲'樹'可能會返回一些東西沒有關係。 Prolog預測不會返回任何東西。他們成功或失敗,並在此過程中,實例化變量以嘗試成功。正如我所提到的,在這種情況下,「tree/3」是一個用於定義數據結構的術語,與C中的「struct」定義數據結構相同(鬆散)。它不會「返回」任何東西。正如我在我的回答中所描述的那樣,您將一個數據結構(使用'tree')傳遞給'tree_calc',並且該查詢將試圖通過對錶達式進行適當評估而獲得成功,從而生成'Eval'。 – lurker
@Archer查看我更新的答案,以獲取關於處理'tree/3'的更多信息。 – lurker
你需要考慮在** **的關係方面:你需要定義一個*關係*這樣的樹和值之間。具有兩個參數的謂詞足以做到這一點。關於唯一需要定義的內容是:樹,它的孩子的價值(如果有的話)和樹的價值之間的關係是什麼? – mat