私は2つのツリーを3つのリストにソートしようとしています.1つは正数、1つは負数、もう1つは他のものです。Prologでバイナリツリー要素をリストにソートしますか?
私が正常にリストにツリーを変換し、このコードを持っている:
treePosNeg(void, []).
treePosNeg(tree(Left,Root,Right),[Root|List]) :-
treePosNeg(Left,List1),
treePosNeg(Right,List2),
append(List1,List2,List).
入力:
treePosNeg(tree(tree(void,a,void),-10,tree(void,b,void)),List).
出力:それらをソートする
List = [-10, a, b]
私の論理は単純でしたRoot> = 0、Root <が0かどうかをチェックし、そうでない場合は他のリストに入ります。私はtreePosNegの3つの述語を使用して、それぞれの特定の型をチェックしようとしていました。
treePosNeg(void, []).
treePosNeg(tree(Left,Root,Right),[Root|Pos],Neg,Other) :-
Root >= 0,
treePosNeg(Left,List1),
treePosNeg(Right,List2),
append(List1,List2,Pos).
treePosNeg(tree(Left,Root,Right),Pos,[Root|Neg],Other) :-
Root < 0,
treePosNeg(Left,List1),
treePosNeg(Right,List2),
append(List1,List2,Neg).
treePosNeg(tree(Left,Root,Right),Pos,Neg,[Root|Other]) :-
treePosNeg(Left,List1),
treePosNeg(Right,List2),
append(List1,List2,Other).
しかし、私は単に自分の出力としては得られません。私は問題はそれが依然として再帰的に追加する前にtreePosNegを呼び出すことだと思いますが、List1要素とList2要素をインスタンス化してから使用できるようにする必要があります。私はまだPrologにはとても新しいので、私の未熟さに耐えてください!
'treePosNeg'に使用する引数の数に注意する必要があります。 Prologでは異なる述語ですが、これは必ずしも間違ったことではありませんが、設計意図で行ったようには見えません。そして「ソート」とはどういう意味ですか?どのようにソートされましたか?なぜ「ルート> 10」ですか? 10について特別なものは何ですか? – lurker