2016-12-03 48 views
1

我工作的一个树转换成整数列表的功能。我的问题是,当我只需要添加一个或两个整数时,我可以追加到列表中。但我似乎无法追加三个整数没有得到这个:如何将1-2-3树平铺到列表中?

[[2], 3, 4],当我应该得到[2, 3, 4]

我知道,这个问题从这个声明

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

凡TEMP1,TEMP2,和TEMP3是我想补充的整数茎。 L是目前包含树中所有整数的主要列表。


我想有两个附加声明,但返回false布尔值,而不是[2, 3, 4]。我试着在[ | ]附近移动,但我不认为我对他们有足够的了解可以有所作为。

附加/ 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). 
+0

你的代码是...?包括谓词定义和查询。 –

+0

对不起,我认为这会是一个更普遍的问题。我添加了我的代码,以及我使用的查询。 –

+0

为什么不能简单地写'L = [TEMP1,TEMP2,TEMP3]'?我错过了什么吗? –

回答

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两次,或不过很多时候我们需要的,要逐件建立结果列表件。

1

当与树列表,结账DCG符号:DCG中让你避免append/3完全,使你的代码更简单,并在同一时间往往提高其终止性质。

例如:

 
tree_list(leaf(Leaf)) --> [Leaf]. 
tree_list(node1(Leaf, Node)) --> 
     [Leaf], 
     tree_list(Node). 
tree_list(node2(Leaf, Node1, Node2)) --> 
     tree_list(Node1), 
     [Leaf], 
     tree_list(Node2). 
tree_list(node3(_, Node1, Node2, Node3)) --> 
     tree_list(Node1), 
     tree_list(Node2), 
     tree_list(Node3). 

样品的查询和答案:

 
?- phrase(tree_list(node3(1, 
        node1(2, leaf(1)), 
        node2(3, leaf(1), leaf(1)), 
        node1(4, leaf(1)))), Ls). 
Ls = [2, 1, 1, 3, 1, 4, 1]. 

您可以轻松地适应这个给其他需要的订单,仅靠移动DCG  机构内的终端和非终结符。

注意,所有的辅助变量完全!