有没有办法将一个元素添加到列表中,如果它已经存在并且列表仍然不包含重复项,则无需关心?
答案 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只是消除它们。)
现在,如果您有一个包含重复项的列表,并且您希望有时按照您声明的方式添加元素,则必须自己实现。