Я разрабатываю приложение, написанное в 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».
Я как раз собирался прокомментировать Я нашел (глупую) ошибку, когда прочитал ваш ответ. Большое вам спасибо, это была ошибка! Хотя, что объясняет вторую ошибку? –
Я думаю об опечатке при написании вопроса, потому что программа, как написано, выведет список * неинтересных * переменных – CapelliC