Ответ в теме: Проверить длину вложенных списков

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

В приведенном вами коде используется встроенный предикат foldl, который применяет функцию от двух аргументов к парам. Первым элементом пары является значение, полученное при обработке предыдущего элемента, а вторым – текущий элемент. При обработке первого элемента списка в качестве предыдущего результата используется третий аргумент foldl. Функция Функция foldl является стандартной в большинстве функциональных и логических языков, в том числе и в SWI Prolog.

В качестве второго аргумента функция принимает функцию, которая выполняет обработку пар. В данном случае используется анонимная функция (лямбда), я использую старую версию SWI Prolog, в ней отсутствуют лябда-функции. Можно написать вспомогательную функцию и в этом случае, однако я думаю это не очень правильно, т.к. в данном случае лямбда не выполняет никакой осмысленной операции (даже название функции придумать сложно).

Я бы использовал встроенную функцию include для фильтрации списков, длина которых не удовлетворяет условию. Функция принимает функцию, задающую условие и исходный список, результат формируется в третьем аргументе и содержит все элементы исходного списка, удовлетворяющие условию. Функция проверки условия в этом случае должна принимать ограничение длины вложенных списков и элемент-список, для которого выполняется проверка:

process_pair(LengthLimit, List):-
  length(List, ListLength), 
  ListLength >= LengthLimit.

Основная функция должна отфильтровать из исходного списка все короткие вложенные списки и сравнить длину того, что осталось с заданным ограничением:

inner_list_lenght_check(ListOfList, LengthLimit, LimitListCount):-
  include(process_pair(LengthLimit), ListOfList, InnerLongList),
  length(InnerLongList, InnerLongListLength),
  InnerLongListLength >= LimitListCount.

Функция вычисления длины списка (length) также является встроенной.