Удаление eps-правил из грамматики — различия между версиями
(→Доказательство корректности) |
(→Доказательство корректности) |
||
Строка 26: | Строка 26: | ||
<tex>\Rightarrow)</tex><br\> | <tex>\Rightarrow)</tex><br\> | ||
− | Пусть <tex>A \underset{G'}{\Rightarrow}^*w | + | Пусть <tex>A \underset{G'}{\Rightarrow}^*w</tex> и <tex>w \ne \varepsilon</tex>.<br/> |
Докажем индукцией по длине порождения, что <tex>A \underset{G}{\Rightarrow}^*w</tex>.<br/> | Докажем индукцией по длине порождения, что <tex>A \underset{G}{\Rightarrow}^*w</tex>.<br/> | ||
:'''Базис'''. Пусть <tex>A \underset{G'}{\Rightarrow}^*w</tex>.<br/> | :'''Базис'''. Пусть <tex>A \underset{G'}{\Rightarrow}^*w</tex>.<br/> | ||
Строка 42: | Строка 42: | ||
Докажем индукцией по длине порождения, что <tex>A \underset{G'}{\Rightarrow}^*w</tex>.<br/> | Докажем индукцией по длине порождения, что <tex>A \underset{G'}{\Rightarrow}^*w</tex>.<br/> | ||
Обозначим длину порождения за <tex>p</tex>.<br/> | Обозначим длину порождения за <tex>p</tex>.<br/> | ||
− | :'''Базис'''. <tex> | + | :'''Базис'''. Пусть <tex>A \underset{G}{\Rightarrow}^*w</tex>.<br/> |
<tex>A \rightarrow w</tex> является правилом в <tex>G</tex>. Поскольку <tex>w \ne \varepsilon</tex>, это же правило будет и в <tex>G'</tex>, поэтому <tex>A \underset{G'}{\Rightarrow}^*w</tex>. | <tex>A \rightarrow w</tex> является правилом в <tex>G</tex>. Поскольку <tex>w \ne \varepsilon</tex>, это же правило будет и в <tex>G'</tex>, поэтому <tex>A \underset{G'}{\Rightarrow}^*w</tex>. | ||
− | :'''Предположение'''. Пусть из <tex>A \underset{G}{\Rightarrow}^*w</tex> и <tex>w \ne \varepsilon следует, что A \underset{G'}{\Rightarrow}^*w </tex> | + | :'''Предположение'''. Пусть из <tex>A \underset{G}{\Rightarrow}^*w</tex> и <tex>w \ne \varepsilon</tex> следует, что <tex>A \underset{G'}{\Rightarrow}^*w </tex> менее, чем за <tex>n</tex> шагов.<br/> |
− | :'''Переход'''. | + | :'''Переход'''. <br/> |
Пусть в порождении <tex>n</tex> шагов, <tex>n > 1</tex>. Тогда оно имеет вид <tex>A\underset{G}{\Rightarrow}Y_1 Y_2...Y_m | Пусть в порождении <tex>n</tex> шагов, <tex>n > 1</tex>. Тогда оно имеет вид <tex>A\underset{G}{\Rightarrow}Y_1 Y_2...Y_m | ||
\underset{G}{\Rightarrow}^*w</tex>, где <tex>Y_i \in N \cup \Sigma </tex>. Цепочку <tex>w</tex> можно разбить на <tex>w_1 w_2...w_m</tex>, где <tex>Y_i \underset{G'}{\Rightarrow}^*w_i</tex>.<br/> | \underset{G}{\Rightarrow}^*w</tex>, где <tex>Y_i \in N \cup \Sigma </tex>. Цепочку <tex>w</tex> можно разбить на <tex>w_1 w_2...w_m</tex>, где <tex>Y_i \underset{G'}{\Rightarrow}^*w_i</tex>.<br/> | ||
Строка 54: | Строка 54: | ||
Ч.т.д. | Ч.т.д. | ||
− | Подставив <tex>S</tex> вместо <tex>A</tex> в утверждение (*), видим, что <tex>w \in L(G)</tex> для <tex>w \ne \varepsilon</tex> тогда и только тогда, когда <tex>w \in L(G')</tex>. | + | Подставив <tex>S</tex> вместо <tex>A</tex> в утверждение (*), видим, что <tex>w \in L(G)</tex> для <tex>w \ne \varepsilon</tex> тогда и только тогда, когда <tex>w \in L(G')</tex>. Так как после выполнения шага 5 алгоритма в <tex>G'</tex> могло добавиться только пустое слово <tex>\varepsilon</tex>, то язык, задаваемый КС грамматикой <tex>G'</tex>, совпадает с языком, задаваемым КС грамматикой <tex>G</tex>. |
}} | }} | ||
Версия 03:32, 6 декабря 2011
Содержание
Используемые определения
Определение: |
Правила вида | называются -правилами.
Определение: |
Нетерминал | называется -порождающим, если .
Алгоритм удаления ε-правил из грамматики
Вход: КС грамматика
Выход: КС грамматика без -правил (возможно правило , но в этом случае не встречается в правых частях правил). .
- Найти все . -порождаюшие нетерминалы
- Добавить все правила из в .
- Рассмотрим правила вида (*) , где — последовательности из терминалов и нетерминалов, — -порождающие нетерминалы. Добавить все возможные правила вида (*) в , в которых либо присутствует, либо отсутствует .
- Удалить все -правила из .
- Если в исходной грамматике выводилось пустое слово , то необходимо добавить новый нетерминал , сделать его стартовым, добавить правила .
Доказательство корректности
Теорема: |
Если грамматика была построена с помощью описанного выше алгоритма по грамматике , то . |
Доказательство: |
Сначала докажем, что если не выполнять шаг 5 алгоритма, то получится грамматика
В этом случае в
Пусть в порождении Ч.т.д.
является правилом в . Поскольку , это же правило будет и в , поэтому .
Пусть в порождении |
Алгоритм поиска ε-порождающих нетерминалов
Вход: КС грамматика
Выход: множество -порождающих нетерминалов.
- Пусть — множество -порождающих нетерминалов. Добавить все нетерминалы, из которых непосредственно можно вывести , в множество .
- Если найдено правило , для которого верно, что каждый — -порождающий нетерминал, то добавить в множество .
- Если на шаге 2 множество изменилось, то повторить шаг 2.
Теорема: |
Нетерминал является -порождающим тогда и только тогда, если выполнено одно из следующих условий:
|
Доказательство: |
Индукция по длине кратчайшего порождения .База. Переход. Пусть , то есть в грамматике имеется правило . Следовательно, — -порождающий нетерминал. за шагов. Тогда первый шаг порождения , где за менее, чем шагов. По индукционному предположению каждый нетерминал обнаруживается как -порождающий. Тогда нетерминал — -порождающий. |
Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — С. 273: ISBN 5-8459-0261-4 (рус.)