Удаление бесполезных символов из грамматики — различия между версиями
Bloof (обсуждение | вклад) |
Kirelagin (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
+ | == Порождающие и непорождающие нетерминалы == | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | + | Нетерминал <tex>A</tex> называется '''порождающим''', если из него может быть выведена конечная терминальная цепочка. Иначе он называется '''непорождающим'''. | |
}} | }} | ||
Строка 10: | Строка 11: | ||
# Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими. | # Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими. | ||
− | |||
+ | {{Лемма | ||
+ | |statement= | ||
+ | После удаления из грамматики правил, содержащих непорождающие нетерминалы, язык не изменится. | ||
+ | |proof= | ||
+ | Непорождающие нетерминалы по определению не могли участвовать в выводе какого-либо слова. | ||
+ | }} | ||
+ | |||
+ | |||
+ | == Достижимые и недостижимые нетерминалы == | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
Строка 23: | Строка 32: | ||
# Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми. | # Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми. | ||
− | |||
+ | {{Лемма | ||
+ | |statement= | ||
+ | После удаления из грамматики правил, содержащих недостижимые нетерминалы, язык не изменится. | ||
+ | |proof= | ||
+ | Недостижимые нетерминалы по определению не достижимы из стартового, следовательно они не могли участвовать в выводе какого-либо слова. | ||
+ | }} | ||
+ | |||
+ | |||
+ | == Полезные и бесполезные нетерминалы == | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
Строка 40: | Строка 57: | ||
}} | }} | ||
− | |||
− | |||
− | |||
− | |||
− | + | == Алгоритм удаления бесполезных нетерминалов == | |
+ | # Удалить из грамматики правила, содержащие непорождающие нетерминалы. | ||
+ | # Удалить из грамматики правила, содержащие недостижимые нетерминалы. | ||
+ | |||
− | |||
− | |||
{{Теорема | {{Теорема | ||
|id=th2 | |id=th2 | ||
|statement= | |statement= | ||
− | + | Алгоритм корректен. | |
|proof= | |proof= | ||
− | Допустим, что в грамматике появился непорождающий нетерминал <tex>A</tex>. Так как до удаления недостижимых нетерминалов существовал вывод из <tex>A</tex> конечной цепочки терминалов, то | + | Достаточность данных действий следует из доказанной выше теоремы. |
+ | |||
+ | Докажем, что после выполнения второго шага не могут появиться новые непорождающие нетерминалы. | ||
+ | Допустим, что в грамматике появился непорождающий нетерминал <tex>A</tex>. Так как до удаления недостижимых нетерминалов существовал вывод из <tex>A</tex> конечной цепочки терминалов, то было удалено хотя бы какое-то одно правило из этого вывода. Возьмем первое удалённое правило <tex>B\rightarrow\alpha</tex>. Оно могло быть удалено только в том случае, если в <tex>\alpha</tex> присутствуют недостижимые нетерминалы. Но так как было выбрано первое удалённое правило из вывода, то <tex>B</tex> — достижим, следовательно достижимы и все нетерминалы из <tex>\alpha</tex>. Значит, это правило не могло быть удалено. | ||
}} | }} | ||
− | |||
− | |||
Эти шаги нельзя менять местами. Рассмотрим следующую грамматику: | Эти шаги нельзя менять местами. Рассмотрим следующую грамматику: | ||
− | + | <tex> | |
− | <tex>S\rightarrow AB|a | + | \begin{array}{l l} |
− | + | S\rightarrow AB|a \\ | |
− | + | A\rightarrow b | |
− | + | \end{array}. | |
− | + | </tex> | |
+ | Все нетерминалы в этой грамматике достижимы. Однако, если удалить <tex>B</tex> как непорождающий, то нетерминал <tex>A</tex> станет недостижимым. | ||
== Литература == | == Литература == | ||
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.) | * ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.) |
Версия 04:49, 9 ноября 2011
Содержание
Порождающие и непорождающие нетерминалы
Определение: |
Нетерминал | называется порождающим, если из него может быть выведена конечная терминальная цепочка. Иначе он называется непорождающим.
Очевидно, что если и только если все нетерминальные символы правой части являются порождающими, то порождающим является и символ, стоящий в левой части. Это позволяет обнаружить непорождающие нетерминалы с помощью следующей процедуры.
- Найти правила, не содержащие нетерминалов в правых частях. Составить множество нетерминалов, встречающихся в левых частях таких правил.
- Если найдено такое правило, что все нетерминалы, стоящие в его правой, части уже входят в множество, то добавить в множество нетерминалы, стоящие в его левой части.
- Если на шаге 2 множество изменилось, повторить шаг 2.
- Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими.
Лемма: |
После удаления из грамматики правил, содержащих непорождающие нетерминалы, язык не изменится. |
Доказательство: |
Непорождающие нетерминалы по определению не могли участвовать в выводе какого-либо слова. |
Достижимые и недостижимые нетерминалы
Определение: |
Нетерминал | называется достижимым в КС-грамматике , если существует порождение . Иначе он называется недостижимым.
Очевидно, что если нетерминал в левой части правила является достижимым, то и все нетерминалы правой части являются достижимыми. Найти недостижимые нетерминалы можно с помощью следующей процедуры.
- Возьмём множество, состоящее из единственного элемента: .
- Если найдено правило, в левой части которого стоит нетерминал, содержащийся в множестве, добавить в множество все нетерминалы из правой части.
- Если на шаге 2 множество изменилось, повторить шаг 2.
- Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми.
Лемма: |
После удаления из грамматики правил, содержащих недостижимые нетерминалы, язык не изменится. |
Доказательство: |
Недостижимые нетерминалы по определению не достижимы из стартового, следовательно они не могли участвовать в выводе какого-либо слова. |
Полезные и бесполезные нетерминалы
Определение: |
Нетерминал | называется полезным в КС-грамматике , если он может участвовать в выводе, то есть существует порождение вида . Иначе он называется бесполезным.
Теорема: |
Грамматика не содержит бесполезных нетерминалов грамматика не содержит ни недостижимых нетерминалов, ни непорождающих. |
Доказательство: |
Необходимость. Очевидно, т.к. недостижимые и непорождающие нетерминалы являются бесполезными. Достаточность. Рассмотрим любой нетерминал . Так как он достижим, существуют и , такие, что . Из того, что любой нетерминал является порождающим, следует, что из любой строки можно вывести строку из терминалов. Значит, существует : , и — не бесполезный. |
Алгоритм удаления бесполезных нетерминалов
- Удалить из грамматики правила, содержащие непорождающие нетерминалы.
- Удалить из грамматики правила, содержащие недостижимые нетерминалы.
Теорема: |
Алгоритм корректен. |
Доказательство: |
Достаточность данных действий следует из доказанной выше теоремы. Докажем, что после выполнения второго шага не могут появиться новые непорождающие нетерминалы. Допустим, что в грамматике появился непорождающий нетерминал . Так как до удаления недостижимых нетерминалов существовал вывод из конечной цепочки терминалов, то было удалено хотя бы какое-то одно правило из этого вывода. Возьмем первое удалённое правило . Оно могло быть удалено только в том случае, если в присутствуют недостижимые нетерминалы. Но так как было выбрано первое удалённое правило из вывода, то — достижим, следовательно достижимы и все нетерминалы из . Значит, это правило не могло быть удалено. |
Эти шаги нельзя менять местами. Рассмотрим следующую грамматику:
Все нетерминалы в этой грамматике достижимы. Однако, если удалить как непорождающий, то нетерминал станет недостижимым.Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)