Упражнение 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. При этом правила согласования числа сводятся к условиям согласованности значений этих аргументов. Форма числа подлежащего в группе существительного должна совпадать с формой числа группы глагола и так далее. Переписав соответствующим образом грамматические правила, получаем:
предложение--› предложение(Х).
предложение(Х)-- › группа_существительного(Х), группа _глагола(Х).
Читать дальше