標準の入力から読み取り、読み取られたすべての行のリストを作成していると仮定します。最後に、これらの行をコンマで区切って表示する必要があります。
go:-
prompt(_, ''),
processInput([ ], Lines),
findall(_, (member(L, Lines), write(L), write(',')), _),
nl.
processInput(LinesSoFar, Lines):-
read_line_to_codes(current_input, Codes),
processInput(Codes, LinesSoFar, Lines).
processInput(Codes, LinesSoFar, Lines):-
( Codes \= end_of_file
->
atom_codes(Line, Codes),
append(LinesSoFar, [ Line ], LinesSoFar1), % <---- append/3 - O(n)
processInput(LinesSoFar1, Lines)
;
Lines = LinesSoFar ).
このコードの問題は、append
呼び出しにprocessInput/3
O(n)のコストがかかることです。どうすればこのコストを回避し、述語を末尾再帰にすることができますか(標準入力から多くの行を読み取る可能性があるため)?
を次のように置き換えることができると思いましたappend
。
LinesSoFar1 = [ Line | LinesSoFar ],
そして、それを表示する前にリストを逆にすることができます。しかし、それはハッキーのようです。もっと良い方法はありますか?