Строки в Visual Prolog. Подсчет суммы мест

      Комментарии к записи Строки в Visual Prolog. Подсчет суммы мест отключены

Помечено: , ,

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

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

    Nika
    Участник

    Имеется задача:

    подсчитать суммы мест, на которых в заданном слове стоит буква «б».

    Вот её решение:

    predicates
      nondeterm sum_position_index(string,char,integer,integer)
      nondeterm sum_position(string,char,integer)
     
    clauses
      sum_position_index("", _, _, 0).
      sum_position_index(String, Symbol, Pos, Sum):- 
        frontchar(String, Symbol, TailString), 
        TailPos = Pos + 1, 
        sum_position_index(TailString, Symbol, TailPos, TailSum), 
        Sum = TailSum + Pos. 
      sum_position_index(String, Symbol, Pos, Sum):- 
        frontchar(String, HeadSymbol, TailString), 
        HeadSymbol <> Symbol, 
        TailPos = Pos + 1, 
        sum_position_index(TailString, Symbol, TailPos, Sum).
     
      sum_position(String, Symbol, Sum):- 
        sum_position_index(String, Symbol, 1, Sum).
    
    goal 
      task ("аb", 'b', K).

    Работает правильно, но можете ли вы помочь с объяснением данной задачи? В университете теоретической части не достаточно для решения/понимания подобных задач.

  • #2840

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

    Функция sum_position_index состоит из трех правил:

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

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