Преобразование строки в список символов. Turbo Prolog

      Комментарии к записи Преобразование строки в список символов. Turbo Prolog отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на строки и файлы Преобразование строки в список символов. Turbo Prolog

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

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

    questioner
    Участник

    Здравствуйте. Нужно написать предикаты для преобразования строки в список символов и наоборот — списка символов в строку.
    Это ведь позволит мне обрабатывать строки на Turbo Prolog и Visual Prolog точно также, как на SWI Prolog?

  • #1932

    domains
      list = char*
    predicates
      string_to_list(string, list)
      list_to_string(list, string)
    clauses
      string_to_list("", []):-!.
      string_to_list(String, [Head|ListTail]):-
        frontchar(String, Head, StringTail),
        string_to_list(StringTail, ListTail).
      
      list_to_string([], ""):-!.
      list_to_string([Head|ListTail], String):-
        list_to_string(ListTail, StringTail),
        frontchar(String, Head, StringTail).
    goal
      string_to_list("test string", List), 
      list_to_string(List, String), 
      write(String).


    При преобразовании строки в список символов:

    • Если исходная строка пуста — функция возвращает пустой список.
    • В противном случае стандартным предикатом front_char исходная строка разделяется на первый символ (Head) и остальные (StringTail).
    • Первый символ добавляется в начало списка-результата, а остальные элементы вычисляются рекурсивной обработкой хвоста строки.

    При преобразовании списка символов в строку:

    • Если исходный список пуст — функция вернет пустую строку.
    • Список разделяется на первый элемент (Head) и хвост (Tail).
    • хвост обрабатывается рекурсивно, формируется StringTail.
    • Из первого символа и хвоста строки формируется результат при помощи стандартного предиката front_char.

    После преобразования строки в список символов можно работать с ней точно также, как это делается на SWI Prolog, однако нет ряда встроенных предикатов — например is_digit, is_alpha (их не сложно реализовать самостоятельно).

    Нередко требуется обрабатывать отдельные слова строки, если вы преобразовали строку в список символов — можно применить к ней предикат string_to_words для построения списка слов. Однако, надо учитывать, что в Turbo Prolog и Visual Prolog эту задачу можно решить при помощи встроенного предиката front_token, который отделяет первое слово строки и работает этот предикат несколько иначе — словом он считает только последовательности букв. Из за этой особенности в Turbo Prolog front_token некорректно обрабатывает тексты на русском языке (все буквы он считает разделителями слов) — самодельный string_to_words решает эту проблему.

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