- •Лабораторная работа № 4 Работа со списками
- •3.1 Длина строки
- •3.2 Конкатенация строк
- •3.3. Создание подстрок
- •3.4. Преобразование данных
- •3.5. Преобразования, определяемые пользователем
- •3.6 Создание символьных префиксов
- •3.7. Преобразование строк
- •3.8. Формирование атомов из строк
- •Лабораторная работа № 5 Работа с файлами
- •4.1.Предикаты для работы с файлами
- •Описание файлового домена
- •Запись в файл
- •Чтение из файла
- •Модификация существующего файла
- •Дозапись в конец уже существующего файла
- •Лабораторная работа № 6 Структуры
- •Абстракция данных
3.8. Формирование атомов из строк
Атом (token) — это последовательность символов, которая является особым видом строки Турбо-Пролога. Атом может быть числом. Если число имеет предшествующий знак (+ или -), то этот знак также рассматривается как отдельный атом. Атом может быть любым символом, кроме пробела. Переменные используются для передачи параметров. Переменные являются атомами, но не все атомы есть переменные.
В Турбо-Прологе предусмотрен встроенный предикат, обеспечивающий формирование атома из строки. Это предикат fronttoken. Его синтаксис следующий:
fronttoken(String, Token, Rest_of_string).
Либо String должна быть означена, либо оба Token и Rest_of_string должны быть означены.
Если первый символ строки есть символ из групп с 1 по 4 в табл. 2, то этот символ присваивается переменной Token, а оставшиеся символы присваиваются Rest_of_string. Либо если строка имеет значение, то Token получает это значение, a Rest_of_string получает значение пустой строки ("").
Ниже приводится несколько примеров отношения, определяемого этим предикатом:
Предикат fronttoken(Str,"Default","Directory") присваивает Str значение "Default directory".
Предикат fronttoken(Str,"$default","$directory") присваивает Str значение "$default$directory".
Предикат fronttoken("Pointer",Token,Rest) присваивает Token значение "Pointer", а переменной Rest присваивает значение ""(пустая строка).
Предикат fronttoken("$Command",Token,Trail) присваивает Token значение "$", а переменной Trail значение "Command".
Предикат fronttoken("$$command",Token,Trail) присваивает Token значение "$", а переменной Trail значение "$command".
Предикат fronttoken("!default",Token,Rest) присваивает переменной Token значение "!", а переменной Rest значение "default".
Предикат fronttoken("$RUN ALBAS",Token.Rest) присваивает переменной Token значение "$", а переменной Rest значение "RUN AI.BUS".
Программа Token 1 (рис. 22) иллюстрирует приведенные примеры.
Предикат fronttoken может быть использован в правиле преобразования строки в список атомов. Это правило аналогично правилу, которое использовалось для преобразования строки в список символов:
convers(Str, [Head|Tail]) :-
fronttoken(Str,Head,Strl),!,
convers(Strl,Tail).
convers(_ , []).
/* Программа: Tokenl */
/* Назначение: Демонстрация использования встроенного */
/* предиката */
/* fronttoken (строка, атом,остаток_строки) */
predicates
print_al1
goal
print_all.
clauses
print_all :-
fronttoken(Strl, "Default","Directory"),
nl,write(" Strl = ",Strl),
fronttoken(Str2, "$defau1t","Sdirectory"),
nl,write(" Str2 = ",Str2),
fronttoken("Pointer",Tokenl,Restl),
nl,write(" Tokenl = ",Tokenl),
nl,write(" Restl = ",Restl),
fronttoken("$Command", Token2,Trai11),
nl,write(" Token2 = ",Token2),
nl,write(" Traill = ",Traill),
fronttoken("$$command", Token3,Trai13), nl,
write(" Token3 = ",Token3),
nl,write(" ТrаilЗ = ",Trail3),
fronttoken(Str3, "!default","$default"),
nl,write(" Str3 = ",Str3),
fronttoken("$RUN AI.BAS",Token4,Rest2),
nl,write(" Token4 = ",Token4),
nl,write(" Rest2 = ",Rest2).
/***** конец программы *****/
Рис. 22. Программа Token1
Рис. 23. Результат работы программы Token1
Вариант предиката convers (_,[]) будет успешен, если список будет пустым, и это условие определяет точку, с которой должно быть начато преобразование. Например, строка "one two three" должна быть преобразована в список атомов:
[one, two, three] .
Программа Token2 (рис. 109) демонстрирует преобразование строк в список атомов. Результат программы показан на рис. 110. Заметьте, что строка "STARS AND STRIPES" преобразуется в список символов:
["STARS", "AND", "STRIPES"].
Пробелы устранены.
/* Программа: Token2 */
/* Назначение: Демонстрация преобразования строки в */
/* список строк при помощи предиката */
/*' fronttoken (строка,атом,остаток, строки) */
domains
str_list = symbol *
str = string
predicates
convers(str,str_list)
clauses
convers(Str,[Head|Tai1]) :-
fronttoken(Str,Head,Strl),!,
convers(Srtl,Таi1).
convers(_,[]).
Рис. 24. Программа Token2
Рис. 25. Диалог с программой Token2
Программа Token3 (рис. 26) является вариантом Token2. Эта программа использует внутреннюю цель, которая является правилом do_convert_and_print. Эта цель состоит из двух подцелей. Подцель convers преобразует строку "STARS AND STRIPES FOREVER" в список атомов, а подцель print_list печатает получившийся список. Результат работы программы показан на рис.27.
/* Программа: Token3 */
/* Назначение: Демонстрация преобразования строки в */
/* список строк при помощи предиката */
/* fronttoken (строка,атом,остаток_строки)*/
domains
str_1ist = symbol *
str = string
predicates
convers(str,str_1ist)
print_list(str_list)
do_convert_and_print
goal
do_convert_and_print.
clauses
convers(Str,[Head|Tail]) :-
fronttoken(Str,Head,Strl),!,
convers(Strl,Tail).
convers(_,[]).
print_1ist([]).
print_list([Head|Tail]) :-
write(" ",Head),nl,
print_list(Tail).
do_convert_and_print :-
nl,nl,
write("STARS AND STRIPES FOREVER"),
nl,nl,
convers("STARS AND STRIPES FOREVER",List),
print_list(L1st).
nl,nl,
write(" All done !"),nl.
Рис. 26. Программа Token3
Рис. 27. Результат работы программы Token3
Задание. Разработать программу для работы со строковыми переменными, согласно варианта (таблица 4).
Таблица 4
Вариант |
Задание |
1 |
Разработать процедуру для преобразования строки символов список с использованием предиката frontchar |
2 |
Разработать процедуру для преобразования строки символов список с использованием предиката fronttoken |
3 |
Разработать процедуру разбиения строки пополам |
4 |
Разработать процедуру разбиения строки на 3 части |
5 |
Разработать процедуру разбиения строки на 4 части |
6 |
Разработать процедуру циклического ввода символа и его прибавления к началу строки |
7 |
Создать процедуру для ввода строки и ее разделения пополам, если эта строка специальная |
8 |
Разработать процедуру для преобразования строки чисел список с использованием предиката frontchar |
9 |
Разработать процедуру для преобразования строки чисел список с использованием предиката fronttoken |
10 |
Разработать структуру для преобразования строки в целочисленный тип, возведения в квадрат и перевода в вещественный тип |
11 |
Разработать процедуру циклического ввода строки символа и его прибавления к началу строки |
12 |
Разработать процедуру циклического ввода атома и его прибавления к началу строки |
13 |
Разработать процедуру разбиения строки на 4 части |
14 |
Разработать структуру для преобразования строки в вещественный тип, возведения в квадрат и перевода в тип целочисленный |
15 |
Разработать процедуру циклического ввода строки символов и ее прибавления к началу строки |
