2011-09-14 43 views
1

我的目标是有这个输入:重写递归sicstus序言功能

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

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

回答

1

,如果你有一个谓语,要重新orded的参数,最简单的方法(IMO)是写一个包装断言:

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

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

它完美的作品:) – keyser

2

而且,考虑使用DCG中:

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

我不确定这是与问题有关,但感谢提及DCGs。他们似乎是一个可行的选择。 – keyser

+2

@keyser:在这里使用DCG会使翻译成本线性化,而append/3可以很容易二次方! – false