0

有没有办法将元素添加到列表中,而不关心它是否已经存在并且列表仍然不包含重复项?

4

3 回答 3

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 需要实例化输入列表(List)。

于 2012-07-24T13:20:04.603 回答
2

如果您正在寻找效率,有比列表更好的数据结构,可以在 SWI-Prolog 中使用。特别是,您的用例适合add_nb_set (+Key, !Set, ?New)。

参数New控制 WRT 重复的行为:你应该使用truefor don't care。参数Set必须与empty_nb_set(Set)

编辑:我很抱歉,参数Set必须是一个免费的变量don't care behaviour,例如add_nb_set(Key, Set, _),如文档页面所示......

于 2012-07-24T16:58:58.340 回答
1

基本上你想实现一个集合;查看list 手册页以了解设置操作。似乎没有添加,但有union/3,因此您可以通过与一组新元素(intersection([NewEl],OldSet,NewSet)相交来添加元素。请注意,您不必将列表转换为set (列表是一个集合,只要它没有重复项;list_to_set/2 只是消除它们)。

现在,如果您有一个包含重复项的列表,并且您有时希望按照您所说的方式添加一个元素,您将不得不自己实现一些东西。

于 2012-07-24T12:34:28.847 回答