2012-07-24 57 views
0

有沒有一種方法可以將元素添加到列表中,而不必關心它是否已經存在,並且列表中仍然不包含重複項?重寫列表元素?

+0

你上下文不是特別清楚。語言..? – EricG 2012-07-24 10:29:37

+0

對不起,我沒有標籤序言... – mezamorphic 2012-07-24 10:34:58

+0

好吧我不知道任何關於序言,但我會想到使用數組。數組的存在類似[0,1,0,1](任何語言)正確:-)如果我的評論無用,請原諒我。 – EricG 2012-07-24 10:36:49

回答

2

如果您正在尋找效率,那麼在SWI-Prolog中可以使用比列表更好的數據結構。特別是,您的用例符合add_nb_set(+ Key,!Set,?New)。

參數New控制WRT重複的行爲:您應該使用true不關心。 參數Set必須「分配」與empty_nb_set(Set)

編輯:我很抱歉,參數Set必須是don't care behaviour免費的變種,例如像add_nb_set(Key, Set, _),用於文檔的頁面明顯....

1

基本上你想實現一套;檢查l ist manual page的設置操作。 似乎沒有添加,但有union/3,所以你可以通過與一組新元素相交來添加元素(交集([NewEl],OldSet,NewSet)。注意,你不必將列表轉換爲集合(只要列表沒有重複,list_to_set/2就會消除);

現在,如果您有一個重複列表,並且您希望有時按照您陳述的方式添加一個元素,您將不得不自己實現的東西

+0

OP想要聯合,而不是{singleton有一個新元素}和舊集合。交集只是空的,或者是那個單例 - 如果集合包含那個新元素。 「ord_union/2」似乎符合法案,只要OP維護他們的名單總是有序的。 http://www.swi-prolog.org/pldoc/man?predicate=ord_union%2f3 – 2012-07-24 13:04:46

+0

@無疑,我的錯誤;固定 – 2012-07-24 20:44:15

2

你可以首先檢查項目是否包含在列表中添加它,只有當它不是 例如:。

add_no_duplicates(List, Item, NList):- 
    member(Item, List) -> NList=List ; NList=[Item|List]. 

測試:

?- add_no_duplicates([a,b,c],d,L). 
L = [d, a, b, c]. 
?- add_no_duplicates([a,b,c,d],d,L). 
L = [a, b, c, d]. 

注意的寫了add_no_duplicates/3需要輸入列表(列表)被實例化。