0

如果我有

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

X = [4,1]

我正在尝试使用成员并找到所有成员,但是如果成员找不到值,则在回溯时会终止我的程序

谢谢

4

1 回答 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 的头部被遗忘了)。

于 2013-03-03T03:03:59.647 回答