Ответ в теме: Число вхождений символа на Turbo Prolog

      Комментарии к записи Ответ в теме: Число вхождений символа на Turbo Prolog отключены
#2674

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

count("", _, 0):-!.
count(String, Char, Count):-
  frontchar(String, Char, TailString), !,
  count(TailString, Char, TailCount),
  Count = TailCount + 1.
count(String, Char, Count):-
  frontchar(String, _, TailString),
  count(TailString, Char, Count).

В первом правиле применяется оператор отсечения (cut) для оптимизации, т.к. при его отсутствии программа могла бы пытаться найти второе решение в задаче выполнив дважды (в двух следующих правилах) frontchar для пустой исходной строки. Т.е. это зеленое отсечение.
Во втором правиле отсечение стоит для изменения порядка выполнения операторов, его удаление сделает программу некорректной (красное отсечение), т.к. программа будет находить множества решений переходя на третье правило как в случае если встретился искомый, так и любой другой символ.