2016-06-11 2 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]].Prolog - Как проверить, содержит ли список определенный элемент

Я хочу только вернуть список списков, содержащих определенный элемент, например, 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]). 

так, что я могу запросить выбор (M, 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

Смежные вопросы