Ответ в теме: Удалить элементы списка между заданными

      Комментарии к записи Ответ в теме: Удалить элементы списка между заданными отключены
#1780

Можно использовать для этого стандартные предикаты append и length.

slice_list(Source, N, M, Slice):-
append(Left, SliceWithRight, Source),
append(Slice, _Right, SliceWithRight),
SliceLen is M - N,
length(Left, N), length(Slice, SliceLen), !.

Сначала исходный список делится на 2 части — левую (Left) и правую (SliceWithRight, содержащую нужные нам элементы и «мусор»).
SliceWithRight делится еще раз на левую (Slice, результат) и правую части. все это можно выполнить при помощи стандартного предиката append, который разделит исходный список всеми возможными способами и остается лишь указать ему длины списков.
Очевидно, длина самого левого списка равна N, а длина среза вычисляется как M-N. Задать длины можно стандартным предикатом length.