Нормальная форма Куроды — различия между версиями
м (rollbackEdits.php mass rollback)  | 
				|||
| (не показано 12 промежуточных версий 5 участников) | |||
| Строка 10: | Строка 10: | ||
{{Определение  | {{Определение  | ||
|definition=Грамматика представлена в '''нормальной форме Пенттонена''' (англ. ''Penttonen normal form''), если каждое правило имеет одну из трех форм:  | |definition=Грамматика представлена в '''нормальной форме Пенттонена''' (англ. ''Penttonen normal form''), если каждое правило имеет одну из трех форм:  | ||
| − | # <tex>AB \rightarrow   | + | # <tex>AB \rightarrow AC</tex>  | 
# <tex>A \rightarrow BC</tex>  | # <tex>A \rightarrow BC</tex>  | ||
# <tex>A \rightarrow a</tex> или <tex>A \rightarrow \varepsilon</tex>  | # <tex>A \rightarrow a</tex> или <tex>A \rightarrow \varepsilon</tex>  | ||
| Строка 17: | Строка 17: | ||
Также грамматику Пенттонена называют односторонней нормальной формой (англ. ''one-sided normal form''). Как можно заметить, она является частным случаем нормальной формы Куроды: когда <tex>A = C</tex> в первом правиле определения.  | Также грамматику Пенттонена называют односторонней нормальной формой (англ. ''one-sided normal form''). Как можно заметить, она является частным случаем нормальной формы Куроды: когда <tex>A = C</tex> в первом правиле определения.  | ||
| − | Для каждой контестно-зависимой грамматики существует слабо эквивалентная ей грамматика в форме Пенттонена.    | + | Для каждой контестно-зависимой грамматики существует слабо эквивалентная ей грамматика в форме Пенттонена.  | 
{{Лемма  | {{Лемма  | ||
|about=об удалении терминалов  | |about=об удалении терминалов  | ||
| − | |statement = Для любой грамматики <tex>  | + | |statement = Для любой грамматики <tex> \Gamma = \langle \Sigma, N, S, P \rangle</tex> может быть построена грамматика <tex>\Gamma' = \langle \Sigma, N', S, P' \rangle</tex> такая, что:  | 
| − | * все правила в <tex>P'</tex> имеет вид <tex>\alpha \rightarrow \beta</tex> где <tex>\alpha \in (N')^+</tex> и <tex>\beta \in (N')^*</tex> или <tex>A \rightarrow a</tex>, где <tex>A \in N', a \in   | + | * все правила в <tex>P'</tex> имеет вид <tex>\alpha \rightarrow \beta</tex> где <tex>\alpha \in (N')^+</tex> и <tex>\beta \in (N')^*</tex> или <tex>A \rightarrow a</tex>, где <tex>A \in N', a \in \Sigma</tex>,  | 
| − | * <tex>L(  | + | * <tex>L(\Gamma') = L(\Gamma)</tex>  | 
| − | Кроме того, если   | + | Кроме того, если <tex>\Gamma</tex> контекстно-свободна или контекстно-зависима, то и <tex>\Gamma'</tex> будет соответственно контекстно-свободной или контекстно-зависимой.  | 
| − | |proof = Каждому терминалу <tex>a</tex> поставим в соотвествие новый символ <tex>a'</tex>, которого нет в <tex>N \cup   | + | |proof = Каждому терминалу <tex>a</tex> поставим в соотвествие новый символ <tex>a'</tex>, которого нет в <tex>N \cup \Sigma</tex>, такой что <tex>a' \neq b'</tex> для разных терминалов <tex>a</tex> и <tex>b</tex>.  | 
| − | Пусть <tex>N' = N \cup \{a'   | + | Пусть <tex>N' = N \cup \{a' \mid a \in \Sigma\}</tex>.  | 
| − | Пусть <tex>\alpha = x_1x_2  | + | Пусть <tex>\alpha = x_1x_2 \ldots x_n</tex> {{---}} часть правила, тогда <tex>\alpha' = y_1y_2 \ldots y_n</tex>, где    | 
<tex>  | <tex>  | ||
y_i = \left\{\begin{array}{llcl}  | y_i = \left\{\begin{array}{llcl}  | ||
x_i&;\ x_i \in N\\  | x_i&;\ x_i \in N\\  | ||
| − | x_i'&;\ x_i \in   | + | x_i'&;\ x_i \in \Sigma\\  | 
\end{array}\right.  | \end{array}\right.  | ||
</tex> для <tex>1 \leqslant i \leqslant n</tex>.  | </tex> для <tex>1 \leqslant i \leqslant n</tex>.  | ||
| − | Построим грамматику <tex>G' =   | + | Построим грамматику <tex>G' = \langle \Sigma, N', S, P' \rangle</tex>, где <tex>P' = \{\alpha' \rightarrow \beta' \mid \alpha \rightarrow \beta \in P\} \cup \{a' \rightarrow a \mid a \in \Sigma\}</tex>.  | 
| − | Покажем, что <tex>L(  | + | Покажем, что <tex>L(\Gamma') = L(\Gamma)</tex>.  | 
| − | Пусть <tex>w \in L(  | + | Пусть <tex>w \in L(\Gamma)</tex>. Тогда в <tex>\Gamma</tex> существует вывод <tex>S = w_0 \Rightarrow w_1 \Rightarrow \ldots \Rightarrow w_n \Rightarrow w</tex>.    | 
| − | Согласно конструкции <tex>P'</tex>, в <tex>  | + | Согласно конструкции <tex>P'</tex>, в <tex>\Gamma'</tex> существует вывод <tex>S = w_0' \Rightarrow w_1' \Rightarrow w_2' \Rightarrow \ldots \Rightarrow w_n' = v_0 \Rightarrow v_1 \Rightarrow v_2 \Rightarrow \ldots \Rightarrow v_m = w</tex>.  | 
Для <tex>0 \leqslant i \leqslant n - 1</tex> в переходах <tex>w_i' \Rightarrow w_{i + 1}'</tex> используем правило <tex>\alpha' \rightarrow \beta'</tex>, так как правило <tex>\alpha \rightarrow \beta</tex> было использовано при выводе <tex>w_i \Rightarrow w_{i + 1}</tex>.  | Для <tex>0 \leqslant i \leqslant n - 1</tex> в переходах <tex>w_i' \Rightarrow w_{i + 1}'</tex> используем правило <tex>\alpha' \rightarrow \beta'</tex>, так как правило <tex>\alpha \rightarrow \beta</tex> было использовано при выводе <tex>w_i \Rightarrow w_{i + 1}</tex>.  | ||
| Строка 50: | Строка 50: | ||
Для <tex>0 \leqslant j \leqslant m - 1</tex> в переходах <tex>v_j \Rightarrow v_{j + 1}</tex> используем правила вида <tex>a' \rightarrow a</tex>.  | Для <tex>0 \leqslant j \leqslant m - 1</tex> в переходах <tex>v_j \Rightarrow v_{j + 1}</tex> используем правила вида <tex>a' \rightarrow a</tex>.  | ||
| − | Заменяем разрешенные в <tex>w'</tex> символы на новые и получаем, что <tex>w \in L(  | + | Заменяем разрешенные в <tex>w'</tex> символы на новые и получаем, что <tex>w \in L(\Gamma')</tex>.  | 
| − | Тогда <tex>L(  | + | Тогда <tex>L(\Gamma) \subseteq L(\Gamma')</tex>.  | 
| − | Пусть <tex>x \in L(  | + | Пусть <tex>x \in L(\Gamma')</tex>. Тогда в <tex>\Gamma'</tex> существует вывод <tex>S \Rightarrow^* x</tex>. Мы можем поменять порядок применения правил в этом выводе: сначала применяем только правила вида <tex>\alpha' \rightarrow \beta'</tex>, а потом только правила вида <tex>a' \rightarrow a</tex>.    | 
Из построения: после применения правила вида <tex>a' \rightarrow a</tex> полученное <tex>a</tex> не может быть использовано при применении правил из <tex>P'</tex>.    | Из построения: после применения правила вида <tex>a' \rightarrow a</tex> полученное <tex>a</tex> не может быть использовано при применении правил из <tex>P'</tex>.    | ||
| − | Изменение порядка вывода не меняет язык, то есть в <tex>  | + | Изменение порядка вывода не меняет язык, то есть в <tex>\Gamma'</tex> существует вывод: <tex>S = x_0' \Rightarrow x_1' \Rightarrow \ldots \Rightarrow x_r' \Rightarrow x' \Rightarrow y_1 \Rightarrow y_2 \Rightarrow \ldots \Rightarrow y_s = x</tex>, где для <tex>0 \leqslant i \leqslant r - 1 \ x_{i + 1}' \in (N')^*</tex> и в переходе <tex>x_i' \rightarrow x_{i + 1}'</tex> было использовано правило вывода <tex>\alpha' \rightarrow \beta'</tex> и для <tex>1 \leqslant j \leqslant s</tex> было использовано правило <tex>a' \rightarrow a</tex>, чтобы получить <tex>y_j \rightarrow y_{j + 1}</tex>.  | 
| − | Получаем вывод в <tex>  | + | Получаем вывод в <tex>\Gamma</tex>: <tex>S = x_0 \Rightarrow x_1 \Rightarrow \ldots \Rightarrow x_n = x</tex>.  | 
| − | Тогда <tex>L(  | + | Тогда <tex>L(\Gamma') \subseteq L(\Gamma)</tex>.  | 
| − | Таким образом, <tex>L(  | + | Таким образом, <tex>L(\Gamma') = L(\Gamma)</tex>.  | 
Очевидно, что если грамматика была неукорочивающейся, то она такой и останется.  | Очевидно, что если грамматика была неукорочивающейся, то она такой и останется.  | ||
}}  | }}  | ||
{{Лемма  | {{Лемма  | ||
| − | |about=об удалении   | + | |about=об удалении коротких правил  | 
| − | |statement= Для любой грамматики <tex>  | + | |statement= Для любой грамматики <tex>\Gamma = \langle \Sigma, N, S, P \rangle</tex> может быть построена грамматика  <tex>\Gamma' = \langle \Sigma, N', S, P' \rangle</tex> такая, что:  | 
* любое правило из <tex>P'</tex> имеет вид: <tex>\alpha \rightarrow \beta</tex>, где <tex>\alpha \in (N')^+</tex> и <tex>\beta \in (N')^+</tex> и <tex>|\alpha| \leqslant |\beta|</tex>, или <tex>A \rightarrow a</tex>, или <tex>A \rightarrow \varepsilon</tex>, где <tex>A \in N'</tex> и <tex>a \in T</tex>  | * любое правило из <tex>P'</tex> имеет вид: <tex>\alpha \rightarrow \beta</tex>, где <tex>\alpha \in (N')^+</tex> и <tex>\beta \in (N')^+</tex> и <tex>|\alpha| \leqslant |\beta|</tex>, или <tex>A \rightarrow a</tex>, или <tex>A \rightarrow \varepsilon</tex>, где <tex>A \in N'</tex> и <tex>a \in T</tex>  | ||
| − | * <tex>L(  | + | * <tex>L(\Gamma') = L(\Gamma)</tex>  | 
|proof=  | |proof=  | ||
| − | Сначала по <tex>  | + | Сначала по <tex>\Gamma</tex> построим грамматику <tex>\Gamma'' = \langle \Sigma, N'', S, P'' \rangle</tex>, как в доказательстве леммы 1. По <tex>\Gamma''</tex> построим грамматику <tex>\Gamma'</tex>, в которой:  | 
* <tex>N' = N'' \cup \{D\}</tex>, где <tex>D</tex> {{---}} новый символ,  | * <tex>N' = N'' \cup \{D\}</tex>, где <tex>D</tex> {{---}} новый символ,  | ||
* <tex>P'</tex> получаем из <tex>P''</tex> заменой всех правил вида <tex>\alpha \rightarrow \beta \in P''</tex>, где <tex>|\alpha| > |\beta|</tex> на правила вида <tex>\alpha \rightarrow \beta D^{|\alpha| - |\beta|}</tex>, и добавлением правила <tex>D \rightarrow \varepsilon</tex>.  | * <tex>P'</tex> получаем из <tex>P''</tex> заменой всех правил вида <tex>\alpha \rightarrow \beta \in P''</tex>, где <tex>|\alpha| > |\beta|</tex> на правила вида <tex>\alpha \rightarrow \beta D^{|\alpha| - |\beta|}</tex>, и добавлением правила <tex>D \rightarrow \varepsilon</tex>.  | ||
| Строка 79: | Строка 79: | ||
Теперь все правила в <tex>P'</tex> имеет требуемую форму.    | Теперь все правила в <tex>P'</tex> имеет требуемую форму.    | ||
| − | Покажем, что <tex>L(  | + | Покажем, что <tex>L(\Gamma') = L(\Gamma)</tex>.  | 
| − | Заметим, что замена правила <tex>\alpha \rightarrow \beta</tex> на <tex>\alpha \rightarrow \beta D^{|\alpha| - |\beta|}</tex> не меняет язык грамматики, потому что   | + | Заметим, что замена правила <tex>\alpha \rightarrow \beta</tex> на <tex>\alpha \rightarrow \beta D^{|\alpha| - |\beta|}</tex> не меняет язык грамматики, потому что <tex>D</tex> переходит только в <tex>\varepsilon</tex>, а других правил для <tex>D</tex> нет.  | 
| − | Тогда получаем, что <tex>L(  | + | Тогда получаем, что <tex>L(\Gamma) \subseteq L(\Gamma')</tex>, аналогично обратные изменения не меняют язык, то есть <tex>L(\Gamma') \subseteq L(\Gamma)</tex>.  | 
}}  | }}  | ||
| Строка 93: | Строка 93: | ||
{{Лемма  | {{Лемма  | ||
|about=об уменьшении порядка грамматики  | |about=об уменьшении порядка грамматики  | ||
| − | |statement=  | + | |statement=  | 
| − | Для любой грамматики <tex>  | + | Для любой грамматики <tex>\Gamma = \langle \Sigma, N, S, P \rangle</tex> порядка <tex>n \geqslant 3</tex>, такой что: любое правило из <tex>P'</tex> имеет вид <tex>\alpha \rightarrow \beta</tex>, где <tex>\alpha \in (N')^+</tex> и <tex>\beta \in (N')^+</tex> и <tex>|\alpha| \leqslant |\beta|</tex> или <tex>A \rightarrow a</tex> или <tex>A \rightarrow \varepsilon</tex>, где <tex>A \in N'</tex> и <tex>a \in T</tex> может быть построена грамматика  <tex>\Gamma' = \langle \Sigma, N', S, P' \rangle</tex> порядка <tex>n - 1</tex> такая, что <tex>L(\Gamma') = L(\Gamma)</tex>.  | 
|proof=    | |proof=    | ||
Разделим <tex>P</tex> на три подмножества:  | Разделим <tex>P</tex> на три подмножества:  | ||
| − | <tex>P_1 = \{ \alpha \rightarrow \beta   | + | <tex>P_1 = \{ \alpha \rightarrow \beta \mid \alpha \rightarrow \beta \in P, |\alpha| \leqslant 2, |\beta| \leqslant 2 \}</tex>,  | 
| − | <tex>P_2 = \{ \alpha \rightarrow \beta   | + | <tex>P_2 = \{ \alpha \rightarrow \beta \mid \alpha \rightarrow \beta \in P, |\alpha| \geqslant 2, |\beta| \geqslant 3 \}</tex>,  | 
| − | <tex>P_3 = \{ \alpha \rightarrow \beta   | + | <tex>P_3 = \{ \alpha \rightarrow \beta \mid \alpha \rightarrow \beta \in P, |\alpha| = 1, |\beta| \geqslant 3 \}</tex>.  | 
Очевидно, что <tex>P = P_1 \cup P_2 \cup P_3</tex>.  | Очевидно, что <tex>P = P_1 \cup P_2 \cup P_3</tex>.  | ||
| − | Построим <tex>  | + | Построим <tex>\Gamma'</tex> следующим образом:  | 
* Если правило <tex>p \in P_2</tex>, то оно имеет вид <tex>AB\alpha' \rightarrow CDE\beta'</tex>, где <tex>\alpha' \in N^*</tex> и <tex>\beta' \in N^*</tex>.  | * Если правило <tex>p \in P_2</tex>, то оно имеет вид <tex>AB\alpha' \rightarrow CDE\beta'</tex>, где <tex>\alpha' \in N^*</tex> и <tex>\beta' \in N^*</tex>.  | ||
| Строка 115: | Строка 115: | ||
Полагаем <tex>N_p = \{B_p \}</tex>, <tex>P_p = \{A \rightarrow CB_p, B_p \rightarrow DE\beta'\}</tex>, где <tex>A_p, B_p</tex> {{---}} дополнительные символы.  | Полагаем <tex>N_p = \{B_p \}</tex>, <tex>P_p = \{A \rightarrow CB_p, B_p \rightarrow DE\beta'\}</tex>, где <tex>A_p, B_p</tex> {{---}} дополнительные символы.  | ||
| − | Тогда <tex>N' = N \  | + | Тогда <tex>N' = N \bigcup\limits_{p \in (P_2 \cup P_3)} N_p</tex>, <tex>P' = P_1 \bigcup\limits_{p \in (P_2 \cup P_3)} P_p</tex>.  | 
| − | Из построения очевидно, что <tex>  | + | Из построения очевидно, что <tex>\Gamma'</tex> имеет порядок <tex>n - 1</tex>.  | 
| − | Покажем, что <tex>L(  | + | Покажем, что <tex>L(\Gamma') = L(\Gamma)</tex>.  | 
| − | Сначала докажем, что <tex>L(  | + | Сначала докажем, что <tex>L(\Gamma) \subseteq L(\Gamma')</tex>. Это следует из того, что:  | 
* все правила из <tex>P_1</tex> применимы к обеим грамматикам,    | * все правила из <tex>P_1</tex> применимы к обеим грамматикам,    | ||
| − | * шаг вывода <tex>\gamma_1AB\alpha'\gamma_2 \Rightarrow \gamma_1CDE\beta'\gamma_2</tex>, благодаря правилу <tex>p = AB\alpha \rightarrow CDE\beta' \in P_2</tex> в <tex>  | + | * шаг вывода <tex>\gamma_1AB\alpha'\gamma_2 \Rightarrow \gamma_1CDE\beta'\gamma_2</tex>, благодаря правилу <tex>p = AB\alpha \rightarrow CDE\beta' \in P_2</tex> в <tex>\Gamma</tex>может быть использавано в <tex>\Gamma'</tex> с помощью трех шагов:  | 
<tex>\gamma_1AB\alpha'\gamma_2 \Rightarrow \gamma_1A_pB_p\alpha'\gamma_2 \Rightarrow \gamma_1CB_p\alpha'\gamma_2 \Rightarrow \gamma_1CDE\beta\gamma_2</tex>, с использованием правил из <tex>P_p</tex> и вывода <tex>\gamma_1A\gamma_2 \Rightarrow \gamma_1CDE\beta'\gamma_2</tex> на основе правила <tex>p = A\alpha \rightarrow CDE\beta' \in P_3</tex> в <tex>G</tex>, которое может быть применено в <tex>G'</tex> с помощью трех шагов вывода:  | <tex>\gamma_1AB\alpha'\gamma_2 \Rightarrow \gamma_1A_pB_p\alpha'\gamma_2 \Rightarrow \gamma_1CB_p\alpha'\gamma_2 \Rightarrow \gamma_1CDE\beta\gamma_2</tex>, с использованием правил из <tex>P_p</tex> и вывода <tex>\gamma_1A\gamma_2 \Rightarrow \gamma_1CDE\beta'\gamma_2</tex> на основе правила <tex>p = A\alpha \rightarrow CDE\beta' \in P_3</tex> в <tex>G</tex>, которое может быть применено в <tex>G'</tex> с помощью трех шагов вывода:  | ||
<tex>\gamma_1A\alpha1'\gamma_2 \Rightarrow \gamma_1A_pB_p\alpha'\gamma_2 \Rightarrow \gamma_1CB_p\alpha'\gamma_2 \Rightarrow \gamma_1CDE\beta\gamma_2</tex>.  | <tex>\gamma_1A\alpha1'\gamma_2 \Rightarrow \gamma_1A_pB_p\alpha'\gamma_2 \Rightarrow \gamma_1CB_p\alpha'\gamma_2 \Rightarrow \gamma_1CDE\beta\gamma_2</tex>.  | ||
| − | Таким образом, любой вывод в <tex>  | + | Таким образом, любой вывод в <tex>\Gamma</tex> может быть преобразован в вывод в <tex>\Gamma'</tex>.  | 
| − | Чтобы показать обратное включение, рассмотрим вывод <tex>w \in L(  | + | Чтобы показать обратное включение, рассмотрим вывод <tex>w \in L(\Gamma')</tex> в <tex>\Gamma'</tex>, который содержит применение правил вида <tex>AB \rightarrow A_pB_p</tex> для какого-то правила <tex>p = AB\alpha' \rightarrow CDE\beta' \in P_2</tex>. Заметим, что другие два правила из <tex>P_p</tex> могут быть применены только если правило <tex>AB \rightarrow A_pB_p</tex> было применено в этом выводе ранее.  | 
| − | Данный вывод имеет вид (1) : <tex>S \Rightarrow^* \gamma_1AB\alpha'\gamma_2 \Rightarrow \gamma_1A_pB_p\alpha'\gamma_2 \Rightarrow^q_1 \gamma_1'A_pB_p\alpha'\gamma_2' \Rightarrow \gamma_1'CB_p\alpha'\gamma_2' \Rightarrow^q_2 \gamma_1''B_p\alpha'\gamma_2'' \Rightarrow \gamma_1''DE\beta'\gamma_2'' \Rightarrow^* w \in T^*</tex>,  | + | Данный вывод имеет вид (1):  | 
| + | |||
| + | <tex>S \Rightarrow^* \gamma_1AB\alpha'\gamma_2 \Rightarrow \gamma_1A_pB_p\alpha'\gamma_2 \Rightarrow^{q_1} \gamma_1'A_pB_p\alpha'\gamma_2' \Rightarrow \gamma_1'CB_p\alpha'\gamma_2' \Rightarrow^{q_2} \gamma_1''B_p\alpha'\gamma_2'' \Rightarrow \gamma_1''DE\beta'\gamma_2'' \Rightarrow^* w \in T^*</tex>,  | ||
где <tex>q_1</tex> {{---}} последовательность правил, примененых после <tex>AB \rightarrow A_pB_p</tex> и до <tex>A_p \rightarrow C</tex>, которая осуществляет <tex>\gamma_1 \Rightarrow^* \gamma_1'</tex> и <tex>\gamma_2 \Rightarrow^* \gamma_2'</tex>,  | где <tex>q_1</tex> {{---}} последовательность правил, примененых после <tex>AB \rightarrow A_pB_p</tex> и до <tex>A_p \rightarrow C</tex>, которая осуществляет <tex>\gamma_1 \Rightarrow^* \gamma_1'</tex> и <tex>\gamma_2 \Rightarrow^* \gamma_2'</tex>,  | ||
| Строка 136: | Строка 138: | ||
где <tex>q_2</tex> {{---}} последовательность правил, осуществляющих <tex>\gamma_1'C \Rightarrow^* \gamma_1''</tex> и <tex>\gamma_2' \Rightarrow^* \gamma_2''</tex>.  | где <tex>q_2</tex> {{---}} последовательность правил, осуществляющих <tex>\gamma_1'C \Rightarrow^* \gamma_1''</tex> и <tex>\gamma_2' \Rightarrow^* \gamma_2''</tex>.  | ||
| − | Или вид (2) : <tex>S \Rightarrow^* \gamma_1AB\alpha'\gamma_2 \Rightarrow \gamma_1A_pB_p\alpha'\gamma_2 \Rightarrow^{q_1'} \gamma_1' A_p B_p \alpha' \gamma_2' \Rightarrow \gamma_1'A_pDE\beta'\alpha'\gamma_2' \Rightarrow^{q_2'} \gamma_1''A_p\gamma_2'' \Rightarrow \gamma_1''C\gamma_2'' \Rightarrow^* w \in T^*</tex>,  | + | Или вид (2):  | 
| + | |||
| + | <tex>S \Rightarrow^* \gamma_1AB\alpha'\gamma_2 \Rightarrow \gamma_1A_pB_p\alpha'\gamma_2 \Rightarrow^{q_1'} \gamma_1' A_p B_p \alpha' \gamma_2' \Rightarrow \gamma_1'A_pDE\beta'\alpha'\gamma_2' \Rightarrow^{q_2'} \gamma_1''A_p\gamma_2'' \Rightarrow \gamma_1''C\gamma_2'' \Rightarrow^* w \in T^*</tex>,  | ||
где <tex>q_1'</tex> {{---}} последовательность правил, которая осуществляет <tex>\gamma_1 \Rightarrow^* \gamma_1'</tex> и <tex>\gamma_2 \Rightarrow^* \gamma_2'</tex>,  | где <tex>q_1'</tex> {{---}} последовательность правил, которая осуществляет <tex>\gamma_1 \Rightarrow^* \gamma_1'</tex> и <tex>\gamma_2 \Rightarrow^* \gamma_2'</tex>,  | ||
| Строка 146: | Строка 150: | ||
Таким образом, для <tex>r \in P_2 \cup P_3</tex> мы можем заменить все применения <tex>P_r</tex> на <tex>r</tex>, то есть получаем вывод <tex>w</tex>, который состоит только из правил из <tex>P</tex>.    | Таким образом, для <tex>r \in P_2 \cup P_3</tex> мы можем заменить все применения <tex>P_r</tex> на <tex>r</tex>, то есть получаем вывод <tex>w</tex>, который состоит только из правил из <tex>P</tex>.    | ||
| − | Тогда <tex>w \in L(  | + | Тогда <tex>w \in L(\Gamma)</tex> и <tex>L(\Gamma') \subseteq L(\Gamma)</tex>.  | 
}}  | }}  | ||
{{Теорема  | {{Теорема  | ||
|statement=  | |statement=  | ||
| − | Любую грамматику <tex>  | + | Любую грамматику <tex>\Gamma</tex> можно преобразовать к грамматике <tex>\Gamma_K</tex> в нормальной форме Куроды так, что <tex>L(\Gamma) = L(\Gamma_K)</tex>.  | 
|proof=  | |proof=  | ||
| − | По лемме 1 построим из <tex>  | + | По лемме 1 построим из <tex>\Gamma</tex> грамматику <tex>\Gamma'</tex>, затем по лемме 2 построим из <tex>\Gamma'</tex> грамматику <tex>\Gamma''</tex>, Тогда <tex>\Gamma''</tex> удовлетворит требованиям леммы 3.  | 
| − | Пусть <tex>  | + | Пусть <tex>\Gamma''</tex> имеет порядок <tex>n</tex>.    | 
| − | Если <tex>n = 2</tex>, то <tex>  | + | Если <tex>n = 2</tex>, то <tex>\Gamma''</tex> в нормальной форме Куроды и <tex>\Gamma_K = \Gamma''</tex>.    | 
| − | Если <tex>n \geqslant 3</tex>, построим <tex>  | + | Если <tex>n \geqslant 3</tex>, построим <tex>\Gamma'''</tex> порядка <tex>n - 1</tex> из <tex>\Gamma''</tex> по лемме 3.  | 
| − | Понятно, что <tex>  | + | Понятно, что <tex>\Gamma'''</tex> удовлетворяет условиям леммы 3.    | 
| − | Будем повторять процесс, пока не получим грамматику порядка <tex>2</tex>, которую и примем за <tex>  | + | Будем повторять процесс, пока не получим грамматику порядка <tex>2</tex>, которую и примем за <tex>\Gamma_K</tex>.  | 
}}  | }}  | ||
| Строка 166: | Строка 170: | ||
* [[Приведение_грамматики_к_ослабленной_нормальной_форме_Грейбах|Приведение грамматики к ослабленной нормальной форме Грейбах]]  | * [[Приведение_грамматики_к_ослабленной_нормальной_форме_Грейбах|Приведение грамматики к ослабленной нормальной форме Грейбах]]  | ||
| − | == Источники ==  | + | == Источники информации ==  | 
* Alexander Meduna Automata and Languages: Theory and Applications  | * Alexander Meduna Automata and Languages: Theory and Applications  | ||
* [[wikipedia:Kuroda_normal_form | Wikipedia {{---}} Kuroda normal form]]  | * [[wikipedia:Kuroda_normal_form | Wikipedia {{---}} Kuroda normal form]]  | ||
| − | [[Категория: Теория формальных языков]]  | + | [[Категория: Теория формальных языков]] [[Категория: Контекстно-свободные грамматики ]] [[Категория: Нормальные формы КС-грамматик ]]  | 
Текущая версия на 19:29, 4 сентября 2022
| Определение: | 
Грамматика представлена в нормальной форме Куроды (англ.  Kuroda normal form), если каждое правило имеет одну из четырех форм:
  | 
| Определение: | 
Грамматика представлена в нормальной форме Пенттонена (англ. Penttonen normal form), если каждое правило имеет одну из трех форм:
  | 
Также грамматику Пенттонена называют односторонней нормальной формой (англ. one-sided normal form). Как можно заметить, она является частным случаем нормальной формы Куроды: когда  в первом правиле определения.
Для каждой контестно-зависимой грамматики существует слабо эквивалентная ей грамматика в форме Пенттонена.
| Лемма (об удалении терминалов): | 
Для любой грамматики  может быть построена грамматика  такая, что:
 
  | 
| Доказательство: | 
| 
 Каждому терминалу поставим в соотвествие новый символ , которого нет в , такой что для разных терминалов и . Пусть . Пусть — часть правила, тогда , где для . Построим грамматику , где . Покажем, что . Пусть . Тогда в существует вывод . Согласно конструкции , в существует вывод . Для в переходах используем правило , так как правило было использовано при выводе . Для в переходах используем правила вида . Заменяем разрешенные в символы на новые и получаем, что . Тогда . Пусть . Тогда в существует вывод . Мы можем поменять порядок применения правил в этом выводе: сначала применяем только правила вида , а потом только правила вида . Из построения: после применения правила вида полученное не может быть использовано при применении правил из . Изменение порядка вывода не меняет язык, то есть в существует вывод: , где для и в переходе было использовано правило вывода и для было использовано правило , чтобы получить . Получаем вывод в : . Тогда . Таким образом, . Очевидно, что если грамматика была неукорочивающейся, то она такой и останется. | 
| Лемма (об удалении коротких правил): | 
Для любой грамматики  может быть построена грамматика   такая, что:
 
  | 
| Доказательство: | 
| 
 Сначала по построим грамматику , как в доказательстве леммы 1. По построим грамматику , в которой: 
 Теперь все правила в имеет требуемую форму. Покажем, что . Заметим, что замена правила на не меняет язык грамматики, потому что переходит только в , а других правил для нет. Тогда получаем, что , аналогично обратные изменения не меняют язык, то есть . | 
| Определение: | 
| Грамматика имеет порядок , если и для любого ее правила . | 
| Лемма (об уменьшении порядка грамматики): | 
Для любой грамматики  порядка , такой что: любое правило из  имеет вид , где  и  и  или  или , где  и  может быть построена грамматика   порядка  такая, что .  | 
| Доказательство: | 
| 
 Разделим на три подмножества: , , . Очевидно, что . Построим следующим образом: 
 Полагаем , , где — дополнительные символы не из для разных правил и из . 
 Полагаем , , где — дополнительные символы. Тогда , . Из построения очевидно, что имеет порядок . Покажем, что . Сначала докажем, что . Это следует из того, что: 
 , с использованием правил из и вывода на основе правила в , которое может быть применено в с помощью трех шагов вывода: . Таким образом, любой вывод в может быть преобразован в вывод в . Чтобы показать обратное включение, рассмотрим вывод в , который содержит применение правил вида для какого-то правила . Заметим, что другие два правила из могут быть применены только если правило было применено в этом выводе ранее. Данный вывод имеет вид (1): , где — последовательность правил, примененых после и до , которая осуществляет и , где — последовательность правил, осуществляющих и . Или вид (2): , где — последовательность правил, которая осуществляет и , где — последовательность правил, осуществляющих и . Таким образом, существует вывод: , который получается из (1) заменой правил на применение . Аналогично, в случае (2) мы можем заменить применение на . Кроме того, это верно и для применения где . Таким образом, для мы можем заменить все применения на , то есть получаем вывод , который состоит только из правил из . Тогда и . | 
| Теорема: | 
Любую грамматику  можно преобразовать к грамматике  в нормальной форме Куроды так, что .  | 
| Доказательство: | 
| 
 По лемме 1 построим из грамматику , затем по лемме 2 построим из грамматику , Тогда удовлетворит требованиям леммы 3. Пусть имеет порядок . Если , то в нормальной форме Куроды и . Если , построим порядка из по лемме 3. Понятно, что удовлетворяет условиям леммы 3. Будем повторять процесс, пока не получим грамматику порядка , которую и примем за . | 
См. также
Источники информации
- Alexander Meduna Automata and Languages: Theory and Applications
 - Wikipedia — Kuroda normal form