0

私が持っている場合

findmatching([2,4,1,7], [4,9,1,8], X).

X = [4,1]

私はメンバーを使用してすべてを見つけようとしていますが、バックトラッキングでメンバーが値を見つけられない場合、プログラムが終了します

ありがとう

4

1 に答える 1

2

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 の先頭は忘れられます)。

于 2013-03-03T03:03:59.647 に答える