logo search
TurboProlog / Документация / TOM_1

Примеры.

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) выполняет проверку, которая завершается успешно, только

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

объекта.