私は Prolog を初めて使用し、2 つのリストにまったく同じ要素があるかどうかを確認するのに問題があります。要素が異なる順序である可能性があります。私はこのコードを持っています:
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]).
すべての結果を返しますが、最後にハングします。これを行うより良い方法はありますか?