List 如何在Prolog中检查一个列表的所有元素是否都是另一个列表的成员
我现在正在学习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中实现这一点 如果你能帮我加快速度,那就太好了(?) 我在这里发现了类似的问题,但找不到
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
中的任何元素使用此规则,这将需要一些时间来处理我昏昏欲睡的大脑:)@Rasalasmember/2
是Prolog中的预定义谓词,因此最好不要重新定义它<如果A
是列表B
中的元素,则代码>成员(A,B)
成功。如果你需要一个不同的谓词行为,你应该写一个不同的谓词名称。感谢你的工作-它可以工作,但我认为我不能使用它,因为我们从来没有讨论过maplist/2
,包含/2
或成员/2
。我们只讨论了第一个原则…@Rasalas然后您可以使用自己的member/2
,并在本例中编写一个类似maplist/2
的谓词。它不必具有maplist/2
的一般性,只需通过列表中的每个元素递归,检查成员
条件,如图所示。但我认为第二个列表应该允许包含不在第一个列表中的元素。