如何检查一个列表的所有元素是否都是 Prolog 中另一个列表的成员

How to check if all elements of one list are members of another list in Prolog

我现在正在学习Prolog,递归思维对我来说很难。

我有两个列表,例如L1=[1,2,3]L2=[3,1,2] 我应该检查 L1 的所有元素是否都包含在 L2

所以allMembers(L1,L2).应该returntrueallMembers(L1,[2,3,4]).应该returnfalse,因为里面没有4 L1

我认为有可能获得一个列表的头部,如果它在另一个列表中找到该元素(通过将其拆分直到列表仅包含一个项目),则 return 为真,但是我不知道如何在 Prolog 中做到这一点。

如果你能帮助我加快理解速度就好了 (?)

我在这里发现了类似的问题,但找不到我的具体问题的答案:/

编辑:
我现在有:

isMemberOf(X,[X|_]).
isMemberOf(X,[_|T]):- member(X,T).

我需要将其用于 L1L2

中的任何元素

要解决您的子问题:如果 A 是列表 B 的成员,则 member(A,B) 为真。

可能最简单的定义方式可能是:

% contained_in(L1, L2) succeeds if all elements of L1 are contained in L2
contained_in(L1, L2) :- maplist(contains(L2), L1).
contains(L, X) :- member(X, L).

maplist/2 将对 L1 的每个元素应用 contains(L2),并且如果每次调用都成功,则将成功。 contains/2member/2 相似,但将参数置于使其与 maplist 一起使用的顺序。

只需像这样使用list_permuted/2

?- list_permuted([1,2,3],[3,1,2]).
true.

请注意,list_permuted/2 要求两个列表具有相同数量的相同商品!

使用事实上的标准谓词的快速解决方案:

all_from_first_in_second(List1, List2) :-
    forall(member(Element,List1), member(Element,List2)).

这解决了只有自定义谓词的问题:

% allMembers(L1,L2) checks if all elements of L1 are available in L2
% solve the sub problem
isMemberOf(X,[X|_]).
isMemberOf(X,[_|T]):- isMemberOf(X,T).

% iterate through 'L1' and ask if the member exists in 'L2'
allMembers([],_).
allMembers([H|T],L):- allMembers(T,L), isMemberOf(H,L).