Московский государственный университет имени М.В.Ломоносова
Опубликован: 09.07.2007 | Доступ: свободный | Студентов: 2485 / 1007 | Оценка: 4.56 / 4.26 | Длительность: 20:40:00
ISBN: 978-5-9556-0062-8
Специальности: Математик
Лекция 2:

Слова, языки и грамматики

< Лекция 1 || Лекция 2: 12345 || Лекция 3 >

1.4. Порождающие грамматики

Определение 1.4.1. Порождающей грамматикой ( грамматикой типа 0, generative grammar, rewrite grammar) называется четверка G \rightleftharpoons \langle N , \Sigma , P , S \rangle, где N и \Sigma - конечные алфавиты, N \cap \Sigma = \varnothing, P \subset (N \cup \Sigma) ^+ \times (N \cup \Sigma) ^*, P конечно и S \in N. Здесь \Sigma - основной алфавит ( терминальный алфавит ), его элементы называются терминальными символами или терминалами (terminal), N - вспомогательный алфавит ( нетерминальный алфавит ), его элементы называются нетерминальными символами, нетерминалами, вспомогательными символами или переменными (nonterminal, variable), S - начальный символ ( аксиома, start symbol). Пары ( \alpha , \beta ) \in P называются правилами подстановки, просто правилами или продукциями (rewriting rule, production) и записываются в виде \alpha \rightarrow \beta.

Пример 1.4.2. Пусть даны множества N = {S}, \Sigma = \{ a , b , c \}, P = \{ S \rightarrow acSbcS ,\ cS \rightarrow \varepsilon \}. Тогда \langle N , \Sigma , P , S \rangle является порождающей грамматикой.

Замечание 1.4.3. Будем обозначать элементы множества \Sigma строчными буквами из начала латинского алфавита, а элементы множества N - заглавными латинскими буквами. Обычно в примерах мы будем задавать грамматику в виде списка правил, подразумевая, что алфавит N составляют все заглавные буквы, встречающиеся в правилах, а алфавит \Sigma - все строчные буквы, встречающиеся в правилах. При этом правила порождающей грамматики записывают в таком порядке, что левая часть первого правила есть начальный символ S.

Замечание 1.4.4. Для обозначения n правил с одинаковыми левыми частями \alpha \rightarrow \beta_1,\ldots, \alpha \rightarrow \beta_n часто используют сокращенную запись \alpha \rightarrow \beta_1 \mid \ldots \mid \beta_n.

Определение 1.4.5. Пусть дана грамматика G. Пишем \phi \underset { G } {\Rightarrow } \psi, если \phi = \eta \alpha \theta, \psi = \eta \beta \theta и ( \alpha \rightarrow \beta ) \in P для некоторых слов \alpha, \; \beta, \; \eta, \; \theta в алфавите N \cup \Sigma. Если \phi \underset{ G }{\Rightarrow } \psi, то говорят, что слово \psi непосредственно выводимо из слова \phi.

Замечание 1.4.6. Когда из контекста ясно, о какой грамматике идет речь, вместо \underset{ G }{\Rightarrow} можно писать просто \Rightarrow.

Пример 1.4.7. Пусть

G = \langle \{ S \} , \{ a , b , c \} ,
 \{ S \rightarrow acSbcS ,\ cS \rightarrow \varepsilon \} ,
 S \rangle .
Тогда cSacS \underset{ G }{\Rightarrow } cSa.

Определение 1.4.8. Если \omega_0 \underset{ G }{\Rightarrow } \omega_1
 \underset{ G }{\Rightarrow }
 \ldots \underset{ G }{\Rightarrow } \omega_n, где n \geqslant 0, то пишем {\omega_0 \overset * {\underset{ G }{\Rightarrow}} \omega_n} и говорим, что слово \omega_n выводимо из слова \omega_0. Другими словами, бинарное отношение {\overset * {\underset{ G }{\Rightarrow}}} является рефлексивным, транзитивным замыканием бинарного отношения {\underset{ G }{\Rightarrow}}, определенного на множестве (N \cup \Sigma) ^*.

