Большинство предикатов, связанных с обработкой списка, превращаются в правило для пустого списка и правило для обработки одного элемента и рекурсивной обработки остальной части списка. Как шаблон, он будет выглядеть примерно так:
pred([]) :- ??? % empty case
pred([X|Xs]) :-
??? % handle X
pred(Xs). % recur for the tail of the list
Обратите внимание, что мы просто используем здесь определение списка, никаких специальных предикатов не требуется. Посмотрите, достаточно ли это для вас, чтобы найти решение, и если вы это сделаете, опубликуйте его как ответ.