Удаление бесполезных символов из грамматики — различия между версиями
Bloof (обсуждение | вклад) м |
Bloof (обсуждение | вклад) |
||
Строка 40: | Строка 40: | ||
|id=th2 | |id=th2 | ||
|statement= | |statement= | ||
− | Пусть <tex> | + | Пусть <tex>\Gamma</tex> {{---}} КС-грамматика, и <tex>L(\Gamma)\ne\varnothing</tex>. Пусть <tex>\Gamma_1</tex> - грамматика, полученная с помощью следующих двух шагов: |
− | 1) Удаляются непорождающие символы и все продукции, содержащие один или несколько таких символов. Пусть <tex> | + | 1) Удаляются непорождающие символы и все продукции, содержащие один или несколько таких символов. Пусть <tex>\Gamma_2</tex> {{---}} полученная в результате грамматика. |
− | 2) Удаляются все символы, недостижимые из <tex> | + | 2) Удаляются все символы, недостижимые из <tex>\Gamma_2</tex>. |
− | Тогда <tex> | + | Тогда <tex>\Gamma_1</tex> не имеет бесполезных символов и <tex>L(\Gamma_1)=L(\Gamma)</tex>. |
|proof= | |proof= | ||
− | Пусть <tex>X</tex> {{---}} оставшийся символ. Известно, что <tex>X\Rightarrow | + | Пусть <tex>X</tex> {{---}} оставшийся символ. Известно, что <tex>X\overset{*}{\underset{\Gamma}{\Rightarrow}} w</tex> для некоторой цепочки <tex>w</tex> из терминалов. Кроме того, каждый символ, использованный в этом порождении, достижим, поэтому <tex>S\overset{*}{\underset{\Gamma_2}{\Rightarrow}}w</tex>. |
− | Поскольку <tex>X</tex> не был удален на втором шаге, известно, что существует такие <tex>\alpha</tex> и <tex>\beta</tex>, для которых <tex>S\Rightarrow | + | Поскольку <tex>X</tex> не был удален на втором шаге, известно, что существует такие <tex>\alpha</tex> и <tex>\beta</tex>, для которых <tex>S\overset{*}{\underset{\Gamma_2}{\Rightarrow}} \alpha X\beta</tex>. Кроме того, каждый символ, использованный в этом порождении, достижим, поэтому <tex>S\overset{*}{\underset{\Gamma_1}{\Rightarrow}} \alpha X\beta</tex>. |
− | Также известно, что каждый символ в цепочке <tex>\alpha X\beta</tex> достижим, поэтому каждый из них является порождающим в <tex> | + | Также известно, что каждый символ в цепочке <tex>\alpha X\beta</tex> достижим, поэтому каждый из них является порождающим в <tex>\Gamma_2</tex>. Порождение некоторой терминальной цепочки, например, <tex>\alpha X\beta\overset{*}{\underset{\Gamma_2}{\Rightarrow}} xwy</tex>, содержит только символы, достижимые из <tex>S</tex>, поскольку они достижимы из символов в цепочке <tex>\alpha X\beta</tex>. Таким образом, это порождение есть также порождение в <tex>\Gamma_1</tex>, то есть <tex>S\overset{*}{\underset{\Gamma_1}{\Rightarrow}} \alpha X\beta\overset{*}{\underset{\Gamma_1}{\Rightarrow}} xwy</tex>. |
− | Итак, <tex>X</tex> полезен в <tex> | + | Итак, <tex>X</tex> полезен в <tex>\Gamma_1</tex>. Ввиду произвольности <tex>X</tex> в <tex>\Gamma_1</tex> можно заключить, что <tex>\Gamma_1</tex> не имеет бесполезных символов. |
− | <tex>L( | + | <tex>L(\Gamma_1)\subseteq L(\Gamma)</tex>, так как при построении <tex>\Gamma_1</tex> из <tex>\Gamma</tex> символы и продукции только убирались. Докажем, что <tex>L(\Gamma_1)\supseteq L(\Gamma)</tex>. Если <tex>w\in L(\Gamma)</tex>, то <tex>S\overset{*}{\underset{\Gamma}{\Rightarrow}} w</tex>. Каждый символ в этом порождении является как достижимым, так и порождающим, поэтому порождение в <tex>\Gamma_1</tex> его также содержит. Таким образом, <tex>S\overset{*}{\underset{\Gamma_1}{\Rightarrow}} w</tex>, <tex>w\in L(\Gamma_1)</tex> и <tex>L(\Gamma)=L(\Gamma_1)</tex>. |
}} | }} | ||
Версия 00:38, 8 ноября 2011
Определение: |
Символ | называется порождающим, если из него может быть выведена конечная терминальная цепочка. Иначе он называется непорождающим.
Очевидно, что если и только если все нетерминальные символы правой части являются порождающими, то порождающим является и символ, стоящий в левой части. Это позволяет обнаружить непорождающие нетерминалы с помощью следующей процедуры.
- Найти правила, не содержащие нетерминалов в правых частях. Составить множество нетерминалов, встречающихся в левых частях таких правил.
- Если найдено такое правило, что все нетерминалы, стоящие в его правой, части уже входят в множество, то добавить в множество нетерминалы, стоящие в его левой части.
- Если на шаге 2 множество изменилось, повторить шаг 2.
- Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими.
Определение: |
Нетерминал | называется достижимым в КС-грамматике , если существует порождение . Иначе он называется недостижимым.
Очевидно, что если нетерминал в левой части правила является достижимым, то и все нетерминалы правой части являются достижимыми. Найти недостижимые нетерминалы можно с помощью следующей процедуры.
- Возьмём множество, состоящее из единственного элемента: .
- Если найдено правило, в левой части которого стоит нетерминал, содержащийся в множестве, добавить в множество все нетерминалы из правой части.
- Если на шаге 2 множество изменилось, повторить шаг 2.
- Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми.
Определение: |
Нетерминал | называется полезным в КС-грамматике , если он может участвовать в выводе, то есть существует порождение вида . Иначе он называется бесполезным.
Теорема: |
Грамматика не содержит бесполезных нетерминалов Грамматика не содержит ни недостижимых нетерминалов, ни непорождающих. |
Доказательство: |
Необходимость. Очевидно, т.к. недостижимые и непорождающие нетерминалы являются бесполезными. Достаточность. Рассмотрим любой нетерминал . Так как он достижим, существуют и , такие, что . Из того, что любой нетерминал является порождающим, следует, что из любой строки можно вывести строку из терминалов. Значит, существует : , и — не бесполезный. |
Теорема: |
Пусть — КС-грамматика, и . Пусть - грамматика, полученная с помощью следующих двух шагов:
1) Удаляются непорождающие символы и все продукции, содержащие один или несколько таких символов. Пусть — полученная в результате грамматика.2) Удаляются все символы, недостижимые из Тогда . не имеет бесполезных символов и . |
Доказательство: |
Пусть — оставшийся символ. Известно, что для некоторой цепочки из терминалов. Кроме того, каждый символ, использованный в этом порождении, достижим, поэтому .Поскольку не был удален на втором шаге, известно, что существует такие и , для которых . Кроме того, каждый символ, использованный в этом порождении, достижим, поэтому .Также известно, что каждый символ в цепочке достижим, поэтому каждый из них является порождающим в . Порождение некоторой терминальной цепочки, например, , содержит только символы, достижимые из , поскольку они достижимы из символов в цепочке . Таким образом, это порождение есть также порождение в , то есть .Итак, полезен в . Ввиду произвольности в можно заключить, что не имеет бесполезных символов. , так как при построении из символы и продукции только убирались. Докажем, что . Если , то . Каждый символ в этом порождении является как достижимым, так и порождающим, поэтому порождение в его также содержит. Таким образом, , и . |
Примечание:
Эти шаги нельзя менять местами. Рассмотрим следующую грамматику:
Если начать с проверки достижимости, то все символы грамматики оказываются достижимыми. Если затем удалить
как непорождающий символ, то останется грамматика с бесполезными символами и .Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)