4

我在另一篇文章中尝试了某人关于如何将树更改为列表的评论的建议。但是,我在某处(或某处)有一个未声明的变量,所以我的列表中的值是 [_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 程序,所以这对我来说仍然是一个新概念。

4

3 回答 3

2

@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  )
  .
于 2012-03-28T01:05:37.673 回答
2

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

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

你的程序应该反映这种类型。我说过“类型”吗?嗯,is_tree/1是一个谓词,和其他任何东西一样。

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

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

现在你可以使用这个

?-短语(tree_elements(tree(tree(nil, 2, nil), 5, tree(nil, 6, nil))), Es)。
Es = [2,5,6]。
于 2012-03-27T22:56:38.720 回答
2

我相信E应该改成Val. 就目前而言,Val不使用(!)并且E来自无处。

此外,要使其正常工作,您应该更改Itemnil.

于 2012-03-27T22:37:17.683 回答