Разделение строки на части (Turbo Prolog)

Помечено: , ,

  • В этой теме 0 ответов, 1 участник, последнее обновление 3 месяца назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #6606
      @admin
      StudLance.ru

      В соседней статье можно найти функцию разделения списка на части. Это очень удобная функция, которую можно использовать и для строк — в SWI Prolog и некоторых других диалектах, где строка задается как список символов.

      Однако, в Visual Prolog и Turbo Prolog это не сработает. Можно предварительно разделить строку на список символов, однако, это сильно усложнит исходный код и замедлит его.

      Напишем функцию divide_string, которая принимает строку и список подстрок, на которые нужно выполнить разделение. Разделение можно выполнить по такому алгоритму:
      — если список шаблонов состоит из одного элемента — то сопоставляем строку с этим шаблоном.
      — иначе — из начала строки пробуем выделить подстроку по первому шаблону, а остальную часть строки и остальные шаблоны — обрабатываем рекурсивно.

      Выделение подстроки из начала строки можно реализовать посимвольно, с использованием встроенной функции frontchar, отделяющей от строки символ.

      Исходный код:

      domains
        strings = string*
      predicates
        nondeterm divide_string(string, strings)
        nondeterm substr(string, string, string)
      clauses
        substr(String, "", String). % String = "" + Stirng
        substr(String, Part, Tail):-
          frontchar(String, Head, TailString), % String =  Head + TailString
          substr(TailString, TailPart, Tail),
          frontchar(Part, Head, TailPart). % Part = Head  + TailPart
      
        divide_string(Part, [Part]):-!.
        divide_string(String, [First_Part|Tail]):-
          substr(String, First_Part, StringPart),
          divide_string(StringPart, Tail).
      goal 
          divide_string("hello world", [S, "ll", W]).
          %substr("hello", H, T).

      StudLance.ru

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