4

ツリーをリストに変更する方法について、別の投稿の誰かのコメントから提案を試しました。ただし、どこかに(または何か)宣言されていない変数があるため、リストの値は[5、2、6]ではなく[_G667、_G673、_G679]であり、これが正解です。私の知る限り、すべての操作は正しいです。

コードは次のとおりです。

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

Eに変更する必要があると思いますVal。現状では、Val使用されておらず(!)、Eどこからともなく来ています。

また、それが機能するためには、に変更Itemする必要がありますnil

于 2012-03-27T22:37:17.683 に答える
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他の述語です。

もう 1 つの問題は、 の多用ですappend/3append/3を使用して連結を定式化することが望ましいことが多いため、多くの Prolog システムが提供しないのには理由があります。

tree_elements(nil) --> [].
tree_elements(tree(L,E,R)) -->
   ツリー要素(L)、
   [E]、
   tree_elements(R)。

これで使えるようになりました

?-句(tree_elements(tree(tree(nil, 2, nil), 5, tree(nil, 6, nil))), Es)。
Es = [2,5,6]。
于 2012-03-27T22:56:38.720 に答える