覆盖列表元素?

时间:2012-07-24 10:26:35

标签: list prolog

有没有办法将一个元素添加到列表中,如果它已经存在并且列表仍然不包含重复项,则无需关心?

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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, _),如文档页面所示。 ..

答案 2 :(得分:1)

基本上你想要实现一个集合;检查l ist manual page是否有设置操作。 似乎没有添加,但有union/3所以你可以通过与一组新元素(交集([NewEl],OldSet,NewSet)相交来添加元素。注意你不必转换列表到一个集合(列表是一个集合,只要它没有重复; list_to_set / 2只是消除它们。)

现在,如果您有一个包含重复项的列表,并且您希望有时按照您声明的方式添加元素,则必须自己实现。