- •Лабораторная работа № 4 Работа со списками
- •3.1 Длина строки
- •3.2 Конкатенация строк
- •3.3. Создание подстрок
- •3.4. Преобразование данных
- •3.5. Преобразования, определяемые пользователем
- •3.6 Создание символьных префиксов
- •3.7. Преобразование строк
- •3.8. Формирование атомов из строк
- •Лабораторная работа № 5 Работа с файлами
- •4.1.Предикаты для работы с файлами
- •Описание файлового домена
- •Запись в файл
- •Чтение из файла
- •Модификация существующего файла
- •Дозапись в конец уже существующего файла
- •Лабораторная работа № 6 Структуры
- •Абстракция данных
3.3. Создание подстрок
Подстрока — это строка, являющаяся копией некоторой части исходной строки. Например, двумя возможными подстроками строки "Expert Systems" являются "Expert" и "Systems". Турбо-Пролог имеет встроенный предикат frontstr, служащий для создания подстрок. Его синтаксис следующий:
frontsrt(Number, Source_string, Substringl, Substring2).
Аргумент Number задает полное число символов, которые должны быть скопированы в Substringl из Source_String, являющейся исходной строкой. Остальные символы строки Source_string будут скопированы в Substring2. Например, утверждение
frontstr(6,"Expert systems". Stringl, String2)
присваивает Stringl значение "Expert", a String2 значение" systems". Заметьте, что число 6 соответствует полному числу символов в "Expert".
Программа Substring демонстрирует использование предиката frontstr. Программа находит две подстроки для каждой входной строки. Например, первая входная строка есть "Turbo Prolog is fast!", а предикат frontstr, применяемый для ее обработки, имеет вид
frontstr(12, "Turbo Prolog 1s fast!". Rl, R2).
Правило print_strings выводит на печать две подстроки на разные строчки экрана. Результат показан на рис. 10.
/* Программа: Substring */
/* Назначение: Демонстрация использования предиката */
/* front_str(целое,строка1,строка2,строкаЗ) */
predicates
print_strings
goal
print_strings.
clauses
print_strings :-
nl,nl,nl,
frontstr(12,
"Turbo Prolog is fast!",
R1,R2),
write(Rl),nl, write(R2),nl,nl,
frontstr(10,
"Every body loves somebody",
S1,S2),
write(Sl),nl,
write(S2),nl,nl,
frontstr(10,
"Artificial Intelligence",
T1.T2),
write(Tl),nl,
write(T2),nl,nl,
frontstr(17,
"A thing of beauty Is a joy.",
U1,U2),
write(Ul),nl,
write(U2).
Рис. 10. Программа Substring
Рис. 11. Результат работы программы Substring
3.4. Преобразование данных
Турбо-Пролог для преобразования данных из одного типа в другой имеет следующие предикаты:
upper_lower
str_char
str int
str_real
char_int.
Их применение целесообразно в случае, когда тип объектов встроенного предиката отличается от типа объектов предиката, определенного пользователем.
Например, предикат writef может вызвать разрушение системы, если ему будет передан объект типа char. Если символьная переменная Drive_ltr_str означена символом 'а', то предикат
writef("The current drive is %:", Drive_ltr_str)
вызовет отказ системы. (Во время компиляции сообщения об ошибках и предупреждения не выдаются.) Данная проблема легко может быть преодолена с помощью предикатов, указанных выше.
Например:
str_char(Drive_ltr_srt, Drive_ltr),
writef("The current drive is %:", Drive_letter).
Преобразования столь же необходимы, когда значение одного типа должно быть присвоено переменной другого типа.
Все предикаты преобразования данных содержат два объекта. Заметим, что имена предикатов показывают тип выполняемого преобразования. Например, str_char преобразует строку, состоящую из одного символа и имеющую тип string, в значение типа char. Имена предикатов также указывают и порядок объектов. Например, объект типа string является первым объектом в str_char, а объект типа char - вторым.
Эти предикаты имеют два направления преобразования данных. Например, если переменная S1 уже означена и имеет значение STARS AND STRIPES, то предикат
upper_lower(Sl,S2)
присваивает строку stars and stripes переменной S2. Но, если S2 означена, а S1 не означена, то значение STARS AND STRIPES получает переменная S1. В случае же когда обе переменные означены, предикат успешен, если одна из переменных имеет значение строки, содержащейся в другой переменной, но записанной строчными буквами.
Предикат str_char используется для преобразования объектов типа string в объекты типа char. Предикат str_int используется для преобразования строчного представления целых чисел в переменные типа integer. Предикат str_real используется для преобразования действительных чисел в строки. Предикат char_int используется для присваивания числа (кода ASCII символа) данному объекту.
Программа Conversions 1 (рис. 97) содержит примеры преобразования данных с использованием встроенных предикатов Турбо-Пролога. Результат работы программы показан на рис.12.
/ *Программа: Converslonsl */
/* Назначение: Демонстрация преобразования типов данных */
predicates
do_conversions
goal
do_conversions.
clauses
do_conversions :-
upper_lower("STARS AND STRIPES".SI),
write("STARS AND STRIPES"),nl,
write(Sl),nl,nl,
upper_lower(S2,"one day at a time"),
write("one day at a time"),nl,
write(S2),nl,nl,
write("T"),nl.
str_cnar("T",Cl),
write(Cl),nl,nl,
write("U"),nl.
char int('U',Nl),
write(Nl),nl.
Рис. 12. Программа Conversions 1
Рис. 13. Результат работы программы Conversionsl
