1

我的目标是有这个输入:

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))。

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

4

2 回答 2

2

另外,考虑使用 DCG:

leaves(l(X))     --> [X].
leaves(b(T1,T2)) --> leaves(T1), leaves(T2).
于 2012-01-19T15:24:57.513 回答
1

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

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

foo(X,Y,Z):- ....
于 2011-09-14T21:40:05.167 回答