如果我有
findmatching([2,4,1,7], [4,9,1,8], X).
X = [4,1]
我正在尝试使用成员并找到所有成员,但是如果成员找不到值,则在回溯时会终止我的程序
谢谢
听起来您正试图找到两个集合的交集(可能已经在某个地方找到了一个很好的答案,因为这是一个必须解决的常见问题)。
我会这样解决它:
% 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 的头部被遗忘了)。