将二叉树元素排序到Prolog中的列表中?

时间:2017-10-10 22:45:10

标签: list sorting prolog binary-tree

我试图将二叉树分为3个列表,一个用于正数,一个用于负数,一个用于其他任何内容。

我已成功将此代码转换为列表:

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的三个谓词,每个都检查它们的特定类型。

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来说还是很新的所以请忍受我的经验!

1 个答案:

答案 0 :(得分:1)

我不打扰2参数版本,只需坚持使用4.在您的解决方案中,由于过度简化,您会丢失大量案例。例如,这里:

treePosNeg(tree(Left,Root,Right),[Root|Pos],Neg,Other) :-
    Root >= 0,
    treePosNeg(Left,List1),
    treePosNeg(Right,List2),
    append(List1,List2,Pos).

简化为treePosNeg / 2并将所有内容附加到Pos。这并不能解决LeftRight树中存在否定或非数字成员的情况。

这是一个天真/透明的解决方案,应该非常清楚。可以进行改进(例如,为了避免留下选择点)。

% tree_pos_neg(Tree, Pos, Neg, Other)

% A void tree    
tree_pos_neg(void, [], [], []).

% A tree where the head node is positive
tree_pos_neg(tree(L, V, R), [V|Pos], Neg, Other) :-
    number(V),
    V >= 0,
    subtrees_pos_neg(L, R, Pos, Neg, Other).

% A tree where the head node is negative
tree_pos_neg(tree(L, V, R), Pos, [V|Neg], Other) :-
    number(V),
    V < 0,
    subtrees_pos_neg(L, R, Pos, Neg, Other).

% A tree where the head node is neither a positive nor a negative number
%   (it could be *anything* else)
tree_pos_neg(tree(L, V, R), Pos, Neg, [V|Other]) :-
    \+ number(V),
    subtrees_pos_neg(L, R, Pos, Neg, Other).

subtrees_pos_neg(L, R, Pos, Neg, Other) :-
    tree_pos_neg(L, LP, LN, LO),
    tree_pos_neg(R, RP, RN, RO),
    append(LP, RP, Pos),
    append(LN, RN, Neg),
    append(LO, RO, Other).

运行此查询,您将获得:

| ?- tree_pos_neg(tree(tree(void,a,void),-10,tree(void,b,void)), P, N, O).

N = [-10]
O = [a,b]
P = [] ? ;

no
| ?-

<小时/> 我刚刚注意到你对积极的定义改为意义非负面,所以我相应地更新了我的答案。