Prolog Tail调用优化以展平树

时间:2016-11-28 17:19:33

标签: prolog tail-recursion tail-call-optimization

我想使用尾递归在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]]

任何人都可以帮助我。我是prolog的新手。 TIA

1 个答案:

答案 0 :(得分:2)

你实际上并没有变平。这样做:

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

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

这就像尾随递归一样。