我是Prolog的新手,我遇到了一个问题:如何检查两个列表是否具有完全相同的元素。这些元素可能以不同的顺序出现。我有以下代码:
myremove(X, [X|T], T).
myremove(X, [H|T], [H|R]) :-
myremove(X, T, R).
same_elements([], []).
same_elements([H1|T1], L2) :-
myremove(H1, L2, Nl2),
same_elements(T1, Nl2).
除了...,它可以正常运作。
?- same_elements([b,c,a], X).
当返回第一个结果后,会导致内存溢出错误。因此,我尝试通过检查列表的长度是否相等以及检查H1是否是L2的成员来缩小结果集:
mylength([], 0).
mylength([_|T], R) :-
mylength(T, Nr),
R is Nr+1.
mymember(X, [X|_]).
mymember(X, [_|T]) :-
mymember(X, T).
same_elements([], []).
same_elements([H1|T1], L2) :-
mylength([H1|T1], X),
mylength(L2, Y),
Y = X,
mymember(H1, L2),
myremove(H1, L2, Nl2),
same_elements(T1, Nl2).
现在,两者皆然。
?- same_elements([b,c,a], X).
?- same_elements(X, [b,c,a]).
返回所有结果,但最后它们只是停滞在那里。有更好的方法吗?
same_elements(X,Y) :- msort(X,S),msort(Y,S)
。 - CapelliC