Преобразования, определяемые пользователем




Работа со списками

Длина строки

Длина строки измеряется полным числом символов в строке. Турбо-Пролог имеет встроенный предикат 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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: