Упражнение 2.1.25 |
Слова, языки и грамматики
1.4. Порождающие грамматики
Определение 1.4.1. Порождающей грамматикой
( грамматикой типа 0,
generative grammar, rewrite grammar)
называется четверка ,
где N и
- конечные алфавиты,
,
, P конечно и
.
Здесь
- основной алфавит
( терминальный алфавит ),
его элементы называются терминальными символами
или терминалами (terminal), N - вспомогательный алфавит
( нетерминальный алфавит ),
его элементы называются нетерминальными символами,
нетерминалами,
вспомогательными символами или переменными
(nonterminal, variable), S - начальный символ
( аксиома,
start symbol).
Пары
называются правилами подстановки,
просто правилами или продукциями
(rewriting rule, production)
и записываются в виде
.
Пример 1.4.2.
Пусть даны множества N = {S}, ,
.
Тогда
является порождающей грамматикой.
Замечание 1.4.3.
Будем обозначать
элементы множества
строчными буквами из начала латинского алфавита,
а элементы множества N -
заглавными латинскими буквами.
Обычно в примерах мы будем задавать грамматику в виде списка правил,
подразумевая, что алфавит N
составляют все заглавные буквы, встречающиеся в правилах,
а алфавит
-
все строчные буквы, встречающиеся в правилах.
При этом правила порождающей грамматики записывают в таком порядке,
что левая часть первого правила
есть начальный символ S.
Замечание 1.4.4.
Для обозначения n правил с одинаковыми левыми частями
часто используют сокращенную запись
.
Определение 1.4.5.
Пусть дана грамматика G.
Пишем ,
если
,
и
для некоторых слов
в алфавите
.
Если
,
то говорят, что
слово
непосредственно выводимо
из слова
.
Замечание 1.4.6.
Когда из контекста ясно, о какой
грамматике идет речь,
вместо
можно писать просто
.
Пример 1.4.7. Пусть
![G = \langle \{ S \} , \{ a , b , c \} ,
\{ S \rightarrow acSbcS ,\ cS \rightarrow \varepsilon \} ,
S \rangle .](/sites/default/files/tex_cache/45ccc5b485305172c82cfcfaed28d41b.png)
![cSacS \underset{ G }{\Rightarrow } cSa](/sites/default/files/tex_cache/ae0fb16de4a79c08570f7e054b164b59.png)
Определение 1.4.8. Если ,
где
,
то пишем
и говорим, что
слово
выводимо
из слова
.
Другими словами, бинарное отношение
является рефлексивным, транзитивным замыканием
бинарного отношения
,
определенного на множестве
.
При этом последовательность слов
называется выводом (derivation)
слова
из слова
в грамматике G.
Число n
называется длиной
( количеством шагов )
этого вывода.
Замечание 1.4.9.
В частности, для всякого слова
имеет место
(так как возможен вывод длины 0 ).
Пример 1.4.10.
Пусть .
Тогда
.
Длина этого вывода - 3.
Определение 1.4.11. Язык, порождаемый
грамматикой G, - это множество .
Будем также говорить, что грамматика G порождает (generates) язык L(G).
Замечание 1.4.12.
Существенно, что в определение порождающей грамматики
включены два алфавита - и N.
Это позволило нам в определении 1.4.11 "отсеять" часть слов, получаемых из начального символа.
А именно, отбрасывается каждое слово, содержащее хотя бы один символ,
не принадлежащий алфавиту
.
Пример 1.4.13.
Если ,
то
.
Определение 1.4.14. Две грамматики эквивалентны, если они порождают один и тот же язык.
Пример 1.4.15. Грамматика
![\begin{align*}
S \; & {\to} \; abS , \\
S \; & {\to} \; a
\end{align*}](/sites/default/files/tex_cache/eada5d3260114bfd120169727f4086c8.png)
![\begin{align*}
T \; & {\to} \; aU , \\
U \; & {\to} \; baU , \\
U \; & {\to} \; \varepsilon
\end{align*}](/sites/default/files/tex_cache/82e92fcae4461da6ec04b1e61f9fed7f.png)
Упражнение 1.4.16. Описать язык, порождаемый грамматикой
![\begin{align*}
S \; & {\to} \; F F , \\
F \; & {\to} \; a F b , \\
F \; & {\to} \; ab .
\end{align*}](/sites/default/files/tex_cache/86cb42dc6b55ff91799cdb917c8d4120.png)
Упражнение 1.4.17. Описать язык, порождаемый грамматикой
![\begin{align*}
C \; & {\to} \; C c , \\
C \; & {\to} \; A , \\
A \; & {\to} \; a A b , \\
A \; & {\to} \; \varepsilon .
\end{align*}](/sites/default/files/tex_cache/3df8bc71b1e7f45ddacf809a615e8bfe.png)
Упражнение 1.4.18. Описать язык, порождаемый грамматикой
![\begin{align*}
K \; & {\to} \; \varepsilon , \\
K \; & {\to} \; a , \\
K \; & {\to} \; b , \\
K \; & {\to} \; a K a , \\
K \; & {\to} \; b K b .
\end{align*}](/sites/default/files/tex_cache/957b865c18ff0897e55e31fe8a71b0c8.png)
Упражнение 1.4.19. Описать язык, порождаемый грамматикой
![\begin{align*}
D \; & {\to} \; D A , \\
D A A \; & {\to} \; A D b , \\
A D A \; & {\to} \; b , \\
A \; & {\to} \; a .
\end{align*}](/sites/default/files/tex_cache/d04fd61f4e5aac9ad95168a1e2b5e2c9.png)
Упражнение 1.4.20. Описать язык, порождаемый грамматикой
![\begin{align*}
F \; & {\to} \; a F H , \\
F \; & {\to} \; a b c , \\
b H \; & {\to} \; b b c , \\
c H \; & {\to} \; H c .
\end{align*}](/sites/default/files/tex_cache/3543e65c5318dc3daed5d660d69e8f55.png)
Упражнение 1.4.21. Описать язык, порождаемый грамматикой
![\begin{align*}
S \; & {\to} \; a T S , \\
S \; & {\to} \; U , \\
T a \; & {\to} \; aa T , \\
T U \; & {\to} \; U , \\
U \; & {\to} \; a .
\end{align*}](/sites/default/files/tex_cache/766783fffa1324d908f24c4827c0276a.png)
Упражнение 1.4.22. Эквивалентны ли грамматика
![\begin{align*}
S \; & {\to} \; ab , \\
S \; & {\to} \; a K S b , \\
K \; & {\to} \; b S b , \\
K S \; & {\to} \; b , \\
K \; & {\to} \; \varepsilon
\end{align*}](/sites/default/files/tex_cache/13bf2a4d2a2da4a093d67fbc024a4f30.png)
![\begin{align*}
S \; & {\to} \; a T b , \\
T \; & {\to} \; \varepsilon , \\
T \; & {\to} \; b , \\
T \; & {\to} \; S , \\
T \; & {\to} \; b S b S ?
\end{align*}](/sites/default/files/tex_cache/8e63036807e7906bfb9a2b61cc933f4d.png)
Упражнение 1.4.23. Эквивалентны ли грамматика
![\begin{align*}
S \; & {\to} \; aD , \\
D \; & {\to} \; bba , \\
D \; & {\to} \; baDa , \\
D \; & {\to} \; aDaDa \\
\end{align*}](/sites/default/files/tex_cache/8c81f703533648a103d9599908ff4bf7.png)
![\begin{align*}
S \; & {\to} \; aaE , \\
S \; & {\to} \; abJ , \\
E \; & {\to} \; bJJ , \\
J \; & {\to} \; aaEa , \\
J \; & {\to} \; abJa , \\
J \; & {\to} \; ba ?
\end{align*}](/sites/default/files/tex_cache/164d0964008f56fbd1da65729a78fa87.png)