私が持っている場合
findmatching([2,4,1,7], [4,9,1,8], X).
X = [4,1]
私はメンバーを使用してすべてを見つけようとしていますが、バックトラッキングでメンバーが値を見つけられない場合、プログラムが終了します
ありがとう
2 つのセットの交点を見つけようとしているように聞こえます (これは、解決しなければならない一般的な問題であるため、おそらく既にここにあるという素晴らしい答えがあるでしょう)。
私は次のようにそれを解決します:
% an empty list intersects with nothing
findmatching([], _, []).
% Matches is the intersection of the set defined by List1 and the set
% defined by List2
findmatching([List1H|List1T], List2, Matches) :-
memberchk(List1H, List2) ->
(findmatching(List1T, List2, MatchesT),
Matches = [List1H|MatchesT])
;
findmatching(List1T, List2, Matches).
この述語では、List1 の先頭が List2 に表示される場合、Matches は List1 の末尾と List1 の先頭からの一致である必要があります。List1 の先頭が List2 に表示されない場合、Matches は List1 の末尾からの一致のみである必要があります (List1 の先頭は忘れられます)。