2016-06-11 8 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]). 

F가의 3/5을 가지고 목록을 포함하도록 내가 선택 (M, 3,5, F)을 조회 할 수 있도록. 내가 작성한 기능이 제대로 작동하지 않습니다. 해결하도록 도와 주시겠습니까?

+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

관련 문제