Проверьте следующий шаблон программирования, который довольно часто используется в Прологе:
- Итерация по списку, по одному элементу за раз
- Установить базовый вариант для рекурсии
- В одном пункте проверьте, применяются ли условия и что-то сделать, затем продолжите рекурсию
- В следующем пункте пропустите элемент и продолжите рекурсию
Вы должны либо использовать вырез (!), Чтобы запретить возврат, либо явно проверить, что условие не применяется в последнем пункте.
Обратите внимание, что вы сказали, что хотели бы иметь выходной список с элементами, к которым применялось что-то (что не то, что вы написали в своем коде) ...
Применение этого шаблона к вашей проблеме выглядело бы примерно так:
myRecursion([], []). % This is the base case
myRecursion([Item|Tail], [Item|NTail]):-
something_applies(...),
do_something(...),
only_do_this_if_something(...),
always_do_this(...).
myRecursion(Tail, NTail).
myRecursion([Item|Tail], NTail):-
not(something_applies(...)),
do_something(...),
always_do_this(...),
myRecursion(Tail, NTail).