我一直在尝试编写一个函数,该函数接受两个列表,并返回列表一中未出现在列表 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/