【问题标题】:How to flatten a 1-2-3 tree into a list?如何将 1-2-3 树展平为列表?
【发布时间】:2017-04-18 12:49:46
【问题描述】:

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

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

我知道问题源于此声明

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

其中 Temp1、Temp2 和 Temp3 是我要添加的整数。 L 是包含到目前为止树中所有整数的主列表。


我尝试使用两个附加语句,但返回的是 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). 

【问题讨论】:

  • 您的代码是...?确实包括谓词定义和查询。
  • 抱歉,我认为这是一个更笼统的问题。我添加了我的代码以及我使用的查询。
  • 为什么不直接写L = [Temp1, Temp2, Temp3] 呢?我错过了什么吗?
  • 我尽量避免使用=,这是我的教授设置的限制。
  • 查询的期望输出是什么,如图所示?是[2,3,4]吗?

标签: list recursion tree prolog flatten


【解决方案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 两次,或者我们需要多少次,来逐个构建结果列表。

【讨论】:

    【解决方案2】:

    在将树与列表相关联时,请查看 DCG 表示法:DCG 让您完全避免append/3,使您的代码更简单,同时经常改进其终止属性.

    例如:

    树列表(叶(叶))-> [叶]。 tree_list(node1(Leaf, Node)) --> [叶子], 树列表(节点)。 tree_list(node2(Leaf, Node1, Node2)) --> 树列表(节点 1), [叶子], 树列表(节点 2)。 树列表(节点 3(_,节点 1,节点 2,节点 3))--> 树列表(节点 1), 树列表(节点2), 树列表(节点 3)。

    示例查询和回答:

    ?- 短语(tree_list(node3(1, 节点1(2,叶(1)), 节点2(3,叶(1),叶(1)), 节点1(4,叶(1)))),Ls)。 Ls = [2, 1, 1, 3, 1, 4, 1]

    您可以轻松地将其调整为其他所需的顺序,只需在 DCG 体内移动终端和非终端。

    请注意,所有辅助变量都完全消失了

    【讨论】:

      猜你喜欢
      • 2013-11-13
      • 2020-03-31
      • 1970-01-01
      • 2011-02-11
      • 2022-06-13
      • 2017-12-12
      • 2021-11-15
      • 2021-08-23
      相关资源
      最近更新 更多