Теория формальных грамматик - раздел дискретной математики, изучающий способы описания закономерностей, характеризующих всю совокупность правильных текстов того или иного языка.
Формальные грамматики - это абстрактные системы, позволяющие с помощью единообразных процедур получать правильные тексты данного языка вместе с описанием их структуры. Теория формальных грамматик занимает центральное место в математической лингвистике, так как именно она позволяет моделировать наиболее существенный аспект функционирования языка - переработку смыслов в тексты и обратно. Вместе с тем она выделяется среди других разделов математической лингвистики большей сложностью математического аппарата (сходного с аппаратом теории алгоритмов и общей теории автоматов) и возникающих в ней математических задач. Формальные грамматики наиболее разработанных типов представляют собой системы (устройства), которые позволяют порождать или распознавать множества конечных последовательностей (цепочек), интерпретируемые обычно как множества правильных предложений, а также сопоставлять входящим в эти множества цепочкам описания их синтаксической структуры в терминах систем составляющих или деревьев подчинения.
|
|
Грамматикой называется четверка G = (N, T, P, S), где N - конечное множество нетерминальных символов (нетерминалов), T - множество терминалов (не пересекающихся с N), S - символ из N, называемый начальным, Р - конечное подмножество множества:
(N È T)* N (N È T)* x (N È T)*,
называемое множеством правил. Множество правил Р описывает процесс порождения цепочек языка. Элемент pi = (a, b) множества Р называется правилом (продукцией) и записывается в виде a Þ b. Здесь a и b - цепочки, состоящие из терминалов и нетерминалов. Данная запись может читаться одним из следующих способов:
- цепочка a порождает цепочку b;
- из цепочки a выводится цепочка b.
Таким образом, правило P имеет две части: левую, определяемую, и правую, подставляемую. То есть правило pi - это двойка (p i1, pi2), где p i1 = (N È T)* N (N È T)* - цепочка, содержащая хотя бы один нетерминал, pi2 = (N È T)* - произвольная, возможно пустая цепочка (e - цепочка).
Если цепочка a содержит pi1, то, в соответствии с правилом pi, можно образовать новую цепочку b, заменив одно вхождение pi1 на pi2. Говорят также, что цепочка b выводится из a в данной грамматике.
Для описания абстрактных языков в определениях и примерах будем пользоваться следующими обозначениями:
- терминалы обозначим буквами a, b, c, d или цифрами 0, 1,..., 9;
- нетерминалы будем обозначать буквами A, B, C, D, S (причем нетерминал S - начальный символ грамматики);
- буквы U, V,..., Z используем для обозначения отдельных терминалов или нетерминалов;
- через a, b, g... обозначим цепочки терминалов и нетерминалов;
- u, v, w, x, y, z - цепочки терминалов;
- для обозначения пустой цепочки (не содержащей ни одного символа) будем использовать знак e;
- знак “ ® ” будет отделять левую часть правила от правой и читаться как “порождает” или “есть по определению”. Например, A ® cd, читается как “A порождает cd”.
Эти обозначения определяют некоторый язык, предназначенный для описания правил построения цепочек, а значит, для описания других языков. Язык, предназначенный для описания другого языка, называется метаязыком.
|
|
Пример грамматики G1:
G1 = ({A, S}, {0, 1}, P, S),
где P:
1. S ® 0A1;
1. 0A ® 00A1;
2. A ® e.
Выводимая цепочка грамматики G, не содержащая нетерминалов, называется терминальной цепочкой, порождаемой грамматикой G.
Язык L(G), порождаемый грамматикой G, - это множество терминальных цепочек, порождаемых грамматикой G.
Введем отношение ÞG непосредственного вывода на множестве (N È T) *, которое будем записывать следующим образом:
j ÞG y.
Данная запись читается: y непосредственно выводима из j для грамматики G = (N, T, P, S) и означает: если abg - цепочка из множества (N È T) * и b ® d - правило из Р то abg ÞG adg.
Через ÞG+ обозначим транзитивное замыкание (нетривиальный вывод за один и более шагов). Тогда j ÞG+ y читается как: y выводима из j нетривиальным образом.
Через ÞG* - обозначим рефлексивное и транзитивное замыкание (вывод за ноль и более шагов). Тогда j ÞG* y означает: y выводима из j.
Пусть Þk k - я степень отношения Þ. То есть, если a Þk b, то существует последовательность a0a1a2a3 ... ak из к+1 цепочек
a = a0, a1,... ai -1 Þ ai, 1 ≤ i ≤ k и ak = b.
Пример выводов для грамматики G1:
S Þ 0A1 Þ 00A11 Þ 0011;
S Þ1 0A1; S Þ2 00A11; S Þ3 0011;
S Þ+ 0A1; S Þ+ 00A11; S Þ+ 0011;
S Þ * S; S Þ * 0A1; S Þ * 00A11; S Þ * 0011;
где 0011 Ì L(G1).