重写递归sicstus prolog函数

时间:2011-09-14 18:31:53

标签: prolog dcg

我的目标是获得此输入:

L = [a,b,c], build_tree(L,T).

使用此输出:

L = [1,30,kth,5],
T = b(l(a),b(l(b),b(l(c)))) ? 

yes

使用此代码,可以计算树中叶子的数量:

leaves(l(X), [X]).
leaves(b(L1,L2),V):-
    leaves(L1,V1),
    leaves(L2,V2),
    append(V1,V2,V).

我可以通过简单地为函数提供列表而不是树作为输入来获得所需的输出,例如:

L = [a,b,c], leaves(T,L).

这里唯一的问题是它以错误的顺序接受参数(即build_tree(T,L)而不是build_tree(L,T))。

那么,我怎样才能产生相同的结果,只需交换输入参数? 我已经尝试了每一个“明显”的解决方案(交换变量),但我猜它可能不像看起来那么容易,因为它是一个递归方法。

2 个答案:

答案 0 :(得分:2)

另外,请考虑使用DCG:

leaves(l(X))     --> [X].
leaves(b(T1,T2)) --> leaves(T1), leaves(T2).

答案 1 :(得分:1)

如果你有一个谓词并且想要重新定义参数,最简单的方法(imo)就是编写一个包装谓词:

my_foo(X,Y,Z):-
    foo(Y,Z,X).

foo(X,Y,Z):- ....