Удаление бесполезных символов из грамматики — различия между версиями
Bloof (обсуждение | вклад) |
Kirelagin (обсуждение | вклад) (Прочитал первую половину) |
||
Строка 1: | Строка 1: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | Символ | + | Символ <tex>A</tex> называется '''порождающим''', если из него может быть выведена конечная терминальная цепочка. Иначе он называется '''непорождающим'''. |
}} | }} | ||
− | + | Очевидно, что если и только если все нетерминальные символы правой части являются порождающими, то порождающим является и символ, стоящий в левой части. Это позволяет обнаружить непорождающие нетерминалы с помощью следующей процедуры. | |
− | # Составить | + | # Найти правила, не содержащие нетерминалов в правых частях. Составить множество нетерминалов, встречающихся в левых частях таких правил. |
− | # Если найдено такое правило, | + | # Если найдено такое правило, что все нетерминалы, стоящие в его правой, части уже входят в множество, то добавить в множество нетерминалы, стоящие в его левой части. |
− | # Если на шаге 2 | + | # Если на шаге 2 множество изменилось, повторить шаг 2. |
+ | # Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими. | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | + | Нетерминал <tex>A</tex> называется '''достижимым''' в КС-грамматике <tex>\Gamma</tex>, если существует порождение <tex>S \Rightarrow^* \alpha A \beta</tex>. Иначе он называется '''недостижимым'''. | |
}} | }} | ||
− | + | Очевидно, что если нетерминал в левой части правила является достижимым, то и все нетерминалы правой части являются достижимыми. Найти недостижимые нетерминалы можно с помощью следующей процедуры. | |
− | # | + | # Возьмём множество, состоящее из единственного элемента: <tex>\lbrace S \rbrace</tex>. |
− | # Если найдено правило, | + | # Если найдено правило, в левой части которого стоит нетерминал, содержащийся в множестве, добавить в множество все нетерминалы из правой части. |
− | # Если на шаге 2 | + | # Если на шаге 2 множество изменилось, повторить шаг 2. |
+ | # Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми. | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | + | Нетерминал <tex>A</tex> называется '''полезным''' в КС-грамматике <tex>\Gamma</tex>, если он может участвовать в выводе, то есть существует порождение вида <tex>S \Rightarrow ^* \alpha A \beta \Rightarrow ^* w</tex>. Иначе он называется '''бесполезным'''. | |
− | КС-грамматике | ||
}} | }} | ||
+ | |||
{{Теорема | {{Теорема | ||
|id=th1 | |id=th1 | ||
|statement= | |statement= | ||
− | Грамматика <tex>\Gamma</tex> не содержит бесполезных | + | Грамматика <tex>\Gamma</tex> не содержит бесполезных нетерминалов <tex>\Leftrightarrow</tex> она не содержит ни недостижимых нетерминалов, ни непорождающих. |
|proof= | |proof= | ||
− | <tex>\Rightarrow</tex> Очевидно, т.к. недостижимые и непорождающие | + | <tex>\Rightarrow</tex><br /> |
− | <tex>\Leftarrow</tex> Рассмотрим любой нетерминал <tex>A</tex>. Так как он | + | Очевидно, т.к. недостижимые и непорождающие нетерминалы являются бесполезными. |
+ | |||
+ | <tex>\Leftarrow</tex><br /> | ||
+ | Рассмотрим любой нетерминал <tex>A</tex>. Так как он достижим, существуют <tex>\alpha</tex> и <tex>\beta</tex>, такие, что <tex>S \Rightarrow ^* \alpha A \beta</tex>. Из того, что любой нетерминал является порождающим, следует, что из любой строки можно вывести строку из терминалов. Значит, существует <tex>\omega \in \Sigma ^ *</tex>: <tex>S \Rightarrow ^* \alpha A \beta \Rightarrow ^* \omega</tex>, и <tex>A</tex> {{---}} не бесполезный. | ||
}} | }} | ||
Версия 03:37, 7 ноября 2011
Определение: |
Символ | называется порождающим, если из него может быть выведена конечная терминальная цепочка. Иначе он называется непорождающим.
Очевидно, что если и только если все нетерминальные символы правой части являются порождающими, то порождающим является и символ, стоящий в левой части. Это позволяет обнаружить непорождающие нетерминалы с помощью следующей процедуры.
- Найти правила, не содержащие нетерминалов в правых частях. Составить множество нетерминалов, встречающихся в левых частях таких правил.
- Если найдено такое правило, что все нетерминалы, стоящие в его правой, части уже входят в множество, то добавить в множество нетерминалы, стоящие в его левой части.
- Если на шаге 2 множество изменилось, повторить шаг 2.
- Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими.
Определение: |
Нетерминал | называется достижимым в КС-грамматике , если существует порождение . Иначе он называется недостижимым.
Очевидно, что если нетерминал в левой части правила является достижимым, то и все нетерминалы правой части являются достижимыми. Найти недостижимые нетерминалы можно с помощью следующей процедуры.
- Возьмём множество, состоящее из единственного элемента: .
- Если найдено правило, в левой части которого стоит нетерминал, содержащийся в множестве, добавить в множество все нетерминалы из правой части.
- Если на шаге 2 множество изменилось, повторить шаг 2.
- Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми.
Определение: |
Нетерминал | называется полезным в КС-грамматике , если он может участвовать в выводе, то есть существует порождение вида . Иначе он называется бесполезным.
Теорема: |
Грамматика не содержит бесполезных нетерминалов она не содержит ни недостижимых нетерминалов, ни непорождающих. |
Доказательство: |
|
Теорема: |
Пусть — КС-грамматика, и . Пусть - грамматика, полученная с помощью следующих двух шагов:
1) Удаляются непорождающие символы и все продукции, содержащие один или несколько таких символов. Пусть — полученная в результате грамматика.2) Удаляются все символы, недостижимые из Тогда . не имеет бесполезных символов и . |
Доказательство: |
Пусть — оставшийся символ. Известно, что для некоторой цепочки из терминалов. Кроме того, каждый символ, использованный в этом порождении, достижим, поэтому .Поскольку не был удален на втором шаге, известно, что существует такие и , для которых . Кроме того, каждый символ, использованный в этом порождении, достижим, поэтому .Также известно, что каждый символ в цепочке достижим, поэтому каждый из них является порождающим в . Порождение некоторой терминальной цепочки, например, , содержит только символы, достижимые из , поскольку они достижимы из символов в цепочке . Таким образом, это порождение есть также порождение в , то есть .Итак, полезен в . Ввиду произвольности в можно заключить, что не имеет бесполезных символов. , так как при построении из символы и продукции только убирались. Докажем, что . Если , то . Каждый символ в этом порождении является как достижимым, так и порождающим, поэтому порождение в его также содержит. Таким образом, , и . |
Примечание:
Эти шаги нельзя менять местами. Рассмотрим следующую грамматику:
Если начать с проверки достижимости, то все символы грамматики оказываются достижимыми. Если затем удалить
как непорождающий символ, то останется грамматика с бесполезными символами и .Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)