2016-06-11 68 views
1

假設我有一個列表M = [[1/4,2/2,3/5,4/3,5/1],[1/3 ,2/5,3/2,4/4,5/1],[1/5,2/3,3/1,4/4,5/2],[1/4,2/1,3]/3,4/5,5/2],[1/5,2/2,3/4,4/1,5/3],[1/1,2/4,3/2,4/5 ,5/3],[1/2,2/5,3/3,4/1,5/4],[1/1,2/3,3/5,4/2,5/4], [1/3,2/1,3/4,4/2,5/5],[1/2,2/4,3/1,4/3,5/5]]。序言 - 如何檢查列表是否包含某個項目

我只想返回包含特定項目的列表,例如3/5。

我試着寫,看起來像函數:

include([X/Y|Rest],I,J):- 
    X=:=I, 
    Y=:=J, 
    include(Rest,I,J). 

pick([Item|Rest],I,J,Final):- 
    include(Item,I,J), 
    pick(Rest,I,J,[Item|R]). 

,這樣我可以查詢選秀權(男,3,5,F),使F包含已在其3/5的列表。我寫的功能無法正常工作,你能幫我解決嗎?

+2

如果要檢查列表是否包含成員,請使用'memberchk/2'。所以'memberchk(I/J,Item)'成功,如果'I/J'在'Item'列表中。你的'include/3'謂詞沒有基本情況,並且試圖確保*給定列表中的每個*元素都是'I/J',所以它總是失敗。 – lurker

回答

0

正如lurker所說,使用會員並不要忘記基本情況。

foo([],_,F). 
foo([H|T],Item,[H|F]):- 
    member(Item, H), 
    foo(T,Item,F). 
foo([_|T],Item,F) :- 
    foo(T,Item,F). 
+1

'foo([[3/5]],3/5,[])'不正確地成功 – false