- •Введение
- •1. Формальные языки
- •1.1. Алфавит и цепочки
- •1.2. Языки и операции над ними
- •1.3. Способы задания языков
- •2. Грамматики
- •2.1. Формальное определение грамматики
- •2.2. Классификация грамматик по Хомскому
- •2.3. Свойства языков и грамматик
- •3. Иерархия автоматов
- •3.1. Конечные автоматы
- •3.2. Автоматы с магазинной памятью
- •3.3. Линейно ограниченные автоматы
- •3.4. Машины Тьюринга
- •4. Регулярные и контекстно-свободные языки
- •4.1. Регулярные множества и регулярные выражения
- •4.2. Самовставленные языки
- •4.3. Лемма о накачке для регулярных языков
- •4.4. Деревья вывода и однозначность грамматик типа 2
- •4.5. Преобразования КС-грамматик
- •4.6. Лемма о накачке для КС-языков
- •Список литературы
- •Оглавление
Глава 2 Грамматики
2.1. Формальное определение грамматики
Определение 31 (Порождающая грамматика). Порождающей грамматикой
называют четверку G = (N,Σ,P,S), где:
1)N – алфавит нетерминальных символов;
2)Σ – алфавит терминальных символов;
3)P – конечное множество правил
P(N + Σ) N(N + Σ) × (N + Σ) ,
т.е. каждый элемент множества P – пара цепочек (α,β), где α – произвольная цепочка из терминальных и нетерминальных символов, содержащая в себе хотя бы один нетерминальный символ, а β – произвольная цепочка из терминальных и нетерминальных символов.
Пару (α,β) обычно принято записывать в виде α → β;
4)S – нетерминальный символ из N, начальный символ грамматики.
В последнем определении терминалы (элементы множества терминаль-
ных символов) представляют собой символы, из которых строятся цепочки языка. В свою очередь, нетерминалы (элементы множества нетерминальных символов) играют роль переменных в грамматике. Начальный символ грамматики задает язык, определяемый грамматикой. Остальные нетерминалы играют роль вспомогательных переменных.
Порождающую грамматику можно сопоставить с системой текстовых замен RW = (N Σ,P). Поэтому можно определить отношения непосредственной выводимости и выводимости по грамматике как отношения по системе текстовых замен. Тогда язык, определенный порождающей грамматикой G, задается как
L(G) = Lg(RW,{S}) ∩ Σ .
Но можно провести независимое определение языка, порожденного грамматикой.
Определение 32 (Язык, порожденный грамматикой). Языком L(G), порожденным (определенным) грамматикой G = (N,Σ,P,S), называют множество
13
всех терминальных цепочек (цепочек, состоящих только из терминальных символов), выводимых из начального символа грамматики:
L(G) = {γ Σ | S G γ}.
Определение 33 (Эквивалентные грамматики). Две грамматики называются эквивалентными, если они определяют один и тот же язык.
Пример 18. Рассмотрим грамматику G = (N,Σ,P,S), где N = {S}, Σ = {0,1},
P = {S → 0S1, S → 01}.
В этой грамматике всего лишь два правила и один нетерминальный символ.
Цепочка 01 выводится из S, а следовательно, она принадлежит языку
L(G).
Имеет место S 0S1 00S11 000111. Следовательно, S 000111, а значит, 000111 также принадлежит языку L(G).
Можно показать что язык L(G) состоит из всех непустых цепочек, где последовательность единиц стоит за последовательностью из такого же ко-
личества нулей:
L(G) = {0k1k | k > 0}.
Пример 19. Рассмотрим грамматику G = (N,Σ,P,A), где N = {A,B,C}, Σ = = {a,b,c}, множество P состоит из правил:
A → aABC, |
A → abC, CB → BC, |
bB → bb, |
bC → bc, cC → cc. |
Язык L(G) содержит цепочки вида anbncn для каждого n > 1, так как мы можем использовать первое правило n − 1 раз, чтобы получить Aan−1A(BC)n−1. Затем мы используем второе правило, чтобы получить A anbC(BC)n−1. Третье правило дает нам возможность расположить B и C так, чтобы все B предшествовали всем C. Таким образом A anbBn−1Cn. Затем, используя четвертое правило n − 1 раз, получаем A anbnCn. Применим один раз пятое правило, получая A anbncCn−1. Наконец, применив n − 1 раз шестое правило, окончательно получаем A anbncn. Легко показать, что в общем случае возможен только такой порядок применения
правил, т. е.
L(G) = {anbncn | n > 1}.
Пример 20. Рассмотрим грамматику G = (N,Σ,P,S), где N = {S,A,B}, Σ = = {a,b}, а P задается правилами
S → aB, S → bA, A → a, A → aS, A → bAA,
B → b, B → bS, B → aBB.
Можно показать, что эта грамматика определяет язык, состоящий из цепочек, в которых одинаковое количество символов a и b. 
14
Замечание 1. Часто для краткости правила грамматики, имеющие одинаковую левую часть, будем объединять при записи в «одно» правило, у которого левая часть – левая часть исходных правил, а в правой части все правые части исходных правил, разделенные символом «|». Таким образом, грамматика из примера 20 запишется следующим образом:
S → aB | bA,
A → a | aS | bAA,
B → b | bS | aBB.
Пример 21. Рассмотрим грамматику G = (N,Σ,P,S), где N = {S,A,B, C,D}, Σ = {a,b}, а P задается правилами
S → CD, |
C → aCA, |
C → bCB, |
C → ε, D → ε, AD → aD, |
Aa → aA, |
Ab → bA, |
BD → bD, |
Ba → aB, Bb → bB. |
Можно показать, что эта грамматика определяет язык
L(G) = {ww | w {a,b} }.
Пример 22. Рассмотрим грамматику G = (N,Σ,P,S), где N = {S}, Σ = {a,b}, P = {S → aS,S → bS,S → a,S → b}. Эта грамматика определяет язык, состоящий из всех непустых цепочек над алфавитом {a,b}, т. е. L(G) = {a,b}+.
Определение 34 (Аналитическая грамматика). Аналитической (распознающей) грамматикой называют четверку G = (N,Σ,P,S), где:
1)N – алфавит нетерминальных символов;
2)Σ – алфавит терминальных символов;
3)P – конечное множество продукций
P(N + Σ) × (N + Σ) N(N + Σ) ;
4)S – нетерминальный символ из N, заключительный (целевой, финальный, завершающий) символ грамматики.
Аналитическая грамматика G соответствует системе текстовых замен
RW = (N Σ,P) с языком
L(G) = La(RW,{S}) ∩ Σ .
Можно определить язык, допускаемый аналитической грамматикой, следующим образом.
15
Определение 35 (Язык, допускаемый грамматикой). Языком L(G), определенным (допускаемым) аналитической грамматикой G = (N,Σ,P,S), называют множество всех терминальных цепочек (цепочек, состоящих только из терминальных символов), из которых можно вывести заключительный символ грамматики:
L(G) = {w Σ | w S}.
Определение 36 (Двойственная грамматика). Пусть G = (N,Σ,P,S) – порождающая (аналитическая) грамматика. Если P′ состоит из всех правил вида α → β, таких, что β → α P, тогда аналитическая (порождающая) грамматика G1 = (N,Σ,P′,S) называется двойственной для грамматики G.
Теорема 1 (О двойственной грамматике). Пусть для порождающей (аналитической) грамматики G = (N,Σ,P,S) построена двойственная аналитическая (порождающая) грамматика G1 = (N,Σ,P′,S). Тогда верно, что
L(G) = L(G1).
Доказательство. Пусть G – порождающая грамматика.
Утверждаем, что для любого слова w (N + Σ) |
|
|
|
S w тогда и только тогда, когда |
w |
S. |
(2.1) |
G |
G1 |
|
|
Действительно, можно показать, что |
|
|
|
S G w1 G w2 G ··· G wk |
|
(2.2) |
|
тогда и только тогда, когда |
|
|
|
wk G1 ··· G1 w2 G1 w1 G1 |
S. |
|
(2.3) |
По определению P′ это имеет место для k = 1. Рассуждая по индукции, предположим, что утверждение истинно для некоторого k > 1, т. е. (2.2) имеет место тогда и только тогда, когда выполнено (2.3). Но wk G wk+1 тогда и только тогда, когда wk+1 G1 wk. Собирая последнее воедино, получим, что (2.1) верно, а следовательно, верно и утверждение теоремы. 

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