2016-11-28 86 views
1

我想使用尾遞歸來扁平化prolog中的一棵樹。我已經用遞歸調用來追加列表。我想優化我的版本。這是我使用遞歸調用的函數。我想讓它的尾部調用優化。Prolog爲扁平化樹調用尾部優化

fl_t(lf(A),[A]). 
fl_t(tr(A,B,C),S4):- fl_t(A,X1),fl_t(C,X2),append(X2,[Y],X3),append(X3,X1,S4). 

Input : fl_t(lf(a),Result) 
Output : Result=[a] 

Input : fl_t(tr(lf([1, 2]), 3, leaf([4, 5])),Result) 
Output : Result = [[1,2],3,[4,5]] 

任何人都可以幫助我please.I新來的序言。 TIA

+0

缺少'B = Y' - 至少 – false

回答

1

你實際上並不平坦。這將這樣做:

fl_t(T, Xs) :- 
    phrase(fl(T), Xs). 

fl(lf(A)) --> [A]. 
fl(tr(A, B, C)) --> 
    fl(A), 
    [B], 
    fl(C). 

這是作爲尾遞歸,因爲它可能是。

+0

我怎樣才能通過使用累加器來代替短語功能。謝謝:) –

+1

@billwilliams:說'列表(fl)'得到擴展。 – false

+1

但是...像上面這樣的DCG幾乎存在於任何Prolog中! – false