Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Str_char/2

Этот предикат преобразует строку, содержащую один и только один сим-

вол, в символ или символ в строку из одного символа, имеет формат:

str_char(String,Char) /* (i,o),(o,i),(i,i) */

В случае если вариант потока параметров (i,i), то str_char заверша-

ется успешно, если String связан со строкой из одного символа, который

соответствует Char. Если длина строки не единица, то str_char завершается

неудачно.

Str_int/2

Предикат str_int преобразует строку, содержащую целое число в его

текстовое представление и имеет формат:

str_int (String,Integer) /* (i,o),(o,i),(i,i) */

В случае, если вариант потока параметров - (i,i), str_int завершает-

ся успешно, при условии, что Integer связан с целым эквивалентом числа,

представленного с помощью String.

Str_real/2

Предикат str_real преобразует строку в действительное число, или

действительное число в строку и имеет формат:

str_real(String,Real) /*(i,o),(o,i),(i,i)*/

В случае, если вариант потока параметров - (i,i), str_real заверша-

ется успешно, если Real связан с действительным числом, равным числу,

представленному в String.

Upper_lower/2

Этот предикат преобразует строку, все символы (или часть символов)

которой являются символами верхнего регистра, в строку соответствующих

символов нижнего регистра и наоборот. Он имеет формат:

upper_lower (Upper,Lower) /*(i,o),(o,i),(i,i)*/

Если оба параметра ограничены, upper_lower завершается успешно, если

Upper и Lower связаны со строками, которые являются идентичными; напри-

мер, целевое утверждение:

Str1=samPLEstrING

Str2=sAMpleSTRing

upper_lower(Str1,Str2)

завершается успешно. В ином случае оно завершается неудачно.

Примеры.

1. Этот пример определяет предикат scanner, который преобразует

строку в список лексем. Лексемы классифицируются с помощью связывания

функтора с каждой лексемой. В этом примере используются предикаты isname,

str_int, str_char для определения природы лексемы, полученной с помощью

fronttoken.

/*

Программа CH13EX03

*/

domains

tok = numb(integer); name(string); char(char)

toklist = tok*

predicates

scanner(string, toklist)

maketok(string, tok)

clauses

scanner("", []).

scanner(Str, [Tok|Rest]) :-

fronttoken(Str, Sym, Str1),

maketok(Sym, Tok), scanner(Str1, Rest).

maketok(S, name(S)) :- isname(S).

maketok(S, numb(N)) :- str_int(S, N).

maketok(S, char(C)) :- str_char(S, C).

goal

write("Enter some text:"),nl,

readln(Text),nl,

scanner(Text,T_List),

write(T_List).

2. Преобразования между типами доменов symbol и string, и между

char, integer и real производится автоматически при использовании стан-

дартных предикатов или в процессе оценки математического выражения. Дейс-

твительные числа будут округлятся в процессе автоматического преобразова-

ния. Турбо Пролог производит это автоматическое преобразование по мере

необходимости при вызове предикатов, как в этом примере:

predicates

p(integer)

clauses

p(X) :- write("Это целое значение",X),nl.

Следующие цели дадут одинаковый эффект в этом примере:

X=97.234, p(X).

X=97, p(X).

X='a', p(X).

3. Следующая очень простая программа грамматического разбора англий-

ского языка представляет собой практический пример строкового граммати-

ческого разбора. Этот пример производит непосредственный разбор строки.

Если эта программа будет расширяться, то строка может разделяться на лек-

семы с помощью такого же предиката, как и в программе CH13EX03.PRO. Про-

изводится ли грамматический разбор строк или лексем, алгоритм этой прог-

раммы является хорошим примером для начала.

Если вы заинтересовались грамматическим разбором английского языка,

мы рекомендуем вам прочитать Анализатор предложений и Геобазу (Sentence

Analyzer и Geobase) в приложении к Справочному руководству Турбо Пролога.

Там описываются анализатор предложений и естественно-языковый геограгра-

фический вопросник.

/* Программа CH13EX04 */

domains

sentence = s(noun_phrase,verb_phrase)

noun_phrase = noun(noun) ; noun_phrase(detrm,noun)

noun = string

verb_phrase = verb(verb) ; verb_phrase(verb,noun_phrase)

verb = string

detrm = string

predicates

s_sentence(string,sentence)

s_noun_phrase(string,string,noun_phrase)

s_verb_phrase(string,verb_phrase)

d(string)

n(string)

v(string)

clauses

s_sentence(Str, s(N_Phrase,V_Phrase) ):-

s_noun_phrase(Str, Rest, N_Phrase),

s_verb_phrase(Rest, V_Phrase).

s_noun_phrase(Str, Rest, noun_phrase(Detr,Noun)):-

fronttoken(Str,Detr,Rest1),

d(Detr),

fronttoken(Rest1,Noun,Rest),

n(Noun).

s_noun_phrase(Str,Rest,noun(Noun)):-

fronttoken(STR,Noun,Rest),

n(Noun).

s_verb_phrase(Str, verb_phrase(Verb,N_Phrase)):-

fronttoken(Str,Verb,Rest1),

v(Verb),

s_noun_phrase(Rest1,"",N_Phrase).

s_verb_phrase(Str,verb(Verb)):-

fronttoken(STR,Verb,""),

v(Verb).

/* determiner */

d("the").

d("a").

/* nouns */

n("bill").

n("dog").

n("cat").

/* verbs */

v("is").

Загрузите эту программу, нажмите Alt-R для ее запуска и введите сле-

дующую цель:

Goal: s_sentence("bill is a cat", Results).

Программа вернет:

Result = s(noun("bill"),verb_phrase("is",

noun_phrase("a","cat")))

Обзор

Основные моменты описанные в этой главе:

1. Стандартные предикаты обработки строк делятся на две группы:

базовое управление строками и преобразование строковых типов.

2. Предикаты, предназначенные для базового управления строками:

a. frontchar, fronttoken и concat (для деления строки на

компоненты, для построения строк из указанных компонент и

для проверки состоит ли строка из указанных компонент;

компоненты могут быть символами, лексемами или строками)

b. str_len (для проверки или получения длины строки или

создания пустой строки заданной длины)

c. frontstr (для разделения строки на две различные стро-

ки)

d. isname (для проверки, что строка является правильным

именем Турбо Пролога)

e. format (для упаковки переменного числа аргументов в

строковую переменную)

За исключением frontstr, isname и format, каждый предикат,

предназначенный для основных действий со строками, имеет

несколько вариантов потока параметров. Варианты только с

входными параметрами выполняют проверку, которая будет ус-

пешна, если строка, о которой идет речь, состоит из опре-

деленных компонент (или имеет определенную длину).

3. Предикаты, предназначенные для преобразования типа:

а. char_int (для преобразования символа в целое число, или

наоборот)

b. str_char (для преобразования отдельных символов в стро-

ку из одного символа (или набор)

с. str_ins (для преобразования целого в его текстовое

представление или наоборот)

d. str_real (для преобразования действительного числа в

строку и наоборот)

е. upper_lower (для преобразования строки во все символы

верхнего или все символы нижнего регистра).

Каждый предикат преобразования типов имеет три варианта потока пара-

метров; варианты (i,o) и (o,i) выполняют соответствующие преобразования,

а вариант (i,i) выполняет проверку, которая завершается успешно, только

если два аргумента являются различными представителями одного и того же

объекта.

Соседние файлы в папке Документация