2016-06-11 66 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