2012-03-27 10 views
3

ツリーをリストに変更する方法について、別の投稿で他の人のコメントからの提案を試みました。しかし、私は宣言されていない変数をどこか(または何か)持っているので、私のリストの値は正解である[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 to Itemを変更すると、クエリは直ちにfalseを返します。

私はわずかなPrologプログラムしか書いていないので、これはまだ私にとっては新しい概念です。

答えて

2

EValに変更する必要があります。現状では、Valは使用されていません(!)、Eはどこからも来ません。

Itemnilに変更する必要があります。

2

いくつかの問題があります。最も基本的なものから始めましょう:あなたは次のタイプのツリーを持っています。

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

プログラムにはそのタイプが反映されている必要があります。私は 'タイプ'と言ったのですか?まあ、is_tree/1は他のものと同じように述語です。

その他の問題は、あなたの重い使用append/3です。理由がなくても、多くのPrologシステムでは、の助けを借りて連結を定式化することが望ましいため、append/3は提供されません。

 
tree_elements(nil) --> []. 
tree_elements(tree(L,E,R)) --> 
    tree_elements(L), 
    [E], 
    tree_elements(R). 

今、あなたが言った何@aioobeこの

?- phrase(tree_elements(tree(tree(nil, 2, nil), 5, tree(nil, 6, nil))), Es). 
Es = [2,5,6]. 
+1

これはOPが求めているものを答えていません。 –

1

を使用することができます。私もあなたよりもappend/3を使用していると思います。あなたのツリー表現がどのように見えると仮定:空の木を表すアトムnil

tree(Left_subtree, Data , Right_subtree) 

、私は、あなたは以下のようなものを同じ効果を達成できると信じて:

flatten(nil , []). 
flatten(tree(Left , Data , Right) , Flat) :- 
    flatten(Left , Pfx) , 
    flatten(Right , Sfx) , 
    append(Pfx , [Data|Sfx] , Flat ) 
    . 
関連する問題