Шаг первый логического программирования, начните с базовых случаев.Что вы хотите, чтобы произошло, когда есть менее трех элементов?Полагаю, вам нужен пустой список?
without_last_three([], []).
without_last_three([_], []).
without_last_three([_,_], []).
without_last_three([_,_,_], []).
Теперь для списка с более чем тремя элементами вы хотите сохранить первый элемент и удалить три из оставшихся элементов.Сначала вы можете попытаться написать:
without_last_three([A|L], [A|M]) :- without_last_three(L, M). !!wrong
, но это приведет к неверным результатам из-за обратного отслеживания.Самый простой способ исправить это - проверить, что L имеет более трех элементов:
without_last_three([A,B,C,D|L], [A|M]) :- without_last_three([B,C,D|L], M).
Но более элегантным решением было бы использование оператора обрезки Prolog:
without_last_three([A|L], [A|M]) :- !, without_last_three(L, M).
Для реализациибез_первого_три, не скучая, вы можете просто перевернуть список, удалить последние три и снова перевернуть его:
without_first_three(I, O) :- reverse(I, A), without_last_three(A, B), reverse(B, O).
или просто написать несколько действительно простых правил:
without_first_three([], []).
without_first_three([_], []).
without_first_three([_,_], []).
without_first_three([_,_,_|L], L).
(Подумав об этом, может быть, было бы лучше реализовать без_last_three в терминах без_первого_трека, а не наоборот)!