如何检查一个列表的所有元素是否都是 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).
应该returntrue
,allMembers(L1,[2,3,4]).
应该returnfalse
,因为里面没有4
L1
我认为有可能获得一个列表的头部,如果它在另一个列表中找到该元素(通过将其拆分直到列表仅包含一个项目),则 return 为真,但是我不知道如何在 Prolog 中做到这一点。
如果你能帮助我加快理解速度就好了 (?)
我在这里发现了类似的问题,但找不到我的具体问题的答案:/
编辑:
我现在有:
isMemberOf(X,[X|_]).
isMemberOf(X,[_|T]):- member(X,T).
我需要将其用于 L1
到 L2
中的任何元素
要解决您的子问题:如果 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/2
与 member/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).
我现在正在学习Prolog,递归思维对我来说很难。
我有两个列表,例如L1=[1,2,3]
和 L2=[3,1,2]
我应该检查 L1
的所有元素是否都包含在 L2
所以allMembers(L1,L2).
应该returntrue
,allMembers(L1,[2,3,4]).
应该returnfalse
,因为里面没有4
L1
我认为有可能获得一个列表的头部,如果它在另一个列表中找到该元素(通过将其拆分直到列表仅包含一个项目),则 return 为真,但是我不知道如何在 Prolog 中做到这一点。
如果你能帮助我加快理解速度就好了 (?)
我在这里发现了类似的问题,但找不到我的具体问题的答案:/
编辑:
我现在有:
isMemberOf(X,[X|_]).
isMemberOf(X,[_|T]):- member(X,T).
我需要将其用于 L1
到 L2
要解决您的子问题:如果 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/2
与 member/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).