2013-03-03 62 views
0

如果我有在两个列表返回值相同的Prolog

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

X = [4,1] 

我试图使用成员,并查找所有,但在后面跟踪,如果会员没有找到一个值将终止我的程序

谢谢

+2

交叉点([2,4,1,7],[4,9,1,8],X).'产生'X = [4,1] .' – CapelliC 2013-03-03 04:04:48

回答

2

听起来像你正在试图找到两个交集(这可能是一个很好的答案已经在这里某处,因为这是一个常见的问题,必须解决)。如果列表1的头部出现在列表2然后比赛应该是从列表1的尾部加上列表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中,则匹配应该仅仅是来自List1的尾部的匹配(并且List1的头部被忘记了)。

+1

应该可以工作,但你可以使它更紧凑*和*更有效地使用惯用的Prolog:在参数和使用中放置模式 - >而不是重复成员。另外,memberchk是用来代替member的,而append/3可以避免在递归调用 – CapelliC 2013-03-03 04:03:59

+0

的2 ^参数中。谢谢,我会尝试做出你所建议的修改,稍后编辑我的答案。 ! – 2013-03-03 05:38:01

+0

您的建议使得结果更清晰(更简洁)。谢谢! – 2013-03-03 09:07:15

相关问题