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

      Комментарии к записи Ответ в теме: Удалить элементы списка между заданными отключены
#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.