2013-03-03 65 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

相關問題