Работа с символами и строками

Над строками обычно выполняются следующие операции:
1) объединение двух строк в новую строку (+) – конкатенация,
2) расщепление строки для создания двух новых строк, каждая из которых содержит некоторые из исходных символов,
3) поиск символа или подстроки внутри данной строки.
В компьютере символы могут быть  представлены двумя способами.
1. Кодами в виде одиночного символа ‘\N’, где N – число-код соответствующего символа в 10-ричном или 16-ричном представлениях:
S=”\65”
S=”\41”
2. Как строка символов “\N\M\O\”:
S=”abc”- строка
S=”\65\66\67”
S=”\16”
Коды могут быть использованы для получения на экране псевдографических символов/
Строки могут быть присвоены переменным и выведены на печать:
Printstring: – S1=«это пример», S2=«печать».
write(S1), write(S2), nl – печать строки
Пример в виде программы.

domains
S1, S2=string
predicates
datastring(S1, S2)
printstring
Goal
printstring
clauses
datastring(S1, S2):-
S1=”это пример”,
S2=”печать”.
printstring:-
datastring(S1, S2),
write(S1), nl, write(S2).

Фиксированные строковые константы S1, S2 объявляются в разделе доменов. Можно размещать строки в одном правиле, а вызывать и обрабатывать их в других правилах. Правило datastring содержит строки. Для того чтобы передать строки из него в правило printstring первое должно быть включено во второе с явным указанием символов s1, s2 в списке объектов вызываемого правила. Необходимость такого включения определяется отсутствием понятия локальной переменной в Прологе для удержания промежуточных результатов и их применения в процессе вычисления.
Областью определения переменных является правило. В другом правиле эти переменные не видны и недопустимы. Поэтому мы соединяем в одно правило. Для работы со строковыми объектами в Турбо Прологе введены предписанные предикаты.

Strlen (“abba”, X)
X – неизвестная, результат работы Х=4
Х=3, strlen(“abba”, X), результат неуспех, ложь

Конкатенация (сложение строк).

Встроенный предикат concat (X, Y, Z) – объединяет (помещает) X, Y в Z, входные и выходные строки могут быть представлены переменными.
Х = “паро”
Y = “ход”
Тогда Z=”пароход”

Получение подстрок

Подстрокой называется строка, являющаяся копией некоторой части исходной строки.
Встроенный предикат Frontstr(N, исходная строка, строка1, строка2) копирует N первых символов из исходной строки в строку 1, остальные символы в строку 2.

Преобразование данных к разным типам.

Для преобразования имеются следующие предикаты:

Эти операторы применяют, когда тип объектов встроенного предиката  отличается от типа объектов предиката, определенного пользователем.
Пример. writef  – печать форматная.
writef («текущее устройство есть %», drive_str). Этот оператор вызовет отказ системы, если символьная переменная drive_str будет означена символом «а». Чтобы система не выдала ошибки, нужно писать: str_char (drive_str, drive), writef(«текущее устройство есть %», drive).
При присвоении значений одного типа переменной другого типа тоже используется преобразование, причем предикаты имеют два направления преобразования в зависимости от означенности переменных.
Например, при преобразовании upper_lower(S1, S2)  при S1= ”STAR” переменной  S2 присваивается значение “star” только в том случае, если она  на данный момент не означена (не имеет значение).
Если S2 = ”star”, а S1 не означена, то  совершается  переход в прописные (большие) буквы.
Пользователь может сам разработать предикаты преобразований:
Real_int, int_ real – удобны для математических расчетов R – real, N – int,
conv_ real _ int (R,N): – R=N,
conv_ int_ real (R,N): – N = R – обратное преобразование,
conv _strsymbol(S, Sb): – S = Sb, где S – строка, Sb – символ.
Это преобразование удобно для обработки данных и записи в памяти.

Создание символьных предикатов означает присоединение символа к началу строки. Для совершения этой операции введен предикат

frontchar (строка, символ, остаток строки).
Объекту строка присваивается значение конкатенации символа и остатка строки.
Пример: frontchar (“spring”, C, “pring”) – результат: С=’s’.

Преобразование строки в список символов, т.е. из строки можно получить список. Для преобразования строки используется frontchar. Метод преобразования заключается в циклическом использовании frontchar для вырезания первого символа и размещении его в список. Правило преобразования записывается в виде:

convert (“”, [  ]) – граничное условие,
convert (str, [H|T]): – frontchar(str,H, str1),
convert(str1, T).
Пример программы.
domains
char_lis=char*
str=string
predicates
convert(str,char_list)
print_list(char_list)
do_convert_and_print
goal
do_convert_and_print.
clauses
convert(“”, [  ]).
convert(Str, [H|T]): – frontchar(Str, H, Str1),convert(Str1, T).
print_list([]).
print_list([H|T]):– write(H, ” “),print_list(T).
do_convert_and_list:- nl, nl, write(“STARS AND”), nl, nl, convert(“Stars AM”, List),
print_list(List), nl, nl, write(“All done”), nl.