Пролог списка фильтров - PullRequest
       1

Пролог списка фильтров

0 голосов
/ 07 декабря 2010

это похоже на мой последний вопрос, но теперь я хочу отфильтровать список по буквам.

test_filter0 :- filter_list([a,b,c,a,b,c],a,[a,a]).
test_filter1 :- filter_list([abc,abc,abc,bc,bc,bc,cd],bc,[bc,bc,bc]).
test_filter2 :- filter_list([a,b,c,d,e,f,g],h,[]).
test_filter3 :- filter_list([a,b,b,b,c,b,b],b,[b,b,b,b,b]).
test_filter :- test_filter0, test_filter1, test_filter2, test_filter3.

Я пытался:

filter_list([],C,[]) :- true, !.
filter_list([A|L1],C,[A|L2]) :- A==C, filter_list(L1,C,L2).
filter_list([A|L1],C,L2) :- C==A, filter_list(L1,C,L2).

1 Ответ

0 голосов
/ 07 декабря 2010

Очень близко, вам просто нужно неравенство в вашем последнем предложении filter_list/3, например:

filter_list([], C, []).
filter_list([A|L1], C, [A|L2]) :- 
    A == C, % equal to
    filter_list(L1, C, L2).
filter_list([A|L1], C, L2) :- 
    C \== A, % not equal to
    filter_list(L1, C, L2).

Чтобы сделать это более эффективным, вы можете добавить срез (!) после A == C для фиксации в этой ветви, поскольку Prolog оставит точку выбора для выполнения последнего предложения всякий раз, когда вызывается второе, потому что последнее имеет шаблон связывания (т. е. [A|L1], C, L2), который включает первый ([A|L1], C, [A|L2]). Обратите внимание, что первое предложение на самом деле не нуждается в разрезе, потому что шаблон привязки [], C, [] не включается в шаблон любого другого последующего предложения предиката.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...