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

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

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на списки Подсчитать количество вложенных списков

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 2 года/лет, 3 мес. назад.

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

    questioner
    Участник

    Помогите пожалуйста найти решение задачи (Strawberry Prolog).

    Нужно подсчитать сколько в списке есть вложенных списков, то есть на примере:
    ?-inList([[1,[2,[2,1,1]],3],[2,3],[3,4],[4,5,6],4,[4,5,6,7],[2]],R), write(R).
    должен быть ответ
    8 Yes.
    Должно работать с любой глубиной вложенности.

  • #1922

    inList([], 0):-!.
    inList([Head|Tail], InnerListCount):-
      is_list(Head), !, 
      inList(Head, HeadCount), inList(Tail, TailCount), 
      InnerListCount is HeadCount + TailCount + 1.
    inList([_Head|Tail], InnerListCount):-
      inList(Tail, InnerListCount).

    Возможны три вариант входных данных:

    1. пустой исходный список — не содержит вложенных списков, результатом работы функции должен быть ноль;
    2. список, первый элемент которого также является списком (проверка выполняется стандартным предикатом is_list). В этом случае результат функции должен складываться из результатов рекурсивной обработке первого элемент (Head), остальных элементов исходного списка (Tail) и единицы (т.к. по крайней мере один вложенный список мы уже нашли);
    3. если первый элемент не является списком, то его следует игнорировать и рекурсивно обработать остальные элементы

    Встроенный предикат is_list есть в SWI и GNU Prolog, однако, в Strawberry я его вроде бы не видел, при необходимости его можно записать так:
    is_list([_]).

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