如何将1-2-3树拼成一个列表?

时间:2016-12-03 20:12:52

标签: list recursion tree prolog flatten

我正在开发一个将树转换为整数列表的函数。我的问题是,当我只需要添加一个或两个整数时,我可以附加到列表中。但是我似乎无法在没有得到这个的情况下附加三个整数:

[[2], 3, 4],当我得到[2, 3, 4]时。

我知道这个问题来自于这个陈述

append([Temp1 | Temp2] , Temp3, L)

其中Temp1,Temp2和Temp3是我想要添加的整数。 L是包含树中所有整数的主列表。

我尝试了两个append语句,但返回false布尔值而不是[2, 3, 4]。我尝试移动[ | ],但我认为我对他们的了解不足以产生影响。

append / 3页面也只能将两个列表连接成一个。任何帮助将不胜感激:)

编辑:我的代码如下,我添加了我的测试示例。

chopTree(leaf(_), []).
chopTree(node1(Leaf, Node), L) :- 
    chopTree(Node, Temp), 
    append([], [Leaf | Temp], L).
chopTree(node2(Leaf, Node1, Node2), L) :- 
    chopTree(Node1, Temp1), 
    chopTree(Node2, Temp2), 
    append(Temp1, [Leaf | Temp2], L).
chopTree(node3(_, Node1, Node2, Node3), L) :- 
    chopTree(Node1, Temp1), 
    chopTree(Node2, Temp2), 
    chopTree(Node3, Temp3), 
    append([Temp1 | Temp2] , Temp3, L).

query(E) :- 
    chopTree(node3(1, 
                   node1(2, leaf(1)), 
                   node2(3, leaf(1), leaf(1)), 
                   node1(4, leaf(1))), 
             E). 

1 个答案:

答案 0 :(得分:1)

您的命名已关闭。变量看起来更好称为“标签”。然后,node3应该有两个

chopTree(leaf(_), []).
chopTree(node1(Label, Node), L) :- 
    chopTree(Node, Temp), 
    % append([], [Label | Temp], L).
    L = [Label | Temp].
chopTree(node2(Label, Node1, Node2), L) :- 
    chopTree(Node1, Temp1), 
    chopTree(Node2, Temp2), 
    append(Temp1, [Label | Temp2], L).
chopTree(node3(Label1, Label2, Node1, Node2, Node3), L) :- 
    chopTree(Node1, Temp1), 
    chopTree(Node2, Temp2), 
    chopTree(Node3, Temp3), 
    append(Temp1, [Label1 | Temp2] , L1),
    append(L1, [Label2 | Temp3], L).

也许node1也不应该包含任何标签。无论如何,正如你所看到的,我们只需要两次调用append,或者我们需要多次,就可以逐个构建结果列表。