在两个Prolog列表中返回相同的值

时间:2013-03-03 00:13:44

标签: recursion prolog

如果我有

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

X = [4,1]

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

由于

1 个答案:

答案 0 :(得分: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的头部)。