如果我有
findmatching([2,4,1,7], [4,9,1,8], X).
X = [4,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的头部)。