2011-09-14 41 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