我是 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]).
返回所有结果,但最后它们只是挂起。有一个更好的方法吗?