2012-12-15 45 views
0

我在序言中有一個包含多個項目的列表。我需要對這個列表的內容進行「規範化」,並將結果寫入一個新列表。但是我仍然有這個問題。 下面的代碼顯示我是如何做的:如何將項目添加到序言中的列表

normalizeLists(SourceList, DestList) :- 

% get all the member of the source list, one by one 
member(Item, SourceList), 

% normalize the item 
normalizeItem(Item, NormItem), 

% add the normalize Item to the Destination List (it was set [] at beginning) 
append(NormItem, DestList, DestList). 

的問題是在追加謂語。我想這是因爲在序言中,我不能命令式編程做這樣的事情,如:

DestList = DestList + NormItem,

但我怎麼可以這樣做,在Prolog的?或者如果我的方法不正確,我該如何編寫序言代碼來解決這類問題。

任何幫助真的很感激。

乾杯在Prolog中

回答

1

變量不能被修改,一旦通過統一約束。這是一個變量是免費或有一個確定的值(一個術語,可能是另一個變量)。那麼append(NormItem, DestList, DestList)將失敗的任何NormItem,它不是一個空的列表。

這是另一個問題NormItem它不是一個列表。您可以嘗試

normalizeLists([], []). 
normalizeLists([Item|Rest], [NormItem|NormRest]) :- 

% normalize the item 
normalizeItem(Item, NormItem), 

normalizeLists(Rest, NormRest). 

或者(如果您的Prolog的支持的話)完全跳過這樣的定義,並使用較高階謂詞,像MAPLIST

... 
maplist(normalizeItem, Items, Normalized), 
... 
+0

CapelliC嗨。它工作正常。謝謝。順便說一句,是的我的序言支持地圖列表。你能分享一些關於如何在maplist中做的更多信息嗎?謝謝 –

+0

我嘗試了maplist(只是嘗試你的建議),它的效果令人驚訝。減少不必要的代碼。謝謝 –