Удаление бесполезных символов из грамматики — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м
Строка 9: Строка 9:
 
# Если на шаге 2 множество изменилось, повторить шаг 2.
 
# Если на шаге 2 множество изменилось, повторить шаг 2.
 
# Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими.
 
# Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими.
 +
 +
При удалении из грамматики непорождающих нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы по определению не могли встречаться в выводе любого слова.
  
 
{{Определение
 
{{Определение
Строка 20: Строка 22:
 
# Если на шаге 2 множество изменилось, повторить шаг 2.
 
# Если на шаге 2 множество изменилось, повторить шаг 2.
 
# Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми.
 
# Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми.
 +
 +
При удалении из грамматики недостижимых нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы недостижимы из стартового, то и в выводе любого слова они встречаться не могли.
  
 
{{Определение
 
{{Определение
Строка 36: Строка 40:
 
}}
 
}}
  
 +
==Алгоритм==
 +
Алгоритм удаления бесполезных нетерминалов из грамматики прост, как три рубля.
 +
# Удалить из грамматики непорождающие нетерминалы и правила, в которых они встречаются.
 +
# Удалить из грамматики недостижимые нетерминалы и правила, в которых они встречаются.
  
 +
После сих действий в грамматике не будет бесполезных символов.
 +
 +
==Корректность алгоритма==
 +
Корректность алгоритма вытекает из [[#th1|первой теоремы]] и следующей.
 
{{Теорема
 
{{Теорема
 
|id=th2
 
|id=th2
 
|statement=
 
|statement=
Пусть <tex>\Gamma</tex> {{---}} КС-грамматика, и <tex>L(\Gamma)\ne\varnothing</tex>. Пусть <tex>\Gamma_1</tex> - грамматика, полученная с помощью следующих двух шагов:
+
Пусть <tex>\Gamma</tex> - грамматика без непорождающих нетерминалов. Тогда после удаления недостижимых нетерминалов новые непорождающие не появятся.
 
 
1) Удаляются непорождающие символы и все продукции, содержащие один или несколько таких символов. Пусть <tex>\Gamma_2</tex> {{---}} полученная в результате грамматика.
 
 
 
2) Удаляются все символы, недостижимые из <tex>\Gamma_2</tex>.
 
 
 
Тогда <tex>\Gamma_1</tex> не имеет бесполезных символов и <tex>L(\Gamma_1)=L(\Gamma)</tex>.
 
 
|proof=
 
|proof=
Пусть <tex>X</tex> {{---}} оставшийся символ. Известно, что <tex>X\overset{*}{\underset{\Gamma}{\Rightarrow}} w</tex> для некоторой цепочки <tex>w</tex> из терминалов. Кроме того, каждый символ, использованный в этом порождении, достижим, поэтому <tex>S\overset{*}{\underset{\Gamma_2}{\Rightarrow}}w</tex>.
+
Допустим, что в грамматике появился непорождающий нетерминал <tex>A</tex>. Так как до удаления недостижимых нетерминалов существовал вывод из <tex>A</tex> конечной цепочки терминалов, то удалилось какое-то одно или несколько правил из вывода. Возьмем первое удаленное правило <tex>C\rightarrow\alpha</tex>. Оно могло удалиться только, если в <tex>\alpha</tex> присутствуют недостижимые символы. Но так как было выбрано первое удаленное правило из вывода, то <tex>C</tex> достижим, а, следовательно, и все символы из <tex>\alpha</tex>. Значит, это правило удалиться не могло.
 
 
Поскольку <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>\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>\Gamma_1</tex>. Ввиду произвольности <tex>X</tex> в <tex>\Gamma_1</tex> можно заключить, что <tex>\Gamma_1</tex> не имеет бесполезных символов.
 
 
 
<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>.
 
 
}}
 
}}
  

Версия 03:02, 9 ноября 2011

Определение:
Символ [math]A[/math] называется порождающим, если из него может быть выведена конечная терминальная цепочка. Иначе он называется непорождающим.


Очевидно, что если и только если все нетерминальные символы правой части являются порождающими, то порождающим является и символ, стоящий в левой части. Это позволяет обнаружить непорождающие нетерминалы с помощью следующей процедуры.

  1. Найти правила, не содержащие нетерминалов в правых частях. Составить множество нетерминалов, встречающихся в левых частях таких правил.
  2. Если найдено такое правило, что все нетерминалы, стоящие в его правой, части уже входят в множество, то добавить в множество нетерминалы, стоящие в его левой части.
  3. Если на шаге 2 множество изменилось, повторить шаг 2.
  4. Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими.

При удалении из грамматики непорождающих нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы по определению не могли встречаться в выводе любого слова.


Определение:
Нетерминал [math]A[/math] называется достижимым в КС-грамматике [math]\Gamma[/math], если существует порождение [math]S \Rightarrow^* \alpha A \beta[/math]. Иначе он называется недостижимым.


Очевидно, что если нетерминал в левой части правила является достижимым, то и все нетерминалы правой части являются достижимыми. Найти недостижимые нетерминалы можно с помощью следующей процедуры.

  1. Возьмём множество, состоящее из единственного элемента: [math]\lbrace S \rbrace[/math].
  2. Если найдено правило, в левой части которого стоит нетерминал, содержащийся в множестве, добавить в множество все нетерминалы из правой части.
  3. Если на шаге 2 множество изменилось, повторить шаг 2.
  4. Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми.

При удалении из грамматики недостижимых нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы недостижимы из стартового, то и в выводе любого слова они встречаться не могли.


Определение:
Нетерминал [math]A[/math] называется полезным в КС-грамматике [math]\Gamma[/math], если он может участвовать в выводе, то есть существует порождение вида [math]S \Rightarrow ^* \alpha A \beta \Rightarrow ^* w[/math]. Иначе он называется бесполезным.


Теорема:
Грамматика [math]\Gamma[/math] не содержит бесполезных нетерминалов [math]\Leftrightarrow[/math] грамматика [math]\Gamma[/math] не содержит ни недостижимых нетерминалов, ни непорождающих.
Доказательство:
[math]\triangleright[/math]

Необходимость. Очевидно, т.к. недостижимые и непорождающие нетерминалы являются бесполезными.

Достаточность. Рассмотрим любой нетерминал [math]A[/math]. Так как он достижим, существуют [math]\alpha[/math] и [math]\beta[/math], такие, что [math]S \Rightarrow ^* \alpha A \beta[/math]. Из того, что любой нетерминал является порождающим, следует, что из любой строки можно вывести строку из терминалов. Значит, существует [math]\omega \in \Sigma ^ *[/math]: [math]S \Rightarrow ^* \alpha A \beta \Rightarrow ^* \omega[/math], и [math]A[/math] — не бесполезный.
[math]\triangleleft[/math]

Алгоритм

Алгоритм удаления бесполезных нетерминалов из грамматики прост, как три рубля.

  1. Удалить из грамматики непорождающие нетерминалы и правила, в которых они встречаются.
  2. Удалить из грамматики недостижимые нетерминалы и правила, в которых они встречаются.

После сих действий в грамматике не будет бесполезных символов.

Корректность алгоритма

Корректность алгоритма вытекает из первой теоремы и следующей.

Теорема:
Пусть [math]\Gamma[/math] - грамматика без непорождающих нетерминалов. Тогда после удаления недостижимых нетерминалов новые непорождающие не появятся.
Доказательство:
[math]\triangleright[/math]
Допустим, что в грамматике появился непорождающий нетерминал [math]A[/math]. Так как до удаления недостижимых нетерминалов существовал вывод из [math]A[/math] конечной цепочки терминалов, то удалилось какое-то одно или несколько правил из вывода. Возьмем первое удаленное правило [math]C\rightarrow\alpha[/math]. Оно могло удалиться только, если в [math]\alpha[/math] присутствуют недостижимые символы. Но так как было выбрано первое удаленное правило из вывода, то [math]C[/math] — достижим, а, следовательно, и все символы из [math]\alpha[/math]. Значит, это правило удалиться не могло.
[math]\triangleleft[/math]

Примечание:

Эти шаги нельзя менять местами. Рассмотрим следующую грамматику:

[math]S\rightarrow AB|a[/math]

[math]A\rightarrow b[/math]

Если начать с проверки достижимости, то все символы грамматики оказываются достижимыми. Если затем удалить [math]B[/math] как непорождающий символ, то останется грамматика с бесполезными символами [math]A[/math] и [math]b[/math].

Литература

  • Хопкрофт Д., Мотвани Р., Ульман Д.Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)