findmatching([2,4,1,7], [4,9,1,8], X).
X = [4,1]
我試圖使用成員,並查找所有,但在後面跟蹤,如果會員沒有找到一個值將終止我的程序
謝謝
findmatching([2,4,1,7], [4,9,1,8], X).
X = [4,1]
我試圖使用成員,並查找所有,但在後面跟蹤,如果會員沒有找到一個值將終止我的程序
謝謝
聽起來像你正在試圖找到兩個交集(這可能是一個很好的答案已經在這裏某處,因爲這是一個常見的問題,必須解決)。如果列表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的頭部被忘記了)。
應該可以工作,但你可以使它更緊湊*和*更有效地使用慣用的Prolog:在參數和使用中放置模式 - >而不是重複成員。另外,memberchk是用來代替member的,而append/3可以避免在遞歸調用 – CapelliC 2013-03-03 04:03:59
的2 ^參數中。謝謝,我會嘗試做出你所建議的修改,稍後編輯我的答案。 ! – 2013-03-03 05:38:01
您的建議使得結果更清晰(更簡潔)。謝謝! – 2013-03-03 09:07:15
交叉點([2,4,1,7],[4,9,1,8],X).'產生'X = [4,1] .' – CapelliC 2013-03-03 04:04:48