Чтение онлайн

ЖАНРЫ

Программирование на языке пролог
Шрифт:

существительное(мнч,существительное(КореньN))--›

[N], {(name(М,Мнимя), присоединить(Едимя,"s",Мнимя), name(КореньN,Едимя), является_существительным(КореньN,едч))}.

Конечно, представленное здесь общее правило о форме множественного числа существительных справедливо не во всех случаях (например, множественное число для «fly» не совпадает с «flys»), И по-прежнему необходимо исчерпывающим образом описывать все исключения. Обратите внимание на использование двойных кавычек для представления списка, содержащего литеру 's'.Теперь необходимо определять утверждения для предиката является_существительнымлишь для существительных в единственном числе, если форма множественного числа для них образуется по указанному выше правилу.

Заметьте, что в соответствии с приведенным определением в дерево разбора вставляется существительное в форме единственного, а не множественного числа. Это может оказаться полезным при последующей обработке дерева разбора. Обратите также внимание на то, как использованы фигурные скобки. В различных реализациях Пролога некоторые детали синтаксиса могут немного отличаться, но наиболее безопасно заключать содержимое фигурных скобок в дополнительные круглые скобки, если оно состоит более чем из одного целевого утверждения, и оставлять пропуск между фигурной скобкой и точкой, завершающей правило.

Большинство трансляторов синтаксических правил, помимо целевых утверждений, заключенных в фигурные скобки, оставляют неизменными и некоторые другие целевые утверждения. Так, обычно нет необходимости заключать в фигурные скобки '!' или дизъюнкции (;) целевых утверждений.

9.6. Заключение

В этом разделе мы подведем итог тем сведениям, которые мы получили о синтаксисе грамматических правил. Затем будут указаны некоторые из возможных расширений и показаны некоторые интересные способы использования грамматических правил. Лучший способ описать синтаксис грамматических правил – сделать это с помощью самих же грамматических правил. Таким образом, здесь приводится некоторое неформальное описание синтаксиса. Отметим, что оно не является абсолютно строгим, так как в нем не учитывается влияние приоритета операторов на синтаксис.

грамматическое правило--› заголовок, ['--›'], тело.

заголовок--› нетерминальный_символ.

заголовок--› нетерминальный_символ, [','], терминальный_символ

тело--› тело, [','], тело.

тело--› тело, [';'], тело.

тело--› элемент_тела.

элемент_тела--› ['!'].

элемент_тела--› ['{'], целевые_утверждения_пролога, ['}'].

элемент_тела--› нетерминальный_символ.

элемент_тела--› терминальный_символ.

Ряд элементов описания неопределен. Здесь приведены их определения на естественном языке.

нетерминальный_символ обозначает класс словосочетаний, которые могут входить во входную последовательность. Он имеет вид структуры языка Пролог, функтор которой обозначает категорию словосочетаний, а аргументы дают дополнительную информацию (форму числа, значение и так далее).

терминальный_символ указывает ряд слов, которые могут быть частью входной последовательности. Он имеет вид списка языка Пролог и может быть либо пустым списком [], либо списком некоторой фиксированной длины. Элементы этого списка должны быть сопоставимы со словами последовательности в соответствии с заданным порядком.

целевые_утверждения_прологаэто любые целевые утверждения языка Пролог. Они могут быть использованы для записи дополнительных условий и действий, ограничивая возможные пути анализа и указывая, как сложные результаты строятся из простых.

При трансляции на Пролог, целевые_утверждения_прологаостаются неизменными, а нетерминальный_символполучает два дополнительных аргумента, которые вставляются после явно указанных аргументов. Дополнительные аргументы соответствуют последовательности, в которой выделяется словосочетание, и последовательности, которая остается после выделения словосочетания. Терминальные символы появляются среди дополнительных аргументов нетерминальных символов. При вызове предиката, определенного грамматическими правилами, с верхнего уровня интерпретатора или из обычного правила Пролога необходимо явно указать два дополнительных аргумента.

Во

втором правиле для предиката заголовокописывается класс грамматических правил, с которыми нам еще не приходилось сталкиваться. До сих пор определения терминальных и нетерминальных символов содержали информацию лишь о том, как они обрабатывают входную последовательность. Иногда может возникнуть желание определить правила таким образом, чтобы они вставляли элементы во входную последовательность (для обработки другими правилами). Например, предложение в повелительном наклонении можно было бы анализировать следующим образом. В исходное предложение

Eat your supper.

вставляется дополнительное слово:

You eat your supper.

Получившееся предложение имеет правильную структуру, согласующуюся с нашими представлениями о структуре предложений. Это можно сделать, используя грамматическое правило вида:

предложение--› императив, группа_существительного, группа_глагола.

императив,[you]--› [].

императив--› [].

Из приведенных здесь правил лишь одно заслуживает внимания. Это первое правило для императив, которое транслируется в утверждение

императив(L,[уоu|L]).

То есть, последовательность, возвращаемая после обработки, длиннее исходной последовательности. В общем случае, левая часть грамматического правила может включать нетерминальный символ, за которым, через запятую, следует список слов. Смысл такого правила состоит в том, что в процессе разбора предложения слова, указанные в списке, вставляются во входную последовательность после того, как завершится обработка целевыми утверждениями в правой части правила.

Упражнение 9.3.Приведенное определение для грамматических правил, даже если бы оно было полным, не сможет выполнить функции синтаксического анализатора, если на вход ему подавать последовательность знаков. Почему?

В заключение рассмотрим пример грамматических правил, используемых для непосредственного извлечения «смысла» предложений, минуя этап построения дерева разбора. Этот пример взят из статьи Pereira, Warren, Artificial Intelligence, v. 13. Представленные далее правила транслируют предложения из ограниченного подмножества предложений английского языка в некоторое представление на языке исчисления предикатов, отражающее смысл этих предложений. Описание исчисления предикатов и используемой формы записи даны в гл. 10. В качестве примера работы программы мы приведем предложение «every man loves a woman» и соответствующую структуру, отражающую его смысл: [14]

14

На «ломаном» русском языке этот пример можно представить следующим образом: «Каждый мужчина нравится некоторая женщина».

все (X, мужчина (X)--› существует (Y, (женщина (Y) & нравится (X)))) .
Прим. ред.

all(X,(man(X)->exists(Y,(woman(Y)& loves(X,Y)))))

Здесь представлены грамматические правила программы:

?- op(100,xfy,&)

?- op(150,xfy,->)

предложение(Р)--› группа_существительного(Х,Р1,Р),группа_глагола(Х,Р1).

группа_существительного(Х,Р1,Р)--›определитель(Х,Р2,Р1,Р),существительное(Х,Р3), отн_утверждение(Х,Р3,Р2).

группа_существительного(Х,Р,Р)--› наст_существительное(Х).

группа_глагола(Х,Р)--› перех_глагол(Х,Y,Р1),группа_существительного(Y,Р1,Р).

группа_глагола(Х,Р)--› неперех_глагол(Х,Р).

отн_утверждение(Х,Р1,(Р1&Р2))--› [that], группа_глагола(Х,Р2).

отн_утверждение(_,Р,Р)--› [].

определитель(Х,Р1,Р2,аll(Х,(Р1>Р2)))--› [every].

определитель(Х,Р1,Р2,ехists(Х,(Р1&Р2)))--› [а].

существительное(Х,man(Х))--› [man].

существительное(Х, woman (X))--› [woman].

наст_существительное(john)--› [john].

пepex_глагол(X,Y,loves(X,Y))--› [loves].

неперех_глагол(Х,lives(Х)))--› [lives].

Поделиться с друзьями: