Ответ в теме: Определите, сколько раз заданный элемент входит в список

      Комментарии к записи Ответ в теме: Определите, сколько раз заданный элемент входит в список отключены
#1946

Решить задачу можно при помощи стандартного предиката findall:

count(List, Element, Count):-
  findall(Element, member(Element, List), Counters),
  length(Counters, Count).

Функция findall вторым аргументом принимает цель, которую пытается выполнить и найти все решения. Каждый раз, когда находится решение цели, значение, указанное в первом аргументе findall помещается в список, заданный третьим аргументом.
В приведенном примере каждый раз, когда выполнится цель member(Element, List), значение элемента будет добавлено в список. Поэтому результирующий список Counters будет содержать число вхождений. Определить количество элементов списка можно предикатом length, который точно также, как member, является стандартным.

Задачу можно решить и без использования findall:

count([], _Element, 0):-!.
count([Element|Tail], Element, Count):-
  !, count(Tail, Element, CountTail), 
  Count is CountTail + 1.
count([_Element|Tail], Element, Count):-
  count(Tail, Element, Count).

Задача решается рекурсивно. Исходный список разделяется на первый элемент и список остальных элементов (Tail).
Количество вхождений элемента в список зависит от значения первого элемента (если оно равно искомому значению – нужно прибавить единицу к результату) и количества вхождений элемента в Tail.