Ответ в теме: SWI Prolog: Разбить список на подсписки разной длины

      Комментарии к записи Ответ в теме: SWI Prolog: Разбить список на подсписки разной длины отключены
#3980

Для решения вашей задачи нужна функция, которая будет выбирать N первых элементов списка, мы уже писали такую функцию — get_first_n. Но в нашем случае мало извлечь первые N элементов, ведь надо получить хвост (из него мы будем пробовать извлечь N*2 элементов). Тем не менее, реализуется это подобным образом — с помощью length и append.

Кроме того, если размер последней части окажется меньше нужной нам длины — надо взять весь список (или не брать ничего — у вас про такой случай в условии не сказано).

Исходный код мог бы выглядеть следующим образом:

%divide_power_two(+List, -ListOfParts)
divide_power_two(List, ListOfParts):-
  divide_power_two(List, 1, ListOfParts).
  
divide_power_two(List, N, [[List]]):-
  length(List, Len), Len =< N, !.
divide_power_two(List, N, [FirstN|TailParts]):-
  append(FirstN, Tail, List),
  length(FirstN, N), !, 
  NextN is N*2,
  divide_power_two(Tail, NextN, TailParts).

Вспомогательная функция принимает параметр N (длину текущей выделяемой части списка). При первом вызове N равно единице, на каждой следующей итерации его значение увеличивается в два раза. Процесс останавливается когда в списке останется меньше N элементов (Len =< N).