我试图将二叉树分为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来说还是很新的所以请忍受我的经验!
答案 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
。这并不能解决Left
和Right
树中存在否定或非数字成员的情况。
这是一个天真/透明的解决方案,应该非常清楚。可以进行改进(例如,为了避免留下选择点)。
% 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
| ?-
<小时/> 我刚刚注意到你对积极的定义改为意义非负面,所以我相应地更新了我的答案。