簡體   English   中英

如何從 Prolog 中的多路樹中刪除一個元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM