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

      Комментарии к записи Ответ в теме: Преобразование строки в список символов. Turbo 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 решает эту проблему.