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

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 10: Строка 10:
 
# Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими.
 
# Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими.
  
При удалении из грамматики непорождающих нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы по определению не могли встречаться в выводе любого слова.
+
При удалении из грамматики непорождающих нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы по определению не могли встречаться в выводе какого-либо слова.
  
 
{{Определение
 
{{Определение
Строка 23: Строка 23:
 
# Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми.
 
# Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми.
  
При удалении из грамматики недостижимых нетерминалов и правил, их содержащих, язык не изменится, так как эти нетерминалы недостижимы из стартового, то и в выводе любого слова они встречаться не могли.
+
При удалении из грамматики недостижимых нетерминалов и правил, их содержащих, язык не изменится, так как поскольку эти нетерминалы недостижимы из стартового, то и в выводе какого-либо слова они встречаться не могли.
  
 
{{Определение
 
{{Определение

Версия 03:05, 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 (рус.)