我试图找出一种方法来检查两个列表是否相等,无论它们的元素顺序如何.
我的第一次尝试是:
areq([],[]).
areq([],[_|_]).
areq([H1|T1], L):- member(H1, L), areq(T1, L).
Run Code Online (Sandbox Code Playgroud)
但是,这只检查左侧列表中的所有元素是否都存在于右侧列表中; 意思areq([1,2,3],[1,2,3,4]) => true.在这一点上,我需要找到一种能够以双向意义测试事物的方法.我的第二次尝试如下:
areq([],[]).
areq([],[_|_]).
areq([H1|T1], L):- member(H1, L), areq(T1, L), append([H1], T1, U), areq(U, L).
Run Code Online (Sandbox Code Playgroud)
在哪里我会尝试重建左边的那个以及最后的交换列表; 但这次失败了.
我对递归的感觉非常差,根本不知道如何改进它,尤其是Prolog.任何提示或建议都将在此时受到赞赏.
我现在正在学习Prolog,递归思维对我来说很难。
我有两个列表,例如L1=[1,2,3]和L2=[3,1,2]我应该检查 的所有元素是否L1都包含在L2
所以allMembers(L1,L2).应该返回true并且allMembers(L1,[2,3,4]).应该返回false,因为没有4inL1
我认为如果它在另一个列表中找到该元素(通过将其拆分直到列表只包含一项),可以获取一个列表的头部并返回 true,但我不知道如何在序言。
如果你能帮助我更快地吸收,那就太好了(?)
我在这里发现了类似的问题,但找不到我的具体问题的答案:/
编辑:
我现在有:
isMemberOf(X,[X|_]).
isMemberOf(X,[_|T]):- member(X,T).
Run Code Online (Sandbox Code Playgroud)
我需要将其用于L1to中的任何元素L2