Квантор (лат. quantum - сколько) это определение количества понятий из какой либо области. В естественном языке роль кванторов выполняют слова "все", "любой", "каждый", и так далее. Грамматический движок работает с четырымя кванторами, которые мы обозвали: квантор all, квантор some, квантор unknown и квантор none. В ряде случаев роль кванторов заключается в обозначении группы из нескольких объектов Системы, над которыми следует провести операцию, так что они по совместительству являются метасимволами. Важно отметить, что все кванторы имеют отношение только к синтаксису деклараций языка ПРИИСК, и никоим образом не соотносятся с грамматикой естественного объектного языка.
Все операции, где фигурируют кванторы, сводятся к сравнению целых чисел (тип int), в основном - индексов элемента в списке либо тэга токена. В силу такого специфического использования кванторов они представлены целочисленными константами UNKNOWN, ANY_STATE, UNKNOWN_STATE, - определения находятся в файле quantors.h. Поэтому накладные расходы в связи с использованием кванторов полностью отсутствуют.
Разумеется такой подход гораздо менее универсален, чем, допустим реализованная в языке SQL работа со значением NULL.
Широко используемый в формальной логике квантор всеобщности обозначается в языке ПРИИСК символом ‘*’. Рассмотрим пример использования этого квантора в движке.
Точная идентификация словарной статьи осуществляется через комбинацию имени грамматического класса, к которому отнесена статья, и имени статьи:
имя_класса:имя_статьи
Например:
союз:и
Такой способ идентификации позволяет однозначно указать статью в случае, когда несколько статей из разных грамматических классов имеют одинаковое имя: инфинитив:делать и предикатив:делать. Запись типа
имя_класса:*
означает любую словарную статью, принадлежащую указанному грамматическому классу. Такая запись часто используется в операторах Синтаксической Грамматики, когда записывается правило построения некоторой грамматической конструкции. Продолжая пример с указанием статей, можно упомянуть еще такой факт: запись
*:*
обозначает вообще любую словарную статью, принадлежащую к любому грамматическому классу.
Фактически в движке одним символом ‘*‘ обозначены три немного разных понятия. Первая трактовка уже была рассмотрена: "любой из всех возможных". Во-вторых, знак ‘*‘ рассматривается как "безразличное состояние". Например, при формировании графов (деревьев) необходимо как-то помечать связки между узлами. В языке ПРИИСК используется формат:
узелA.<имя_связки>узелB
К примеру:
предикатив:*.<инструмент>существительное:*
В данном случаем именем связки является инструмент. Однако иногда именовать связки между узлами нет нужды (к примеру, когда к узлу подключен только один узел), тогда можно пропустить определение связки, чему соответствует формат:
узелA.узелB
По соображениям унификации внутреннего представления желательно предусмотреть специальное имя для неименованных связок, и именно для этих целей можно использовать квантор ‘*‘:
узелA.<*>узелB
Итак, в этом случае символ ‘*‘ означает "безразлично, какой из", то есть почти "никакой из" (см. квантор unknown). В случае сравнения двух графов, когда требуется проверить соответствие и связок, и узлов, связка ‘*’ дает истину при сравнении с любой связкой.
Третья интерпретация символа ‘*‘ встречается только в одном месте словаря, а именно при описании словарной статьи. Например, фрагмент:
enum род { муж жен ср }
entry кенгуру :существительное
{
:
род:*{кенгуру
}
}
фактически рассматривается как:
enum род { муж жен ср}
entry кенгуру :существительное
{
:
род: муж { кенгуру
}
род: жен { кенгуру }
род: ср { кенгуру}
}
То есть, третья роль символа ‘*‘ - обозначать понятия "для каждого из возможных" в отношении состояний одной координаты, то есть действовать как ‘немой индекс’, по которому проводится автоматическое перечисление всех возможных вариантов.
Конкретная интерпретация символа ‘*‘ указываться по ходу изложения форматов.
Обозначает понятие ‘неизвестно, какой из возможных’, или ‘какой-то один из возможных’. Очень интенсивно используется Системой во внутренних операциях, а при программировании на языке Прииск обозначается как знак вопроса ‘?’. В некоторых случаях его интерпретация близка к квантору ‘*‘, но квантор ‘?’ никогда не обозначает группу из нескольких объектов, в отличие от any квантора.
Интерпретируется как ‘несколько объектов из группы’. Редко используется, в частности, не применяется во внутренних операциях Системы. Основаная сфера приложения - описание результатных контекстов операторов Синтаксической Грамматики. Обозначается тремя точками без пробелов между ними:
…
Например, если правило Продукционной Машины должно проверить, что проверяемая группа грамматических деревьев содержит два слова ‘если’ и ‘тогда’, разделяемых произвольным количеством других лексем, то можно написать нечто вроде:
if context { СОЮЗ : ЕСЛИ {} ... СОЮЗ: ТОГДА{} }
Следует понимать как ‘никакой из возможных’, ‘отсутствие элемента’. Очень просто показать его использование на примере описания требования на опорное дерево в кондикторе context:
context { ab.>< }
Описанию первой опорной точки будут удовлетворять любые деревья с корнем a, причем количество подключенных к корню веток не регламентируется. Вторая опорная точка помимо требования на содержимое корневого узла имеет дополнительное сужение области совпадения: к корню не должно быть подключено ни одного узла. Именно квантор none дает возможность изящно описать такое налагаемое условие.
Правила синтаксического анализа
Внутренний язык грамматической машины
© Elijah Koziev 2010
Поисковая система
SDK Поисковой системы
Экранный переводчик
|
|
изменено 16-Aug-11 | ||||||||||||||||||||||||||||||||||||||