<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.55.96.38&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.55.96.38&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/95.55.96.38"/>
		<updated>2026-07-24T11:34:18Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B1%D0%B5%D1%81%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2_%D0%B8%D0%B7_%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=49766</id>
		<title>Удаление бесполезных символов из грамматики</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B1%D0%B5%D1%81%D0%BF%D0%BE%D0%BB%D0%B5%D0%B7%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2_%D0%B8%D0%B7_%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B8&amp;diff=49766"/>
				<updated>2015-11-06T19:56:22Z</updated>
		
		<summary type="html">&lt;p&gt;95.55.96.38: /* Пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Порождающие и непорождающие нетерминалы ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется '''порождающим''' (''generating''), если из него может быть выведена конечная терминальная цепочка. Иначе он называется '''непорождающим'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Очевидно, что если и только если все нетерминалы правой части правила являются порождающими, то порождающим является и нетерминал, стоящий в его левой части. Это позволяет обнаружить непорождающие нетерминалы с помощью следующей процедуры.&lt;br /&gt;
# Найти правила, не содержащие нетерминалов в правых частях. Составить множество нетерминалов, встречающихся в левых частях таких правил.&lt;br /&gt;
# Если найдено такое правило, что все нетерминалы, стоящие в его правой части, уже входят в множество, то добавить в множество нетерминалы, стоящие в его левой части.&lt;br /&gt;
# Если на шаге 2 множество изменилось, повторить шаг 2.&lt;br /&gt;
# Получено множество всех порождающих нетерминалов грамматики, а все нетерминалы, не попавшие в него, являются непорождающими.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
После удаления из грамматики правил, содержащих непорождающие нетерминалы, язык не изменится.&lt;br /&gt;
|proof=&lt;br /&gt;
Непорождающие нетерминалы по определению не могли участвовать в выводе какого-либо слова.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Время работы алгоритма ===&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(\left| \Gamma \right| ^ 2)&amp;lt;/tex&amp;gt;, однако используя [[Очередь|очередь]] можно ускорить его до &amp;lt;tex&amp;gt;O(\left| \Gamma \right|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
Рассмотрим грамматику:&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow Ac\\&lt;br /&gt;
    A\rightarrow SD\\&lt;br /&gt;
    D\rightarrow aD\\&lt;br /&gt;
    A\rightarrow a    &lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Изначально множество порождающих нетерминалов состоит из одного элемента &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Добавим в множество нетерминал &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, так как существует правило &amp;lt;tex&amp;gt;S\rightarrow Ac&amp;lt;/tex&amp;gt;, в правой части которого стоят нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, который есть в множестве, и терминал &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# После следующего обхода правил из грамматики множество не изменится.&lt;br /&gt;
# Теперь удалим правила &amp;lt;tex&amp;gt;A\rightarrow SD&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D\rightarrow aD&amp;lt;/tex&amp;gt;, так как они содержит нетерминалы, которых нет в полученном множестве.&lt;br /&gt;
&lt;br /&gt;
== Достижимые и недостижимые нетерминалы ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется '''достижимым''' (''reachable'') в КС-грамматике &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, если существует порождение &amp;lt;tex&amp;gt;S \Rightarrow^* \alpha A \beta&amp;lt;/tex&amp;gt;. Иначе он называется '''недостижимым''' (''unreachable'').&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Очевидно, что если нетерминал в левой части правила является достижимым, то и все нетерминалы правой части являются достижимыми. Найти недостижимые нетерминалы можно с помощью следующей процедуры.&lt;br /&gt;
# Возьмём множество, состоящее из единственного элемента: &amp;lt;tex&amp;gt;\lbrace S \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Если найдено правило, в левой части которого стоит нетерминал, содержащийся в множестве, добавить в множество все нетерминалы из правой части.&lt;br /&gt;
# Если на шаге 2 множество изменилось, повторить шаг 2.&lt;br /&gt;
# Получено множество всех достижимых нетерминалов, а нетерминалы, не попавшие в него, являются недостижимыми.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
После удаления из грамматики правил, содержащих недостижимые нетерминалы, язык не изменится.&lt;br /&gt;
|proof=&lt;br /&gt;
Недостижимые нетерминалы по определению не достижимы из стартового, следовательно они не могли участвовать в выводе какого-либо слова.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Время работы алгоритма ===&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(\left| \Gamma \right| ^ 2)&amp;lt;/tex&amp;gt;, однако используя [[Обход_в_глубину,_цвета_вершин|обход в глубину]] можно ускорить его до &amp;lt;tex&amp;gt;O(\left| \Gamma \right|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
Рассмотрим грамматику:&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow AB|CD\\&lt;br /&gt;
    A\rightarrow EF\\&lt;br /&gt;
    G\rightarrow AD\\&lt;br /&gt;
    C\rightarrow c&lt;br /&gt;
&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Возьмём множество, состоящее из единственного элемента: &amp;lt;tex&amp;gt;\lbrace S \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Из &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; достижимы нетерминалы &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. Добавим их в множество и получим  &amp;lt;tex&amp;gt;\lbrace S, A, B, C, D \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Множество изменилось. Переберём заново правила из грамматики. Из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; можно вывести &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, добавим их в множество.&lt;br /&gt;
# Снова переберём правила. Из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; можно вывести только терминал, а &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; нету в множестве.&lt;br /&gt;
# После последнего обхода правил грамматики множество не изменилось, значит мы нашли все достижимые нетерминалы: &amp;lt;tex&amp;gt;\lbrace S, A, B, C, D, E, F \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Теперь удалим правило &amp;lt;tex&amp;gt;G\rightarrow AD&amp;lt;/tex&amp;gt;, так как оно содержит в левой части нетерминал, которого нет в полученном множестве.&lt;br /&gt;
&lt;br /&gt;
== Полезные и бесполезные нетерминалы ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется '''полезным''' (''useful'') в КС-грамматике &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, если он может участвовать в выводе, то есть существует порождение вида &amp;lt;tex&amp;gt;S \Rightarrow ^* \alpha A \beta \Rightarrow ^* w&amp;lt;/tex&amp;gt;. Иначе он называется '''бесполезным''' (''useless'').&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=th1&lt;br /&gt;
|statement=&lt;br /&gt;
Грамматика &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; не содержит бесполезных нетерминалов тогда и только тогда, когда грамматика &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; не содержит ни недостижимых нетерминалов, ни непорождающих.&lt;br /&gt;
|proof=&lt;br /&gt;
''Необходимость.'' Очевидно, так как недостижимые и непорождающие нетерминалы являются бесполезными.&lt;br /&gt;
&lt;br /&gt;
''Достаточность.'' Рассмотрим любой нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;. Так как он достижим, существуют &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\beta&amp;lt;/tex&amp;gt; такие, что &amp;lt;tex&amp;gt;S \Rightarrow ^* \alpha A \beta&amp;lt;/tex&amp;gt;. Из того, что любой нетерминал является порождающим, следует, что из любой строки можно вывести строку из терминалов. Значит, существует &amp;lt;tex&amp;gt;\omega \in \Sigma ^ *&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;S \Rightarrow ^* \alpha A \beta \Rightarrow ^* \omega&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; {{---}} не бесполезный.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм удаления бесполезных нетерминалов ==&lt;br /&gt;
# Удалить из грамматики правила, содержащие непорождающие нетерминалы.&lt;br /&gt;
# Удалить из грамматики правила, содержащие недостижимые нетерминалы.&lt;br /&gt;
&lt;br /&gt;
=== Корректность алгоритма ===&lt;br /&gt;
Достаточность данных действий следует из доказанной выше теоремы.&lt;br /&gt;
&lt;br /&gt;
Докажем, что после выполнения второго шага не могут появиться новые непорождающие нетерминалы.&lt;br /&gt;
&lt;br /&gt;
Допустим, что в грамматике появился непорождающий нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;. Так как до удаления недостижимых нетерминалов существовал вывод из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; некоторой конечной цепочки терминалов &amp;lt;tex&amp;gt;\omega&amp;lt;/tex&amp;gt;, то было удалено хотя бы какое-то одно правило из этого вывода.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;B\rightarrow\alpha&amp;lt;/tex&amp;gt; {{---}} правило, первым из удалённых применяемое в выводе &amp;lt;tex&amp;gt;A \Rightarrow ^* \omega&amp;lt;/tex&amp;gt;. Оно могло быть удалено только в том случае, если в &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; присутствуют недостижимые нетерминалы. Но так как было выбрано первое удалённое правило из вывода, то &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; — достижим, следовательно достижимы и все нетерминалы из &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt;. Значит, это правило не могло быть удалено.&lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
&lt;br /&gt;
Пусть нам дана грамматика:&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow AS|BS|s \\&lt;br /&gt;
    E\rightarrow EF|FF \\&lt;br /&gt;
    A\rightarrow a \\&lt;br /&gt;
    F\rightarrow f&lt;br /&gt;
&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Удалим правила, содержащие непорождающие нетерминалы и получим грамматику&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow AS|s \\&lt;br /&gt;
    E\rightarrow EF|FF \\&lt;br /&gt;
    A\rightarrow a \\&lt;br /&gt;
    F\rightarrow f&lt;br /&gt;
&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Теперь удалим недостижимые нетерминалы и получим грамматику&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow AS|s \\    &lt;br /&gt;
    A\rightarrow a&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Замечание ===&lt;br /&gt;
Шаги алгоритма нельзя менять местами. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим следующую грамматику:&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow AB|a \\&lt;br /&gt;
    A\rightarrow b&lt;br /&gt;
\end{array}.&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
Все нетерминалы в этой грамматике достижимы. Однако, если удалить &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; как непорождающий, то нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; станет недостижимым.&lt;br /&gt;
== См. также  ==&lt;br /&gt;
* [[Контекстно-свободные_грамматики,_вывод,_лево-_и_правосторонний_вывод,_дерево_разбора|Контекстно-свободные грамматики]]&lt;br /&gt;
* [[Нормальная_форма_Хомского|Нормальная форма Хомского]]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Chomsky_normal_form Chomsky normal form]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>95.55.96.38</name></author>	</entry>

	</feed>