2013-02-11 2 views
3

Я разрабатываю приложение, написанное в Prolog. Я добираюсь до точки, в которой я хочу отфильтровать список элементов и удалить те, которые не соответствуют определенным ограничениям или условиям, сохраняя исходный порядок списка. Я думал, что лучший способ для этого было бы что-то вроде этого:Отфильтровать список в Prolog

filter([],Filtered). 
filter([L|List],[F|Filtered]) :- 
    /* Conditions are met: bypass the element to the filtered list */ 
    check_conditions(L), 
    filter(List,Filtered). 
filter([L|List],Filtered) :- 
    /* Conditions are not met: do not include the element in the filtered list */ 
    filter_aborts(List,Filtered). 

Перед тем как принять его в качестве решения моей проблемы, я хотел дать ему попробовать (независимо друг от друга), поэтому я составил и запустить свой код (SWI -Prolog) и проверили несколько ситуаций. Когда я набираю в запросе Пролог с использованием жестко запрограммированный список (или что вы хотите назвать это) я получаю то, что-то вроде этого:

?- filter([id01,id02,id03,id04,id05,id06],F). 
F = [id03, id05, id06|_G1024] . 

Список, конечно, фильтруется, но я получаю это имя экземпляра «_G1024» в конце его. Я понимаю, что это происходит, потому что F не создается, но я не знаю, каким будет решение. Более того, если я пытаюсь сделать что-то другое, как войти в список как конкретизированной переменной, что я получаю еще более странно:

?- L=[id02,id03,id04,id05,id06]. 
L = [id02, id03, id04, id05, id06]. 

?- filter(L,F). 
L = [] ; 
L = [id01], 
F = [id01|_G347] ; 
L = [id01, id01], 
F = [id01, id01|_G403] 
... and so on. 

ли не Prolog переменные, как предполагается, будет назначать однократно переменные? Действительно ли моя программа меняет L или я не понимаю ее правильно? Часть из этого, так как я новичок в Prolog, я был бы признателен за любые комментарии относительно моего Prolog -let's say ...- «style».

ответ

4

ваша база рекурсии должна быть написана

filter([],[]). 

и у вас есть опечатка

filter([L|List],[L|Filtered]) :- 
... 

вместо (второго) L вы имели одноплодной F

+0

Я как раз собирался прокомментировать Я нашел (глупую) ошибку, когда прочитал ваш ответ. Большое вам спасибо, это была ошибка! Хотя, что объясняет вторую ошибку? –

+0

Я думаю об опечатке при написании вопроса, потому что программа, как написано, выведет список * неинтересных * переменных – CapelliC

7

Вы можете использовать SWI-Prolog, поэтому вы можете написать предикат, который преуспевает или терпит неудачу в соответствии с вашими условиями, затем используйте include (Predidate, Lst, Success). Для axample

include(check_conditions,Lst, Success) 
+0

вы правы (+1), предикат будет лучше написан с include/3, но я оказался сам, чтобы написать фильтр/3, потому что я хотел (для некоторой эффективности) иметь возможность изменять принятые элементы – CapelliC

+0

Tanks @ joel76! Я не знал об этом 'include/3' предикате. Я буду использовать его здесь, так как он отлично соответствует моим потребностям. –

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