序言 - 如何检查列表是否包含某个项目
问题描述:
假设我有一个列表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的列表。我写的功能无法正常工作,你能帮我解决吗?
答
正如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
如果要检查列表是否包含成员,请使用'memberchk/2'。所以'memberchk(I/J,Item)'成功,如果'I/J'在'Item'列表中。你的'include/3'谓词没有基本情况,并且试图确保*给定列表中的每个*元素都是'I/J',所以它总是失败。 – lurker