list - 删除序言中列表中的共享项目

标签 list sorting prolog

我一直在尝试编写一个函数,该函数接受两个列表,并返回列表一中未出现在列表 2 中的项目的列表。这是我到目前为止的代码。我遇到的障碍是我不知道如何在我的 member() 行上测试 false。

%remove_them/3
remove_them([H|T],List,[Newhead|NewTail]):-
    not(member(H,List)),
    Newhead is H,
    remove_them(T,List,NewTail).

remove_them([H|T],List,NewList):-
    member(H,List),
    remove_them(T,List,NewList).

最佳答案

你忘了说这个递归应该何时结束(第一行):

remove_them([],_,[]).
remove_them([H|T],List,[H|NewTail]):- 
    \+(member(H,List)), 
    remove_them(T,List,NewTail).
remove_them([H|T],List,NewList):- 
    member(H,List), 
    remove_them(T,List,NewList).

?- remove_them([1,2,e],[a,4,1],L).
L = [2, e] ;
false.

?- remove_them([r,2,3],[a,4,1,e],L).
L = [r, 2, 3] ;
false.

正如 Guy Coder 所指出的还有ordered sets的可能性。在 SWI Prolog 中,您可以使用此功能来缩短/优化您的代码。请注意,集合中不能出现重复项:

remove_them2(Ori, Minus, Erg):-
    list_to_ord_set(Ori, Sori),
    list_to_ord_set(Minus, Sminus),
    ord_subtract(Sori, Sminus, Erg).

?- remove_them2([r,2,3],[a,4,1,e],L).
L = [2, 3, r].

?- remove_them2([1,2,e],[a,4,1],L).
L = [2, e].

?- remove_them2([a,a,a,b,b],[b,1,2],L).
L = [a].

关于list - 删除序言中列表中的共享项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65085447/

相关文章:

java - 将列表中的列表提取为单个列表

python - 对列表中的元素子列表进行排序,将其余元素留在原地

C:从文件输入排序,收到大量编译错误

Python Pandas 按多索引和列排序

python - 这个 "[.. for .. in ..]"在 Python 中如何工作?

r - 从多个数据框中选择第一行并绑定(bind)

c++ - 排序二维动态数组 C++

prolog - 序言中的广度优先

prolog - 终止[用户]。 Prolog 中带有 EOT 字符

prolog - 不同 Prolog 实现的兼容层