Удаление бесполезных символов из грамматики — различия между версиями
Bloof (обсуждение | вклад) |
Bloof (обсуждение | вклад) |
||
Строка 10: | Строка 10: | ||
# Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими. | # Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими. | ||
− | При удалении из грамматики непорождающих нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы по определению не могли встречаться в выводе | + | При удалении из грамматики непорождающих нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы по определению не могли встречаться в выводе какого-либо слова. |
{{Определение | {{Определение | ||
Строка 23: | Строка 23: | ||
# Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми. | # Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми. | ||
− | При удалении из грамматики недостижимых нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы недостижимы из стартового, то и в выводе | + | При удалении из грамматики недостижимых нетерминалов и правил, их содержащих, язык не изменится, так как поскольку эти нетерминалы недостижимы из стартового, то и в выводе какого-либо слова они встречаться не могли. |
{{Определение | {{Определение |
Версия 03:05, 9 ноября 2011
Определение: |
Символ | называется порождающим, если из него может быть выведена конечная терминальная цепочка. Иначе он называется непорождающим.
Очевидно, что если и только если все нетерминальные символы правой части являются порождающими, то порождающим является и символ, стоящий в левой части. Это позволяет обнаружить непорождающие нетерминалы с помощью следующей процедуры.
- Найти правила, не содержащие нетерминалов в правых частях. Составить множество нетерминалов, встречающихся в левых частях таких правил.
- Если найдено такое правило, что все нетерминалы, стоящие в его правой, части уже входят в множество, то добавить в множество нетерминалы, стоящие в его левой части.
- Если на шаге 2 множество изменилось, повторить шаг 2.
- Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими.
При удалении из грамматики непорождающих нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы по определению не могли встречаться в выводе какого-либо слова.
Определение: |
Нетерминал | называется достижимым в КС-грамматике , если существует порождение . Иначе он называется недостижимым.
Очевидно, что если нетерминал в левой части правила является достижимым, то и все нетерминалы правой части являются достижимыми. Найти недостижимые нетерминалы можно с помощью следующей процедуры.
- Возьмём множество, состоящее из единственного элемента: .
- Если найдено правило, в левой части которого стоит нетерминал, содержащийся в множестве, добавить в множество все нетерминалы из правой части.
- Если на шаге 2 множество изменилось, повторить шаг 2.
- Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми.
При удалении из грамматики недостижимых нетерминалов и правил, их содержащих, язык не изменится, так как поскольку эти нетерминалы недостижимы из стартового, то и в выводе какого-либо слова они встречаться не могли.
Определение: |
Нетерминал | называется полезным в КС-грамматике , если он может участвовать в выводе, то есть существует порождение вида . Иначе он называется бесполезным.
Теорема: |
Грамматика не содержит бесполезных нетерминалов грамматика не содержит ни недостижимых нетерминалов, ни непорождающих. |
Доказательство: |
Необходимость. Очевидно, т.к. недостижимые и непорождающие нетерминалы являются бесполезными. Достаточность. Рассмотрим любой нетерминал . Так как он достижим, существуют и , такие, что . Из того, что любой нетерминал является порождающим, следует, что из любой строки можно вывести строку из терминалов. Значит, существует : , и — не бесполезный. |
Алгоритм
Алгоритм удаления бесполезных нетерминалов из грамматики прост, как три рубля.
- Удалить из грамматики непорождающие нетерминалы и правила, в которых они встречаются.
- Удалить из грамматики недостижимые нетерминалы и правила, в которых они встречаются.
После сих действий в грамматике не будет бесполезных символов.
Корректность алгоритма
Корректность алгоритма вытекает из первой теоремы и следующей.
Теорема: |
Пусть - грамматика без непорождающих нетерминалов. Тогда после удаления недостижимых нетерминалов новые непорождающие не появятся. |
Доказательство: |
Допустим, что в грамматике появился непорождающий нетерминал | . Так как до удаления недостижимых нетерминалов существовал вывод из конечной цепочки терминалов, то удалилось какое-то одно или несколько правил из вывода. Возьмем первое удаленное правило . Оно могло удалиться только, если в присутствуют недостижимые символы. Но так как было выбрано первое удаленное правило из вывода, то — достижим, а, следовательно, и все символы из . Значит, это правило удалиться не могло.
Примечание:
Эти шаги нельзя менять местами. Рассмотрим следующую грамматику:
Если начать с проверки достижимости, то все символы грамматики оказываются достижимыми. Если затем удалить
как непорождающий символ, то останется грамматика с бесполезными символами и .Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)