Удаление бесполезных символов из грамматики — различия между версиями
Bloof (обсуждение | вклад) м |
Bloof (обсуждение | вклад) м |
||
Строка 29: | Строка 29: | ||
|id=th1 | |id=th1 | ||
|statement= | |statement= | ||
− | Грамматика <tex>\Gamma</tex> не содержит бесполезных нетерминалов <tex>\Leftrightarrow</tex> Грамматика <tex> | + | Грамматика <tex>\Gamma</tex> не содержит бесполезных нетерминалов <tex>\Leftrightarrow</tex> Грамматика <tex>\Gamma</tex> не содержит ни недостижимых нетерминалов, ни непорождающих. |
|proof= | |proof= | ||
''Необходимость.'' Очевидно, т.к. недостижимые и непорождающие нетерминалы являются бесполезными. | ''Необходимость.'' Очевидно, т.к. недостижимые и непорождающие нетерминалы являются бесполезными. |
Версия 06:35, 7 ноября 2011
Определение: |
Символ | называется порождающим, если из него может быть выведена конечная терминальная цепочка. Иначе он называется непорождающим.
Очевидно, что если и только если все нетерминальные символы правой части являются порождающими, то порождающим является и символ, стоящий в левой части. Это позволяет обнаружить непорождающие нетерминалы с помощью следующей процедуры.
- Найти правила, не содержащие нетерминалов в правых частях. Составить множество нетерминалов, встречающихся в левых частях таких правил.
- Если найдено такое правило, что все нетерминалы, стоящие в его правой, части уже входят в множество, то добавить в множество нетерминалы, стоящие в его левой части.
- Если на шаге 2 множество изменилось, повторить шаг 2.
- Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими.
Определение: |
Нетерминал | называется достижимым в КС-грамматике , если существует порождение . Иначе он называется недостижимым.
Очевидно, что если нетерминал в левой части правила является достижимым, то и все нетерминалы правой части являются достижимыми. Найти недостижимые нетерминалы можно с помощью следующей процедуры.
- Возьмём множество, состоящее из единственного элемента: .
- Если найдено правило, в левой части которого стоит нетерминал, содержащийся в множестве, добавить в множество все нетерминалы из правой части.
- Если на шаге 2 множество изменилось, повторить шаг 2.
- Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми.
Определение: |
Нетерминал | называется полезным в КС-грамматике , если он может участвовать в выводе, то есть существует порождение вида . Иначе он называется бесполезным.
Теорема: |
Грамматика не содержит бесполезных нетерминалов Грамматика не содержит ни недостижимых нетерминалов, ни непорождающих. |
Доказательство: |
Необходимость. Очевидно, т.к. недостижимые и непорождающие нетерминалы являются бесполезными. Достаточность. Рассмотрим любой нетерминал . Так как он достижим, существуют и , такие, что . Из того, что любой нетерминал является порождающим, следует, что из любой строки можно вывести строку из терминалов. Значит, существует : , и — не бесполезный. |
Теорема: |
Пусть — КС-грамматика, и . Пусть - грамматика, полученная с помощью следующих двух шагов:
1) Удаляются непорождающие символы и все продукции, содержащие один или несколько таких символов. Пусть — полученная в результате грамматика.2) Удаляются все символы, недостижимые из Тогда . не имеет бесполезных символов и . |
Доказательство: |
Пусть — оставшийся символ. Известно, что для некоторой цепочки из терминалов. Кроме того, каждый символ, использованный в этом порождении, достижим, поэтому .Поскольку не был удален на втором шаге, известно, что существует такие и , для которых . Кроме того, каждый символ, использованный в этом порождении, достижим, поэтому .Также известно, что каждый символ в цепочке достижим, поэтому каждый из них является порождающим в . Порождение некоторой терминальной цепочки, например, , содержит только символы, достижимые из , поскольку они достижимы из символов в цепочке . Таким образом, это порождение есть также порождение в , то есть .Итак, полезен в . Ввиду произвольности в можно заключить, что не имеет бесполезных символов. , так как при построении из символы и продукции только убирались. Докажем, что . Если , то . Каждый символ в этом порождении является как достижимым, так и порождающим, поэтому порождение в его также содержит. Таким образом, , и . |
Примечание:
Эти шаги нельзя менять местами. Рассмотрим следующую грамматику:
Если начать с проверки достижимости, то все символы грамматики оказываются достижимыми. Если затем удалить
как непорождающий символ, то останется грамматика с бесполезными символами и .Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)