Удаление бесполезных символов из грамматики — различия между версиями
Kirelagin (обсуждение | вклад) м |
Bloof (обсуждение | вклад) |
||
Строка 9: | Строка 9: | ||
# Если на шаге 2 множество изменилось, повторить шаг 2. | # Если на шаге 2 множество изменилось, повторить шаг 2. | ||
# Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими. | # Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими. | ||
+ | |||
+ | При удалении из грамматики непорождающих нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы по определению не могли встречаться в выводе любого слова. | ||
{{Определение | {{Определение | ||
Строка 20: | Строка 22: | ||
# Если на шаге 2 множество изменилось, повторить шаг 2. | # Если на шаге 2 множество изменилось, повторить шаг 2. | ||
# Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми. | # Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми. | ||
+ | |||
+ | При удалении из грамматики недостижимых нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы недостижимы из стартового, то и в выводе любого слова они встречаться не могли. | ||
{{Определение | {{Определение | ||
Строка 36: | Строка 40: | ||
}} | }} | ||
+ | ==Алгоритм== | ||
+ | Алгоритм удаления бесполезных нетерминалов из грамматики прост, как три рубля. | ||
+ | # Удалить из грамматики непорождающие нетерминалы и правила, в которых они встречаются. | ||
+ | # Удалить из грамматики недостижимые нетерминалы и правила, в которых они встречаются. | ||
+ | После сих действий в грамматике не будет бесполезных символов. | ||
+ | |||
+ | ==Корректность алгоритма== | ||
+ | Корректность алгоритма вытекает из [[#th1|первой теоремы]] и следующей. | ||
{{Теорема | {{Теорема | ||
|id=th2 | |id=th2 | ||
|statement= | |statement= | ||
− | Пусть <tex>\Gamma</tex> | + | Пусть <tex>\Gamma</tex> - грамматика без непорождающих нетерминалов. Тогда после удаления недостижимых нетерминалов новые непорождающие не появятся. |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|proof= | |proof= | ||
− | + | Допустим, что в грамматике появился непорождающий нетерминал <tex>A</tex>. Так как до удаления недостижимых нетерминалов существовал вывод из <tex>A</tex> конечной цепочки терминалов, то удалилось какое-то одно или несколько правил из вывода. Возьмем первое удаленное правило <tex>C\rightarrow\alpha</tex>. Оно могло удалиться только, если в <tex>\alpha</tex> присутствуют недостижимые символы. Но так как было выбрано первое удаленное правило из вывода, то <tex>C</tex> — достижим, а, следовательно, и все символы из <tex>\alpha</tex>. Значит, это правило удалиться не могло. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
}} | }} | ||
Версия 03:02, 9 ноября 2011
Определение: |
Символ | называется порождающим, если из него может быть выведена конечная терминальная цепочка. Иначе он называется непорождающим.
Очевидно, что если и только если все нетерминальные символы правой части являются порождающими, то порождающим является и символ, стоящий в левой части. Это позволяет обнаружить непорождающие нетерминалы с помощью следующей процедуры.
- Найти правила, не содержащие нетерминалов в правых частях. Составить множество нетерминалов, встречающихся в левых частях таких правил.
- Если найдено такое правило, что все нетерминалы, стоящие в его правой, части уже входят в множество, то добавить в множество нетерминалы, стоящие в его левой части.
- Если на шаге 2 множество изменилось, повторить шаг 2.
- Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими.
При удалении из грамматики непорождающих нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы по определению не могли встречаться в выводе любого слова.
Определение: |
Нетерминал | называется достижимым в КС-грамматике , если существует порождение . Иначе он называется недостижимым.
Очевидно, что если нетерминал в левой части правила является достижимым, то и все нетерминалы правой части являются достижимыми. Найти недостижимые нетерминалы можно с помощью следующей процедуры.
- Возьмём множество, состоящее из единственного элемента: .
- Если найдено правило, в левой части которого стоит нетерминал, содержащийся в множестве, добавить в множество все нетерминалы из правой части.
- Если на шаге 2 множество изменилось, повторить шаг 2.
- Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми.
При удалении из грамматики недостижимых нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы недостижимы из стартового, то и в выводе любого слова они встречаться не могли.
Определение: |
Нетерминал | называется полезным в КС-грамматике , если он может участвовать в выводе, то есть существует порождение вида . Иначе он называется бесполезным.
Теорема: |
Грамматика не содержит бесполезных нетерминалов грамматика не содержит ни недостижимых нетерминалов, ни непорождающих. |
Доказательство: |
Необходимость. Очевидно, т.к. недостижимые и непорождающие нетерминалы являются бесполезными. Достаточность. Рассмотрим любой нетерминал . Так как он достижим, существуют и , такие, что . Из того, что любой нетерминал является порождающим, следует, что из любой строки можно вывести строку из терминалов. Значит, существует : , и — не бесполезный. |
Алгоритм
Алгоритм удаления бесполезных нетерминалов из грамматики прост, как три рубля.
- Удалить из грамматики непорождающие нетерминалы и правила, в которых они встречаются.
- Удалить из грамматики недостижимые нетерминалы и правила, в которых они встречаются.
После сих действий в грамматике не будет бесполезных символов.
Корректность алгоритма
Корректность алгоритма вытекает из первой теоремы и следующей.
Теорема: |
Пусть - грамматика без непорождающих нетерминалов. Тогда после удаления недостижимых нетерминалов новые непорождающие не появятся. |
Доказательство: |
Допустим, что в грамматике появился непорождающий нетерминал | . Так как до удаления недостижимых нетерминалов существовал вывод из конечной цепочки терминалов, то удалилось какое-то одно или несколько правил из вывода. Возьмем первое удаленное правило . Оно могло удалиться только, если в присутствуют недостижимые символы. Но так как было выбрано первое удаленное правило из вывода, то — достижим, а, следовательно, и все символы из . Значит, это правило удалиться не могло.
Примечание:
Эти шаги нельзя менять местами. Рассмотрим следующую грамматику:
Если начать с проверки достижимости, то все символы грамматики оказываются достижимыми. Если затем удалить
как непорождающий символ, то останется грамматика с бесполезными символами и .Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)