2012-04-01 4 views
0

最初の引数がノードのリスト(つまり[a、b、c])である2位述語buildTreeを定義したい第2引数はツリーツリー(a、tree(b、nil、nil)、tree(c、nil、nil))です。これは、述語 "木" である:最初の引数がノードのリストで、2番目の引数がツリーである述語buildTree

tree(nil). 
tree(tree(_,L,R)):-tree(L),tree(R). 

、これは述語 "buildTree" です:

buildTree([],nil). 
buildTree([X|[Y|H]],tree(X,L,R)):- 
    buildTree([Y|H],L), 
    buildTree(H,R). 

が、クエリ、すなわちbuildTree([a,b,c],T)で、私は複雑な用語tree(a,tree(b,nil,nil),tree(c,nil,nil))を持っていません。どうして?

+0

'buildTree([c]、R)'を呼び出す必要があり、1要素リストのルールがないので失敗します。もう1つの問題は、両方の再帰呼び出しに 'H 'を渡していることです。つまり、両方のサブツリーで同じ要素になります。それがそのまま、あなたの問題は少し不十分です。 @ user1304831の解は '[a、b、c]'に必要な出力を与えますが、長いリストに対しては非常にアンバランスなツリーを生成します。たとえば、 '[a、b、c、d、e、f]'の例を挙げることができますか? –

答えて

0

あなたはbuildTreeを正しく定義していません。まず1つの入力に対しても2つも定義していないので、論理的には答えは正しくなくなります。

それは、この行でより次のようになります。もちろん

/* Stopping conditions */ 
buildTree([X | nil], tree(X, nil, nil)). /* First trivial case */ 
buildTree([X | [Y | nil]], tree(X, tree(Y, nil, nil), nil)). /* Second case */ 

/* builds a tree, according to your reasoning */ 
buildTree([X | [Y | H]], tree(X, L, R)) :- buildTree(Y, L), buildTree(H, R). 

、これは(そのため、あなたはtreeInsertのようないくつかのロジックを定義する必要があります)二分探索木ではありません。

+0

残念ながら、** buildTree([a、b、c]、T)** Prologは私に "false"を返しますが、T = tree(a、tree(b、nil、nil)、tree c、nil、nil))。 – Mark

+0

あなたはこれについて間違ったやり方をしているようです。次に、プロローグに書き留めます。元のコードではもちろん、それはあなたに "偽"を与えるでしょう。クエリ "buildtree([C]、nil)"は処理されないので、もちろんfalseになります。まず、あなたが本当にこれでやりたいことを言葉で定義します。私のコードではあなたが望むツリーが作成されますが、大きな入力に対しては非常に不均衡で、ソートロジックはありません。 – user1304831

関連する問題