Ответ в теме: Подсчет количества вложенных списков заданной длины

#1776

count_inner_lists([], _Len, 0):-!.
count_inner_lists([InnerList|Tail], Len, Count):-
  length(InnerList, Len), !, 
  count_inner_lists(Tail, Len, CountTail),
  Count is CountTail + 1.
count_inner_lists([_InnerList|Tail], Len, Count):-
  count_inner_lists(Tail, Len, Count).

Если исходный список пуст, то в нем нет вложенных списков любой длины – программа возвращает ноль.
В противном случае исходный список разделяется на голову (InnerList) и хвост (Tail).
В любом случае должен быть выполнен рекурсивный вызов, в результате которого будет получено количество списков заданной длины для хвоста списка.
Если длина InnerList совпадает с заданной (проверка выполняется стандартной функцией length), то к полученному результату необходимо добавить единицу.
Если вы используете строго типизированный диалект пролога, то такая функция работать не будет если список содержит не только вложенные списки, но и атомы, т.к. для атомов не сработает функция length. Проблему можно решить объявив свою собственную функцию, которая возвращает либо длину списка, либо (если сопоставление аргумента со списком не прошло) – завершающуюся неудачей.