При этом последовательность слов \omega_0, \omega_1,\ldots, \omega_n называется выводом (derivation) слова \omega_n из слова \omega_0 в грамматике G. Число n называется длиной ( количеством шагов ) этого вывода.

Замечание 1.4.9. В частности, для всякого слова \omega \in (N \cup \Sigma) ^* имеет место \omega \oversуt * {\underset{ G }{\Rightarrow}} \omega (так как возможен вывод длины 0 ).

Пример 1.4.10. Пусть G = \langle \{ S \} , \{ a , b \} ,
\{ S \rightarrow aSa ,\ S \rightarrow b \} , S \rangle. Тогда aSa \overset * {\underset{ G }{\Rightarrow }} aaaaSaaaa. Длина этого вывода - 3.

Определение 1.4.11. Язык, порождаемый грамматикой G, - это множество L(G) \rightleftharpoons \{ \omega \in \Sigma ^* \mid
S \overset * {\underset{ G }{\Rightarrow}} \omega \}. Будем также говорить, что грамматика G порождает (generates) язык L(G).

Замечание 1.4.12. Существенно, что в определение порождающей грамматики включены два алфавита - \Sigma и N. Это позволило нам в определении 1.4.11 "отсеять" часть слов, получаемых из начального символа. А именно, отбрасывается каждое слово, содержащее хотя бы один символ, не принадлежащий алфавиту \Sigma.

Пример 1.4.13. Если G = \langle \{ S \} , \{ a , b \} ,
\{ S \rightarrow aSa ,\ S \rightarrow bb \} , S \rangle, то L(G) = \{ a^n bb a^n \mid n \geqslant 0 \}.

Определение 1.4.14. Две грамматики эквивалентны, если они порождают один и тот же язык.

Пример 1.4.15. Грамматика

\begin{align*}
S \; & {\to} \; abS , \\
S \; & {\to} \; a 
\end{align*}
и грамматика
\begin{align*}
T \; & {\to} \; aU , \\
U \; & {\to} \; baU , \\
U \; & {\to} \; \varepsilon 
\end{align*}
эквивалентны.

Упражнение 1.4.16. Описать язык, порождаемый грамматикой

\begin{align*}
S \; & {\to} \; F F , \\
F \; & {\to} \; a F b , \\
F \; & {\to} \; ab .
\end{align*}

Упражнение 1.4.17. Описать язык, порождаемый грамматикой

\begin{align*}
C \; & {\to} \; C c , \\
C \; & {\to} \; A , \\
A \; & {\to} \; a A b , \\
A \; & {\to} \; \varepsilon .
\end{align*}

Упражнение 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*}

Упражнение 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*}

Упражнение 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*}

Упражнение 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*}

Упражнение 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*}
и грамматика
\begin{align*}
S \; & {\to} \; a T b , \\
T \; & {\to} \; \varepsilon , \\
T \; & {\to} \; b , \\
T \; & {\to} \; S , \\
T \; & {\to} \; b S b S ?
\end{align*}

Упражнение 1.4.23. Эквивалентны ли грамматика

\begin{align*}
S \; & {\to} \; aD , \\
D \; & {\to} \; bba , \\
D \; & {\to} \; baDa , \\
D \; & {\to} \; aDaDa \\
\end{align*}
и грамматика
\begin{align*}
S \; & {\to} \; aaE , \\
S \; & {\to} \; abJ , \\
E \; & {\to} \; bJJ , \\
J \; & {\to} \; aaEa , \\
J \; & {\to} \; abJa , \\
J \; & {\to} \; ba ?
\end{align*}

< Лекция 1 || Лекция 2: 12345 || Лекция 3 >
Юлия Маковецкая
Юлия Маковецкая

Упражнение 2.1.25

Евгения Гунченко
Евгения Гунченко

Сдавала тест экстерном, результат получен 74 после принятия данного результата и соответственно оплаты курса, будет ли выдано удостоверение о повышении квалификации?