Программирование на языке пролог
Шрифт:
Наконец, система должна знать, как транслировать правила, вводящие реальные слова. Трансляция таких правил производится путем включения слов в списки, образующие аргументы соответствующих предикатов, так что, например, правило
определитель--› [the].
транслируется в утверждение:
определитель(the|S],S).
Если программа синтаксического анализатора представлена в виде совокупности грамматических правил, то каким образом надо задать целевые утверждения, чтобы можно было обработать их программой? Так как известно, как грамматические правила транслируются в утверждения обычного Пролога, то можно выразить целевые утверждения обычным образом, добавив при этом дополнительные аргументы. Первый
?- предложение([thе, man, eats,the,apple],[]).
?- группа_существительного([the,man,sings],X).
В некоторых реализациях Пролога в качестве альтернативы имеется встроенный предикат phrase,который просто добавляет дополнительные аргументы. Предикат определен следующим образом:
phrase (P,L) истинно, если список L является допустимым словосочетанием типа Р.
Таким образом, можно было бы заменить первое из приведенных выше целевых утверждений следующим:
?- phrase(прeдложeниe, [the,man,eats,the,apple]).
Заметим, что определение предиката phraseпредполагает, что обрабатывается весь список целиком, а список, оставшийся после обработки должен быть пустым. Поэтому второе целевое утверждение нельзя изменить, используя предикат phrase.Если в реализации Пролога нет встроенного предиката phrase,то его можно легко определить следующим образом:
phrase(P,L):- Goal =.. [P,L,[]], call(Goal).
Отметим однако, что данное определение будет не приемлемо, если используются более общие грамматические правила, о которых мы скажем в следующем разделе.
Упражнение 9.1.Может быть вы захотите определить на Прологепроцедуру translateтаким образом, что translate(X,Y)истинно, если X– грамматическое правило (подобное тем, с какими мы сталкивались в этом разделе), a Y– терм, представляющий соответствующее утверждение Пролога. Это упражнение довольно трудное. Процедуры подобные translateимеются в Пролог-системе либо как встроенные, либо в виде библиотечных программ. Но если вы действительно напишите процедуру translate,то это поможет вам понять, что представляет собой процесс трансляции.
9.4. Присоединение дополнительных аргументов
До сих пор рассматривался лишь довольно ограниченный класс грамматических правил. В этом разделе мы введем одно полезное расширение, позволяющее использовать в грамматических правилах дополнительные аргументы. Это «расширение» не выходит за рамки стандартных средств, предоставляемых в Прологе для записи грамматических правил.
Уже было показано, как имя некоторого класса словосочетаний, встретившееся в грамматическом правиле, транслируется в предикат, имеющий два дополнительных аргумента. Таким образом, грамматические правила приводят к множеству предикатов с двумя аргументами. Иногда при написании синтаксических анализаторов, помимо аргументов, служащих для представления обрабатываемой последовательности, могут потребоваться дополнительные аргументы, тем более, что предикаты в Прологе могут иметь произвольное число аргументов. Предлагаемая здесь форма представления грамматических правил обеспечивает такую возможность.
Давайте рассмотрим пример, показывающий, когда такие дополнительные аргументы полезны. Разберем задачу «согласования числа» между подлежащим и сказуемым предложения. Последовательности слов подобные
*The boys eats the apple.
*The boy eat the apple.
не являются грамматически правильными предложениями, даже если бы они и допускались грамматикой после незначительного ее расширения ('*' используется для обозначения грамматически неправильных предложений). Причина, по которой они не могут считаться грамматически правильными, состоит
предложение--› предложение_едч.
предложение--› предложение_мнч.
группа_существительного-- ›группа_существительного_едч.
группа_существительного--› группа_существительного_мнч.
предложение_едч--› группа_существительного_едч, группа_глагола_едч.
группа_существительного_едч--› определитель_едч, существительное_едч.
группа_глагола_едч--› глагол_едч, группа_существительного.
группа_глагола_едч--› глагол_едч.
определитель_едч--› [the].
существительное_едч--› [boy].
глагол_едч--› [eats].
Аналогичное множество правил можно написать и на случай множественного числа. Такой способ согласования числа не очень изящен и скрывает тот факт, что структура предложений для единственного и множественного числа во многом совпадает. Более удачный способ состоит в том, чтобы связать с классами словосочетаний дополнительный аргумент, указывающий на использование единственного или множественного числа. Так предложение(едч)обозначает словосочетание предложение,употребленное в форме единственного числа. В общем случае, предложение (X)обозначает предложение, форма числа которого равна X. При этом правила согласования числа сводятся к условиям согласованности значений этих аргументов. Форма числа подлежащего в группе существительного должна совпадать с формой числа группы глагола и так далее. Переписав соответствующим образом грамматические правила, получаем:
предложение--› предложение(Х).
предложение(Х)-- ›группа_существительного(Х), группа _глагола(Х).
группа_существительного(Х)--› определитель(Х), существительное(Х).
группа_глагола(Х)--› глагол(Х).
группа_глагола(X)--› глагол(Х), группа_существительного(Y).
существительное(едч)--› [boy].
существительное(мнч) -› [boys].
определитель(_)--› [the].
глагол(едч)--› [eats].
глагол(мнч)--›[eat].
Обратим внимание на способ, каким можно определить форму числа для the.С этого слова могло бы начинаться словосочетание, употребленное в форме как единственного, так и множественного числа, и поэтому форма числа этого слова может быть сопоставлена с чем угодно. Отметим также, что во втором правиле для предиката группа_глаголаимена переменных выражают факт, что форма числа группы глагола (которая должна быть согласована с формой числа подлежащего) определяется по форме числа глагола, а не по форме числа объекта, если таковой имеется.
Можно ввести аргументы, выражающие другую важную информацию помимо согласования числа подлежащего и сказуемого. Например, их можно использовать для хранения перечня элементов, составляющих предложения, встретившихся не на своем обычном месте, и тем самым обрабатывать ситуации, называемые лингвистами «смещением». Или же они могут быть использованы для отражения семантическиххарактеристик, указывающих, каким образом значение (смысл)словосочетания составляется из значений более мелких словосочетаний, входящих в исходное. Эти вопросы далее не будут обсуждаться, хотя в разд. 9.6 приведен простой пример использования семантической информации в синтаксическом анализаторе. Однако существует один момент, который здесь необходимо отметить. Лингвистам, возможно, интересно знать, что если в грамматические правила введены дополнительные аргументы, то нельзя гарантировать, что язык, определяемый этой грамматикой, по-прежнему остается контекстно-свободным языком, хотя довольно часто он будет таковым.