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

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

В этой теме 2 ответа, 2 участника, последнее обновление  Sash 1 год, 8 мес. назад.

  • Автор
    Сообщения
  • #2233

    Sash
    Участник

    Дан список L, элементами, которого являются списки. Необходимо проверить, содержит ли этот список хотя бы N элементов, длиной более M. Числа N и M тоже заданы.

    У меня есть решение на Visual Prolog, помогите перевести его на SWI Prolog, пожалуйста:

    len_NM(L,N,M):-
      foldl(
        L,
        {(A,B)=A+ if length(B) > M then 1 else 0 end if},
        0
      ) <= N.

  • #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) также является встроенной.

  • #2236

    Sash
    Участник

    Спасибо большое за подробное объяснение – очень помогли 🙂

Для ответа в этой теме необходимо авторизоваться.