2016-11-28 7 views
1

テール再帰を使用してプロローグ内のツリーを平坦化したい。再帰呼び出しで追加リストを使用してツリーを完成させた。私は私のバージョンを最適化したい。これは再帰呼び出しを使用する私の関数です。私はそれを最適化した末尾呼び出しにしたいです。プロローグツリーを平坦化するためのテールコールの最適化

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]] 

誰でも私を助けてくれますか?私はプロローグを初めてお使いですか? 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:拡張を得るために 'listing(fl)'と言ってください。 – false

+1

しかし、上記のようなDCGは事実上すべてのPrologに存在します! – false

関連する問題