[英]How to remove an element from a multiway tree in Prolog
我和我的朋友們正在努力完成這項任務。 在任何其他語言中,這很容易。
我們嘗試將樹轉換為列表,刪除一個元素,然后構建一棵樹。 從列表構建到樹構建部分我們不知道該怎么做。
我將如何使用這棵樹 go :
tree(1, [tree(6, [tree(7, [])] ),
tree(3, []),
tree(2, [tree(4, []),
tree(5, [])])
])
將非常感謝任何推動或解決方案。
Prolog 變量是不可變的——它們的值不能改變。 所以,如果你想改變一棵樹,比如三叉樹,你有一個謂詞 state 所需的改變。
用新值替換特定節點的簡單非遞歸情況:
replace_left_node(tree(_,B,C), NewNode, tree(NewNode, B, C).
replace_right_node(tree(A,B,_), NewNode, tree(A, B, NewNode).
replace_middle_node(tree(A,_,C), NewNode, tree(A, NewNode, C).
對於遞歸情況,您必須更詳細地指定更改。 比方說,在一個有左右子樹和節點值在中間參數的樹中,用值 b 替換具有值 a 的節點值,例如:
replace(a, b). % replace the value a by value b
replace(X, X) :- X \= a. % otherwise use the same value unchanged
遞歸的情況就是對Left和Right子樹做同樣的事情。
replace_recursively(terminal, terminal) % this is the tree leaf
replace_recursively(tree(L, V, R), tree(L1, V1, R1)) :-
replace(V, V1), % handle the node value
replace_recursively(L, L1), % handle left sub-tree
replace_recursively(R, R1). % handle right sub-tree
這回答了你的問題了嗎? 你還需要什么?
好的,通過您在評論中給出的示例,我理解得更好。 我給你一個例子,用於刪除具有給定值 Elm 的節點。 這是一個雙重遞歸,一個用於處理函子樹,另一個用於處理列表。
remove_elem_from_tree(Elm, tree(V, Nodes), tree(V,Nodes1) ):-
Elm \= V,
remove_elem_from_list(Elm, Nodes, Nodes1).
remove_elem_from_list(_, [], []).
remove_elem_from_list(E, [X|Xs], [Y|Ys]) :-
remove_elem_from_tree(E, X, Y), !,
remove_elem_from_list(E, Xs, Ys).
remove_elem_from_list(E, [_|Xs], Ys) :-
remove_elem_from_list(E, Xs, Ys).
所以示例運行是:刪除節點 4
?- remove_elem_from_tree(4, tree(1,
[ tree(6, [tree(7, [])]),
tree(3, []),
tree(2, [tree(4, []),tree(5, [])])
]
), Result).
Result = tree(1,[tree(6,[tree(7,[])]),tree(3,[]),tree(2,[tree(5,[])])])
節點 4 在給定樹中的節點 2 下。 它被刪除,節點 2 現在有唯一的子節點 5。
這個答案對您和您的朋友有幫助嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.