Удаление бесполезных символов из грамматики — различия между версиями
Bloof (обсуждение | вклад) |
|||
Строка 22: | Строка 22: | ||
|definition= | |definition= | ||
Символ '''<tex>A</tex>''' называется '''бесполезным''' в | Символ '''<tex>A</tex>''' называется '''бесполезным''' в | ||
− | КС-грамматике '''<tex>\Gamma</tex>''', если он не может встретиться в выводе слова из терминалов. | + | КС-грамматике '''<tex>\Gamma</tex>''', если он не может встретиться в выводе слова из терминалов. То есть не существует порождения вида <tex>S \Rightarrow ^* \alpha A \beta \Rightarrow ^* w</tex>, где <tex>w</tex> {{---}} строка терминалов. |
}} | }} | ||
{{Теорема | {{Теорема | ||
Строка 32: | Строка 32: | ||
<tex>\Leftarrow</tex> Рассмотрим любой нетерминал <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> - не бесполезный. | <tex>\Leftarrow</tex> Рассмотрим любой нетерминал <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> - не бесполезный. | ||
}} | }} | ||
+ | |||
+ | {{Теорема | ||
+ | |id=th2 | ||
+ | |statement= | ||
+ | Пусть <tex>G</tex> {{---}} КС-грамматика, и <tex>L(G)\ne\empty</tex>. Пусть <tex>G_1</tex> - грамматика, полученная с помощью следующих двух шагов: | ||
+ | |||
+ | 1) Удаляются непорождающие символы и все продукции, содержащие один или несколько таких символов. Пусть <tex>G_2</tex> {{---}} полученная в результате грамматика. | ||
+ | |||
+ | 2) Удаляются все символы, недостижимые из <tex>G_2</tex>. | ||
+ | |||
+ | Тогда <tex>G_1</tex> не имеет бесполезных символов и <tex>L(G_1)=L(G)</tex>. | ||
+ | |proof= | ||
+ | Пусть <tex>X</tex> {{---}} оставшийся символ. Известно, что <tex>X\Rightarrow _G^* w</tex> для некоторой цепочки <tex>w</tex> из терминалов. Кроме того, каждый символ, использованный в этом порождении, достижим, поэтому <tex>S\Rightarrow _{G_2}^* w</tex>. | ||
+ | |||
+ | Поскольку <tex>X</tex> не был удален на втором шаге, известно, что существует такие <tex>\alpha</tex> и <tex>\beta</tex>, для которых <tex>S\Rightarrow _{G_2}^* \alpha X\beta</tex>. Кроме того, каждый символ, использованный в этом порождении, достижим, поэтому <tex>S\Rightarrow _{G_1}^* \alpha X\beta</tex>. | ||
+ | |||
+ | Также известно, что каждый символ в цепочке <tex>\alpha X\beta</tex> достижим, поэтому каждый из них является порождающим в <tex>G_2</tex>. Порождение некоторой терминальной цепочки, например, <tex>\alpha X\beta\Rightarrow _{G_2}^* xwy</tex>, содержит только символы, достижимые из <tex>S</tex>, поскольку они достижимы из символов в цепочке <tex>\alpha X\beta</tex>. Таким образом, это порождение есть также порождение в <tex>G_1</tex>, то есть <tex>S\Rightarrow _{G_1}^* \alpha X\beta\Rightarrow _{G_1}^* xwy</tex>. | ||
+ | |||
+ | Итак, <tex>X</tex> полезен в <tex>G_1</tex>. Ввиду произвольности <tex>X</tex> в <tex>G_1</tex> можно заключить, что <tex>G_1</tex> не имеет бесполезных символов. | ||
+ | |||
+ | <tex>L(G_1)\subseteq L(G)</tex>, так как при построении <tex>G_1</tex> из <tex>G</tex> символы и продукции только убирались. Докажем, что <tex>L(G_1)\supseteq L(G)</tex>. Если <tex>w\in L(G)</tex>, то <tex>S\Rightarrow _{G}^* w</tex>. Каждый символ в этом порождении является как достижимым, так и порождающим, поэтому порождение в <tex>G_1</tex> его также содержит. Таким образом, <tex>S\Rightarrow _{G_1}^* w</tex>, <tex>w\in L(G_1)</tex> и <tex>L(G)=L(G_1)</tex>. | ||
+ | }} | ||
+ | |||
+ | ''Примечание:'' | ||
+ | |||
+ | Эти шаги нельзя менять местами. Рассмотрим следующую грамматику: | ||
+ | |||
+ | <tex>S\rightarrow AB|A</tex> | ||
+ | |||
+ | <tex>A\rightarrow b</tex> | ||
+ | |||
+ | Если начать с проверки достижимости, то все символы грамматики оказываются достижимыми. Если затем удалить <tex>B</tex> как непорождающий символ, то останется грамматика с бесполезными символами <tex>A</tex> и <tex>b</tex>. | ||
== Литература == | == Литература == | ||
− | * | + | * ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.) |
Версия 21:58, 5 ноября 2011
Определение: |
Символ | называется непорождающим, если из него не может быть выведена конечная терминальная цепочка.
Рассматривая правила грамматики, можно сделать вывод, что если и только если все нетерминальные символы правой части являются порождающими, то порождающим является и символ, стоящий в левой части. Последнее утверждение позволяет написать процедуру обнаружения непорождающих символов в следующем виде:
- Составить список нетерминалов, для которых найдется хотя бы одно правило, правая часть которого не содержит нетерминалов.
- Если найдено такое правило, что все нетерминалы, стоящие в его правой части уже занесены в список, то добавить в список нетерминал, стоящий в его левой части.
- Если на шаге 2 список больше не пополняется, то получен список всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими.
Определение: |
Символ | называется недостижимым в КС-грамматике , если строку, содержащую , нельзя вывести из стартового нетерминала.
Рассматривая правила грамматики, можно заметить , что если нетерминал в левой части правила является достижимым , то и все символы правой части являются достижимыми. Это свойство правил является основой процедуры выявления недостижимых символов, которую можно записать так:
- Образовать одноэлементный список, состоящий из начального символа
- Если найдено правило, левая часть которого уже имеется в списке, то включить в список все символы, содержащиеся в его правой части.
- Если на шаге 2 новые нетерминалы в список больше не добавляются, то получен список всех достижимых нетерминалов, а нетерминалы, не попавшие в список, являются недостижимыми.
Определение: |
Символ | называется бесполезным в КС-грамматике , если он не может встретиться в выводе слова из терминалов. То есть не существует порождения вида , где — строка терминалов.
Теорема: |
Грамматика не содержит бесполезных символов тогда и только тогда, когда она не содержит ни недостижимых символов, ни непорождающих. |
Доказательство: |
Очевидно, т.к. недостижимые и непорождающие символы являются бесполезными. Рассмотрим любой нетерминал . Так как он достижимый, существуют и , такие, что . Из того, что любой сивол является порождающим, следует, что из любой строки можно вывести строку из терминалов. Значит, существует : , и - не бесполезный. |
Теорема: |
Пусть — КС-грамматика, и . Пусть - грамматика, полученная с помощью следующих двух шагов:
1) Удаляются непорождающие символы и все продукции, содержащие один или несколько таких символов. Пусть — полученная в результате грамматика.2) Удаляются все символы, недостижимые из Тогда . не имеет бесполезных символов и . |
Доказательство: |
Пусть — оставшийся символ. Известно, что для некоторой цепочки из терминалов. Кроме того, каждый символ, использованный в этом порождении, достижим, поэтому .Поскольку не был удален на втором шаге, известно, что существует такие и , для которых . Кроме того, каждый символ, использованный в этом порождении, достижим, поэтому .Также известно, что каждый символ в цепочке достижим, поэтому каждый из них является порождающим в . Порождение некоторой терминальной цепочки, например, , содержит только символы, достижимые из , поскольку они достижимы из символов в цепочке . Таким образом, это порождение есть также порождение в , то есть .Итак, полезен в . Ввиду произвольности в можно заключить, что не имеет бесполезных символов. , так как при построении из символы и продукции только убирались. Докажем, что . Если , то . Каждый символ в этом порождении является как достижимым, так и порождающим, поэтому порождение в его также содержит. Таким образом, , и . |
Примечание:
Эти шаги нельзя менять местами. Рассмотрим следующую грамматику:
Если начать с проверки достижимости, то все символы грамматики оказываются достижимыми. Если затем удалить
как непорождающий символ, то останется грамматика с бесполезными символами и .Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)