假設我們正在從標準輸入讀取並構建所有已讀取行的列表。最後,我們需要顯示那些以逗號分隔的行。避免在Prolog中追加/ 3的線性成本
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 ],
而且我們可以在顯示它之前將列表反轉。但這似乎很難。有沒有更好的辦法?
你知道這可能看起來很詭異,但它是這樣做的Prolog方式。如果你做得對,它會保留邏輯語義。 – 2011-06-09 09:31:46