Работа со списками
Длина строки
Длина строки измеряется полным числом символов в строке. Турбо-Пролог имеет встроенный предикат str _ len, который используется для нахождения длины строки. Синтаксис этого предиката следующий:
str _ len(String_value, String_1ength).
Если переменная L не означена до начала обработки правила
strlen("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
findlength.
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
Конкатенация строк
Конкатенация двух строк означает их объединение, то есть образование одной новой строки. Например, результат конкатенации двух строк
"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
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
Преобразование данных
Турбо-Пролог для преобразования данных из одного типа в другой имеет следующие предикаты:
upper _ lower
str _ char
strint
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.
charint('U',Nl),
write(Nl),nl.
Рис. 12. Программа Conversions 1
Рис. 13. Результат работы программы Conversionsl
Преобразования, определяемые пользователем
Преобразования действительных чисел в целые или целых в действительные весьма удобны при выполнении математических вычислений. Преобразования строк в символы удобны при подготовке обработки данных и их записи во внешнюю память. В этом разделе будет показано, как строить правила для выполнения этих преобразований.
Рассмотрим преобразование действительного числа в целое. В этом примере целое значение, соответствующее действительному числу 5432.765, есть 5432. Правило преобразования построено при помощи символа равенства (=):
conv _ real_int(R,N):- R = N.
где R — это переменная для действительных чисел, а N — переменная для целых чисел.
Объявление в разделе predicates следующее:
conv _ rea1 _ int (rea1, integer).
Правило пытается вычислить значение R. Если текущее значение R -действительное число, то правило успешно; в противном случае правило завершается неуспешно. При успешном завершении правила целая часть действительного числа присваивается целочисленной переменной N. В Турбо-Прологе целые числа ограничены диапазоном от -32 768 до 32 767, поэтому рассматриваемое правило преобразования не будет работать, если значение действительного числа меньше чем -32 768.0 или больше чем 32 767.0.
Правило для преобразования целого числа в действительное следующее:
conv _ int _ rea1(N,R):- N=R.
где N — это целочисленная переменная, a R — переменная для действительных чисел. Если N имеет значение 1234, то R получит значение 1234 (десятичная точка подразумевается, но не пишется).
Правило пытается вычислить значение N. Если текущее значение N есть целое число, то правило успешно; в противном случае оно неуспешно. При успешном завершении правило выбирает целое число и присваивает его переменной R. И в этом случае правило преобразования работает только при условии, что целое число находится внутри допустимого диапазона.
Преобразование строки в символ также может быть выполнено при помощи простого правила:
conv _ str _ symb(S,Sb):- S=Sb.
Например, если S="Turbo PROLOG", то Sb=Turbo PROLOG. Объект S объявлен как объект типа string, a Sb объявлен как объект типа symbol.
Программа Conversion2 (рис. 14) использует все рассмотренные правила. Результат ее работы показан на рис. 15.
/* Программа: Conversions2 */
/* Назначение: Демонстрация преобразования: */
/* (1) действительного числа в целое */
/* (2) целого числа в действительное */
/* (3) строки в символ */
predicates
convrea1 _ int(rеа1,integer)
conv _ int _ rea1 (integer, rea1)
conv _ str _ symb(string,symbol)
goal
XI = 5432.765,
conv _ rea1 _ int(XI,N1),nl,nl,
N2 = 1234,
conv _ int _ real(N2,X2),nl,nl,
S = "TURBO PROLOG",
conv _ str _ symb(S,Sb),n1.
clauses
conv _ realint(R,N):-
R = N
write("Input real - ".R),nl,
write("0utput Integer - ", N).
conv _ int _ real(N,R):-
N = R,
write("Input Integer - ",N),nl.
write("0utput real -,"R).
convstr _ symb(S,Sb):-
S = Sb,
write("Input string -",S),nl,
write("0utput symbol - ",Sb).
![]() |
Рис. 14. Программа Conversion2
Рис. 15. Результат работы программы Conversions2