将树转换为列表

时间:2017-10-06 05:11:13

标签: tree

所以我有这个prolog程序打印出树中的正数。

positive(void).
positive(tree(L, Root, R), P) :- Root > 0, positive(L, X),positive(R, Y).
positive(tree(L, Root, R), P) :- positive(L,X), positive(R,Y).

我希望在列表中输出正数

,而不是在此树中输出正数的数量。

1 个答案:

答案 0 :(得分:0)

我们可以构造一个谓词,将正元素转换为列表,但更优雅的方法是构造一个与树中所有正数统一的谓词。像:

positive(tree(_,X,_),X) :-
    X > 0.
positive(tree(L,_,_),X) :-
    positive(L,X).
positive(tree(_,_,R),X) :-
    positive(R,X).

这是前缀表示法,我们将X统一为三个子句中的第一个。如果你想要中缀,你可以交换第一个和第二个预先。如果需要 postfix ,那么我们可以交换第一个和第三个子句。

现在我们可以使用findall/3元谓词:

positive_list(T,L) :-
    findall(P,positive(T,P),L).

构造这样一个positive/2谓词的好处是,我们还可以构造(部分接地)包含正数的树(例如positive(T,3).),进一步将一个部分接地的树接地应该包含一个正数(如T = tree(empty,3,_), positive(T,5).),并查询树中是否有正数(positive(tree(void,3,void),2).)。