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

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

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

    questioner
    Участник

    Нужна реализация аналога предиката count (выполняющего подсчет вхождений значений в список) для работы со строками в Turbo Prolog. Можно использовать только встроенный предикат frontchar.

  • #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 для пустой исходной строки. Т.е. это зеленое отсечение.
    Во втором правиле отсечение стоит для изменения порядка выполнения операторов, его удаление сделает программу некорректной (красное отсечение), т.к. программа будет находить множества решений переходя на третье правило как в случае если встретился искомый, так и любой другой символ.

  • #2682

    Nika
    Участник

    Спасибо большое!

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