【问题标题】:Tree to list (updated)树到列表(更新)
【发布时间】:2012-04-11 12:37:04
【问题描述】:

我在另一篇文章中尝试了某人关于如何将树更改为列表的评论的建议。但是,我在某处(或某处)有一个未声明的变量,所以我的列表中的值是 [_G667, _G673, _G679],而不是 [5, 2, 6],这是正确的答案。据我所知,所有的操作都是正确的。

代码如下:

flatten( Item , []).

flatten( tree(Left, Val, Right), List) :-
  flatten(Left, List1),
  append(List1, [E], List2),
  flatten(Right, List3),
  append(List2, List3, List).

我使用的查询是:

?- flatten(tree(tree(nil, 2, nil), 5, tree(nil, 6, nil)), L).

有人看到变量问题吗?我以为它可能在第一行(带有 Item),但是如果我将 Item 更改为 item,查询会立即返回 false。

我只写了几个 Prolog 程序,所以这对我来说还是一个新概念。

【问题讨论】:

    标签: tree prolog flatten dcg


    【解决方案1】:

    我认为E 应该改为Val。就目前而言,Val 未被使用(!),E 不知从何而来。

    此外,要使其正常工作,您应该将 Item 更改为 nil

    【讨论】:

      【解决方案2】:

      有几个问题。让我们从最基本的开始:您拥有一棵树,它属于以下类型。

      is_tree(nil).
      is_tree(tree(L,_E,R)) :-
         is_tree(L),
         is_tree(R).
      

      您的程序应该反映这种类型。我说过“类型”吗?好吧,is_tree/1 和其他任何谓词一样都是谓词。

      另一个问题是您大量使用append/3。并非没有理由,许多 Prolog 系统不提供 append/3,因为通常最好在 s 的帮助下制定连接。

      树元素(无)-> []。 树元素(树(L,E,R))--> 树元素(L), [E], 树元素(R)。

      现在你可以使用它了

      ?- 短语(tree_elements(tree(tree(nil, 2, nil), 5, tree(nil, 6, nil))), Es)。
      Es = [2,5,6]。
      

      【讨论】:

      • 这没有回答 OP 的要求。
      【解决方案3】:

      @aioobe 说了什么。我认为您使用append/3 的次数也超出了您的预期。假设您的树表示形式如下:

      tree( Left_subtree, Data , Right_subtree )
      

      原子nil代表一棵空树,我相信你可以达到同样的效果:

      flatten( nil , [] ).
      flatten( tree( Left , Data , Right ) , Flat ) :-
        flatten( Left  , Pfx ) ,
        flatten( Right , Sfx ) ,
        append( Pfx , [Data|Sfx] , Flat  )
        .
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-28
        • 1970-01-01
        相关资源
        最近更新 更多