Удаление eps-правил из грамматики — различия между версиями
|  (→Схема алгоритма удаления ε-правил из грамматики) |  (→Доказательство корректности алгоритма) | ||
| Строка 49: | Строка 49: | ||
| <tex>\Rightarrow)</tex><br\> | <tex>\Rightarrow)</tex><br\> | ||
| − | Пусть <tex>A \overset{*}{\underset{G'}{\Rightarrow}}w</tex>. Несомненно, <tex>w \ne \varepsilon</tex>, поскольку <tex>G'</tex> - грамматика без <tex>\varepsilon</tex>-правил  | + | Пусть <tex>A \overset{*}{\underset{G'}{\Rightarrow}}w</tex>. Несомненно, <tex>w \ne \varepsilon</tex>, поскольку <tex>G'</tex> - грамматика без <tex>\varepsilon</tex>-правил.<br/>Докажем индукцией по длине порождения, что <tex>A \overset{*}{\underset{G}{\Rightarrow}}w</tex>.<br/>   | 
| Обозначим длину порождения за <tex>p</tex>. | Обозначим длину порождения за <tex>p</tex>. | ||
| :'''Базис'''. <tex>p = 1</tex><br/> | :'''Базис'''. <tex>p = 1</tex><br/> | ||
| − | В этом случае в <tex>G'</tex> есть правило <tex>A \rightarrow w</tex>. Согласно конструкции <tex>G'</tex> в <tex>G</tex> есть правило <tex>A \rightarrow \alpha</tex>, причем <tex>\alpha-</tex> это <tex>w</tex>, символы которой, возможно, перемежаются <tex>\varepsilon-</tex> порождающими  | + | В этом случае в <tex>G'</tex> есть правило <tex>A \rightarrow w</tex>. Согласно конструкции <tex>G'</tex> в <tex>G</tex> есть правило <tex>A \rightarrow \alpha</tex>, причем <tex>\alpha-</tex> это <tex>w</tex>, символы которой, возможно, перемежаются <tex>\varepsilon-</tex> порождающими нетерминалами. Тогда в <tex>G</tex> есть порождения <tex>A \underset{G}{\Rightarrow} \alpha \overset{*}{\underset{G}{\Rightarrow}}w</tex>, где на шагах после первого, из всех нетерминалов в цепочке <tex>\alpha</tex> выводиться <tex>\varepsilon</tex>.<br/> | 
| :'''Предположение'''. Пусть из <tex>A \overset{*}{\underset{G'}{\Rightarrow}}w</tex> следует, что <tex>A \overset{*}{\underset{G}{\Rightarrow}}w</tex> и <tex>w \ne \varepsilon</tex> верно для <tex>p < n</tex>.<br/> | :'''Предположение'''. Пусть из <tex>A \overset{*}{\underset{G'}{\Rightarrow}}w</tex> следует, что <tex>A \overset{*}{\underset{G}{\Rightarrow}}w</tex> и <tex>w \ne \varepsilon</tex> верно для <tex>p < n</tex>.<br/> | ||
| :'''Переход'''. <tex>p = n</tex><br/> | :'''Переход'''. <tex>p = n</tex><br/> | ||
| Пусть в порождении <tex>n</tex> шагов, <tex>n > 1</tex>. Тогда оно имеет вид <tex>A\underset{G'}{\Rightarrow}X_1 X_2...X_k | Пусть в порождении <tex>n</tex> шагов, <tex>n > 1</tex>. Тогда оно имеет вид <tex>A\underset{G'}{\Rightarrow}X_1 X_2...X_k | ||
| − | \overset{*}{\underset{G'}{\Rightarrow}}w</tex>, где <tex>X_i \in N \cup \Sigma </tex>. Первое использованное правило должно быть построено по правилу <tex>A \rightarrow Y_1 Y_2...Y_m</tex>, где цепочка <tex>Y_1 Y_2...Y_m</tex> совпадает с цепочкой <tex>X_1 X_2...X_k</tex>, цепочка <tex>Y_1 Y_2...Y_m</tex>, возможно, перемежаются <tex>\varepsilon-</tex> порождающими  | + | \overset{*}{\underset{G'}{\Rightarrow}}w</tex>, где <tex>X_i \in N \cup \Sigma </tex>. Первое использованное правило должно быть построено по правилу <tex>A \rightarrow Y_1 Y_2...Y_m</tex>, где цепочка <tex>Y_1 Y_2...Y_m</tex> совпадает с цепочкой <tex>X_1 X_2...X_k</tex>, цепочка <tex>Y_1 Y_2...Y_m</tex>, возможно, перемежаются <tex>\varepsilon-</tex> порождающими нетерминалами.<br/> | 
| − | Цепочку <tex>w</tex> можно разбить на <tex>w_1 w_2...w_k</tex>, где <tex>X_i \overset{*}{\underset{G'}{\Rightarrow}}w_i</tex>. Если <tex>X_i</tex> есть терминал, то <tex>w = X_i</tex>, a если  | + | Цепочку <tex>w</tex> можно разбить на <tex>w_1 w_2...w_k</tex>, где <tex>X_i \overset{*}{\underset{G'}{\Rightarrow}}w_i</tex>. Если <tex>X_i</tex> есть терминал, то <tex>w = X_i</tex>, a если нетерминал, то порождение <tex>X_i \overset{*}{\underset{G'}{\Rightarrow}}w_i</tex> содержит менее <tex>n</tex> шагов.<br/> По предположению <tex>X_i \overset{*}{\underset{G}{\Rightarrow}}w_i</tex>.<br/> | 
| Теперь построим соответствующее порождение в <tex>G</tex>.<br/> | Теперь построим соответствующее порождение в <tex>G</tex>.<br/> | ||
| :<tex>A \underset {G}{\Rightarrow} Y_1 Y_2...Y_m \overset{*}{\underset{G}{\Rightarrow}} X_1 X_2...X_k \overset{*}{\underset{G}{\Rightarrow}} w_1 w_2...w_k = w</tex><br/> | :<tex>A \underset {G}{\Rightarrow} Y_1 Y_2...Y_m \overset{*}{\underset{G}{\Rightarrow}} X_1 X_2...X_k \overset{*}{\underset{G}{\Rightarrow}} w_1 w_2...w_k = w</tex><br/> | ||
Версия 19:23, 16 ноября 2011
Содержание
Основные определения
| Определение: | 
| Правила вида называются -правилами. | 
| Определение: | 
| Назовем КС грамматику   грамматикой без -правил (или неукорачивающей), если либо 
 | 
| Определение: | 
| Нетерминал называется -порождающим, если . | 
Алгоритм удаления ε-правил из грамматики
Поиск ε-порождающих нетерминалов
Схема алгоритма:
- 1) Если — правило грамматики , то — -порождающий нетерминал.
- 2) Если — правило грамматики , где каждый — -порождающий нетерминал, то — -порождающий нетерминал.
| Теорема: | 
| Нетерминал  является -порождающим тогда и только тогда, когда вышеприведенный алгоритм идентифицирует  как -порождающий. | 
| Доказательство: | 
| Индукция по длине кратчайшего порождения 
 
 | 
Схема алгоритма удаления ε-правил из грамматики
Вход. КС грамматика .
Выход. КС грамматика .
Схема алгоритма:
- 1) Найти все -порождаюшие нетерминалы.
- 2) Удалить все -правила из .
- 3) Рассмотрим правила вида (*) , где — последовательности из терминалов и нетерминалов, — -порождающие нетерминалы. Добавить все возможные правила вида (*), в которых либо присутствует, либо отсутствует , кроме правила . Такое правило может возникнуть, если все .
Замечание
Если в исходной грамматике есть правило и встречается в правых частях, то для того, чтобы получить эквивалентную грамматику без -правил, необходимо после применения описанного выше алгоритма добавить новый нетерминал , сделать его стартовым, добавить правила .
Доказательство корректности алгоритма
| Теорема: | 
| Если грамматика  была построена с помощью описанного выше алгоритма по грамматике , то . | 
| Доказательство: | 
| Для этого достаточно доказать, что тогда и только тогда, когда и (*). <br\>
Пусть . Несомненно, , поскольку  - грамматика без -правил. 
 В этом случае в  есть правило . Согласно конструкции  в  есть правило , причем  это , символы которой, возможно, перемежаются  порождающими нетерминалами. Тогда в  есть порождения , где на шагах после первого, из всех нетерминалов в цепочке  выводиться . 
 Пусть в порождении  шагов, . Тогда оно имеет вид , где . Первое использованное правило должно быть построено по правилу , где цепочка  совпадает с цепочкой , цепочка , возможно, перемежаются  порождающими нетерминалами. Ч.т.д. 
 является правилом в . Поскольку , эта же правило будет и в , поэтому . 
 Пусть в порождении  шагов, . Тогда оно имеет вид , где . Цепочку  можно разбить на , где . | 
Литература
- Хопкрофт Дж., Мотвани Р., Ульман Д.. Введение в теорию автоматов, языков и вычислений, 2-е изд.. : Пер. с англ. ‒ М. : Издательский дом "Вильямс", 2002. ‒ 528 с.
