- •Лабораторная работа № 4 Работа со списками
- •3.1 Длина строки
- •3.2 Конкатенация строк
- •3.3. Создание подстрок
- •3.4. Преобразование данных
- •3.5. Преобразования, определяемые пользователем
- •3.6 Создание символьных префиксов
- •3.7. Преобразование строк
- •3.8. Формирование атомов из строк
- •Лабораторная работа № 5 Работа с файлами
- •4.1.Предикаты для работы с файлами
- •Описание файлового домена
- •Запись в файл
- •Чтение из файла
- •Модификация существующего файла
- •Дозапись в конец уже существующего файла
- •Лабораторная работа № 6 Структуры
- •Абстракция данных
Лабораторная работа № 4 Работа со списками
3.1 Длина строки
Длина строки измеряется полным числом символов в строке. Турбо-Пролог имеет встроенный предикат str_len, который используется для нахождения длины строки. Синтаксис этого предиката следующий:
str_len(String_value, String_1ength).
Если переменная L не означена до начала обработки правила
str len("TODAY",L).
то она получит значение длины строки TODAY (сегодня). Этим значением будет целое число. Если же до начала выполнения вызова предиката str_len обе его переменные уже означены, то предикат будет успешным только при условии, что значение String_length равно длине строки String_value. Например, если S имеет значение ABC, a L имеет значение 3, то предикат str_len(S,L) успешен. В противном случае он неуспешен.
Программа ShowLengthl (рис. 3) иллюстрирует использование внутренней цели для нахождения длины строки "Turbo Prolog". Результат показан на рис.89.
/ * Программа: ShowLengthl */
/* Назначение: Демонстрация использования предиката */
/* str_len(строка, длина_строки) */
predicates
find_str1ng_length goal
find_str1ng_length. clauses
find_str1ng_length :-
str_len("Turbo Prolog", Length),
nl.nl,
write(" Turbo Prolog"),
nl.nl,
write(" Length = ", Length).
Рис. 3. Программа ShowLengthl
Программа ShowLength2 (рис. 5) демонстрирует простое применение предиката str_len. Программа выводит длину объектов утверждений базы данных. Правилом для нахождения длин строк является find_length. Это правило содержит: lin(S); строку данных str_len(S,L), где S — имя строковой переменной, a L — длина этой строки; и предикат write для выдачи длин строк.
Результат работы программы показан на рис. 4. Числа в скобках -это длины строк. Заметьте, что две "пустые" строки на самом деле не пустые - каждая из них содержит 27 символов пробела.
Рис.4 . Диалог с программой Showlengthl
/* Программа: ShowLength2 */
/*Назначение: Демонстрация использования предиката */
/* str_len(cтpoкa, длина_строки) */
/* Указание: Запустите программу. Цель включена в программу */
predicates
lin(string) find_length
goal
find length.
clauses
1in(" Открытие ").
1in(" Это было путешествие, ").
1in("- путешествие в ночь,").
1in("- путешествие в день,").
1in("- путешествие в мечту.").
1in(" Когда я достиг этой земли,").
1in("я нашел себя").
1in(" ").
1in(" Khinzu ").
fing_1ength :-
lin(S),
str_len(S,L),
write(S, " (",L,")"),nl,
fall.
Рис. 5. Программа ShowLength2
3.2 Конкатенация строк
Конкатенация двух строк означает их объединение, то есть образование одной новой строки. Например, результат конкатенации двух строк
"one day", "at a time"
Рис. 6. Результат работы программы ShowLenglh2
может быть либо "one day at a time", либо "at a time one day". Эти две результирующие строки различны, так как образующие их строки были объединены в различном порядке. Турбо-Пролог имеет встроенный предикат concat, который выполняет соединение (конкатенацию) двух строк. Его синтаксис следующий:
concat(Input_stringl, Input_string2, Output_String).
Объекты Input_stringl и Input_string2 являются двумя входными строками. Объект Output_string есть объединенная выходная строка. Например,
concat("TOOAY", "TOMORROW". S).
означивает переменную S строкой "TODAYTOMORROW".
Программа Concatl (рис. 7) демонстрирует применение конкатенации строк. Эта программа использует внутреннюю цель. Правило print_strings соединяет строки и выводит на печать результат конкатенации. Результат работы программы показан на рис. 93.
Программа Concat2 (рис.9) является модификацией программы Concatl. В этой программе как входные, так и выходные строки представлены переменными с односимвольными именами: R, S, Т, U, V, W, X, Y, Z, А, В, С. Эти переменные используются как аргументы предиката concat. Данная форма использования предиката конкатенации короче и удобнее в случае повторяющихся операций конкатенации. Результаты работы программ Concatl и Concat2 идентичны.
/* Программа: Concatl */
/* Назначение: Демонстрация использования предиката */
/* concat(cтpoкal,строка2,строкаЗ) */
predicates
print_strings
goal
print_strings.
clauses
print_strings :-
concat("Turbo Prolog","is fast!",R),
nl,nl,write(R),
concat("Every body loves ",
"somebody sometime.",S),
n1,nl,write(S),
concat("Artificial',
"Intelligence.",T),
nl,nl,write(T),
concat("A thing of beauty ",
"is a joy forever.",U),
concat("Turbo Prolog","is fast!",R),
nl.nl,write(R),
nl,nl,write(U),nl,nl.
Рис. 7. Программа Concatl
Рис. 8. Результат работы программы Concatl
/* Программа: Concat2 */
/* Назначение: Демонстрация использования предиката */
/* concat(cтpoкal,строка2,строкаЗ) */
predicates
print_str1ngs
goal
print_strings.
clauses
print_strings :-
nl,nl,
0 = "Turbo Prolog".
P = " Is fast !".
concat(O,P,Q),
write(Q),nl,nl,
R = "Every body loves ",
S = "somebody sometime.",
concat(R,S,T),
write(T),nl,nl,
U = "Artificial",
V = "Intelligence",
concat(U,V,W),
write(W),nl,nl,
X = "A thing of beauty ",
Y = "Is a Joy forever.",
concat(X,Y,Z),
write(Z),nl,nl.
Рис. 9. Программа Concat2
