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

List 如何在Prolog中检查一个列表的所有元素是否都是另一个列表的成员,list,prolog,compare,List,Prolog,Compare,我现在正在学习Prolog,递归思维对我来说很难 我有两个列表,例如L1=[1,2,3]和L2=[3,1,2],我应该检查L1的所有元素是否都包含在L2 所以所有成员(L1,L2)。应该返回true和所有成员(L1[2,3,4])。应该返回false,因为L1中没有4 我认为如果它在另一个列表中找到该元素(通过将其拆分,直到列表只包含一个项),则可以获取一个列表的头并返回true,但我不知道如何在Prolog中实现这一点 如果你能帮我加快速度,那就太好了(?) 我在这里发现了类似的问题,但找不到

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

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

所以
所有成员(L1,L2)。
应该返回
true
所有成员(L1[2,3,4])。
应该返回
false
,因为
L1
中没有
4

我认为如果它在另一个列表中找到该元素(通过将其拆分,直到列表只包含一个项),则可以获取一个列表的头并返回true,但我不知道如何在Prolog中实现这一点

如果你能帮我加快速度,那就太好了(?)

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

编辑:
我现在有:

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

我需要将其用于
L1
L2
中的任何元素,以解决您的子问题:
成员(A,B)
为真,如果
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
contains(L2)
应用于
L1
的每个元素,如果每次调用成功,则将成功
contains/2
类似于
member/2
,但将参数按顺序放置,以使其与
maplist

一起工作,只需如下使用:

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

请注意,
list\u 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).

这就解决了仅使用自定义谓词的问题:

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).

如果两个列表包含相同的元素,但顺序不一定相同,您的意思是说
allMembers
是真的吗?关于副本呢?好问题,任务就像文档一样编写(从德语翻译成英语):
allMembers(L1,L2)。%检查L1中的所有元素是否在L2中可用
。如果列表
L1
中的所有元素都在
L2
中,我想复制是不相关的,因此这也意味着
L2
可能包含不在
L1
中的元素。是的,没有其他解释。这让我更进一步了,谢谢。我不知道为什么我没有得到那个。我现在有
成员(X,[X | | | | | | | | | | | | | | | | | | | | | | | |。现在我需要对
L1
中的任何元素使用此规则,这将需要一些时间来处理我昏昏欲睡的大脑:)@Rasalas
member/2
是Prolog中的预定义谓词,因此最好不要重新定义它<如果
A
是列表
B
中的元素,则代码>成员(A,B)
成功。如果你需要一个不同的谓词行为,你应该写一个不同的谓词名称。感谢你的工作-它可以工作,但我认为我不能使用它,因为我们从来没有讨论过
maplist/2
包含/2
成员/2
。我们只讨论了第一个原则…@Rasalas然后您可以使用自己的
member/2
,并在本例中编写一个类似
maplist/2
的谓词。它不必具有
maplist/2
的一般性,只需通过列表中的每个元素递归,检查
成员
条件,如图所示。但我认为第二个列表应该允许包含不在第一个列表中的元素。