<?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=91.215.121.216&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=91.215.121.216&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/91.215.121.216"/>
		<updated>2026-06-11T14:37:07Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:SkudarnovYaroslav/%D0%A2%D0%B5%D0%BE%D1%80%D0%BC%D0%B8%D0%BD_%D0%BA_%D0%B7%D0%B0%D1%87%D1%91%D1%82%D1%83_%D0%BF%D0%BE_%D1%81%D0%B5%D1%82%D1%8F%D0%BC&amp;diff=45054</id>
		<title>Участник:SkudarnovYaroslav/Теормин к зачёту по сетям</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:SkudarnovYaroslav/%D0%A2%D0%B5%D0%BE%D1%80%D0%BC%D0%B8%D0%BD_%D0%BA_%D0%B7%D0%B0%D1%87%D1%91%D1%82%D1%83_%D0%BF%D0%BE_%D1%81%D0%B5%D1%82%D1%8F%D0%BC&amp;diff=45054"/>
				<updated>2015-03-20T20:01:16Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Тест 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Тест 1 =&lt;br /&gt;
== Дайте определение компьютерной сети ==&lt;br /&gt;
Компьютерная сеть — совокупность компьютеров, объединённых с помощью телекоммуникаций (т. — связь при помощи электронных устройств) для совместного использования данных/ресурсов. Распределённая система — совокупность объединённых компьютеров (аналогично тому, что выше), посредством специального ПО предоставляющих пользователю интерфейс единой системы.&lt;br /&gt;
&lt;br /&gt;
== Какие области технического прогресса породили компьютерные сети? ==&lt;br /&gt;
Коммуникации и компьютерные технологии.&lt;br /&gt;
&lt;br /&gt;
== Приведите классификации компьютерных сетей ==&lt;br /&gt;
а) По размерам (территориальному признаку функционирования): Desk Area Network (рабочая станция; обмен данными организован на основе ATM ({{TODO|t=???}}), Personal Area Network (сеть устройств пользователя), Local Area Network (соединяет устройства в помещениях — домах, школах и т.д.), Metropolitan Area Network (соединяет устройства в одном городе), Wide Area Network (охватывает большие территории, связывает более маленькие сети, ниже скорость), Internet ({{TODO|t=крупнейшая WAN?}})&lt;br /&gt;
&lt;br /&gt;
б) По скорости передачи данных: низкоскоростные — до 10 Мбит/с, среднескоростные — до 100 Мбит/c, высокоскоростные — свыше 100 Мбит/с.&lt;br /&gt;
&lt;br /&gt;
в) По типу среды передачи данных: проводные, беспроводные.&lt;br /&gt;
&lt;br /&gt;
г) По типу абонентов: стационарные/мобильные.&lt;br /&gt;
&lt;br /&gt;
д) По правовой принадлежности: частные, государственные, общественные ({{TODO|t=по идее, последнее должно относиться либо к первому, либо ко второму}}).&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;
* Шина {{---}} 10BASE5, 10BASE2&lt;br /&gt;
* Кольцо {{---}} FDDI Ring&lt;br /&gt;
* Звезда {{---}} что-то про Ethernet Hub&lt;br /&gt;
* Ячеистая {{---}} Netsukuku&lt;br /&gt;
&lt;br /&gt;
== Сформулируйте обобщённую задачу коммутации ==&lt;br /&gt;
а) Определение потоков, для которых требуется прокладка маршрута. б) Маршрутизация (определение маршрута). в) Продвижение потоков (распознавание потоков и локальная коммутация на транзитных узлах. устройство, коммутирующее интерфейсы — коммутатор). г) Мультиплексирование (разделение агрегированного потока на составляющие) и демультиплексирование (наоборот, образование из отдельных агрегированный).&lt;br /&gt;
&lt;br /&gt;
== В чем отличия канальной и пакетной коммутации? ==&lt;br /&gt;
Пакеты поступают в сеть без резервирования линии связи. Маршрут следования хранится на промежуточных узлах и формируется вручную/автоматически (в случае с каналами он становится известен сразу после создания составного канала). Доставка пакетов в правильном порядке без искажений не гарантируется. У пакетных коммутаторов есть буферная память для временного хранения пакетов (промежуточное хранение).&lt;br /&gt;
&lt;br /&gt;
== Что такое эталонная модель OSI? ==&lt;br /&gt;
Модель стека сетевых протоколов, определяющая, что должен делать каждый уровень, разрабатывалась в семидесятых-восьмидесятых годах.&lt;br /&gt;
&lt;br /&gt;
== Что такое стэк протоколов? ==&lt;br /&gt;
Иерархически организованный набор сетевых протоколов, достаточный для организации взаимодействия узлов в сети, примеры — TCP/IP, IPX/SPX.&lt;br /&gt;
&lt;br /&gt;
== Перечислите уровни модели OSI и стека TCP/IP ==&lt;br /&gt;
OSI — Семь уровней (в скобках название единицы обмена): &lt;br /&gt;
* прикладной (APDU)&lt;br /&gt;
* у. представления (PPDU)&lt;br /&gt;
* сеансовый (SPDU)&lt;br /&gt;
* транспортный (TPDU)&lt;br /&gt;
* сетевой (пакет)&lt;br /&gt;
* канальный (кадр)&lt;br /&gt;
* физический (бит). &lt;br /&gt;
TCP/IP:&lt;br /&gt;
* прикладной (HTTP, FTP, DNS)&lt;br /&gt;
* транспортный (TCP, UDP)&lt;br /&gt;
* сетевой (IP)&lt;br /&gt;
* канальный (Ethernet/IEEE 802.11 Wireless Internet/etc).&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;
С. код — код, который можно декодировать без отдельного тактового сигнала/другого источника синхронизации. Примеры: применение синусоид в качестве результирующего сигнала; использование избыточного кодирования; манчестерский код (логическая единица — положительный переход в середине символа, ноль — отрицательный).&lt;br /&gt;
&lt;br /&gt;
== Что такое витая пара? ==&lt;br /&gt;
По стандарту — четыре пары медных проводов, обвитых вокруг друг друга под одной оболочкой.&lt;br /&gt;
&lt;br /&gt;
== Что такое кадр? ==&lt;br /&gt;
Единица передачи данных на уровне передачи данных (канальном уровне)? В Ethernet состоит из хедера (мак исходного адреса, назначения и два байте EtherType), полезная нагрузка, CRC.&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;
Минимальное количество битов, которыми различаются два кодовых слова.&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;quot;коллизия&amp;quot;, в каких системах и на каком уровне возможно её возникновение? ==&lt;br /&gt;
Наложение двух и более кадров от станций, пытающихся передать кадр в один и тот же момент времени в среде передачи коллективного доступа. В системах с широковещательным каналом, на подуровне, управляющим доступом в общей среде, являющимся нижней частью уровня передачи данных.&lt;br /&gt;
&lt;br /&gt;
== Чем &amp;quot;коллизия&amp;quot; отличается от &amp;quot;внешней помехи&amp;quot;? ==&lt;br /&gt;
Коллизия — передаче кадра мешает передача другого; внешняя помеха — передаче кадра мешают проблемы со средой.&lt;br /&gt;
&lt;br /&gt;
== Что такое CSMA/CD? ==&lt;br /&gt;
CSMA — Carrier Sense Multiple Access — множественный доступ с контролем несущей. Слушаем канал, если занят, ждём случайное время. Если свободен — передаём, если коллизия — ждём случайное время. Настойчивость p — передаём с вероятностью p. Детектируем коллизию — шлём jam signal, сообщая о ней другим станциям, потом ждём случайное время… Полудуплекс из-за того, что слушаем канал.&lt;br /&gt;
&lt;br /&gt;
== Зачем нужен алгоритм двоичного экспоненциального отката и как его применение сказывается на разрешении коллизий? ==&lt;br /&gt;
После c коллизий выбираем рандомное число от 0 до 2^c-1, ждём это число. Для того, чтобы увеличить время ожидания при большом количестве коллизий и, как следствие, уменьшить их вероятность при повторной передаче.&lt;br /&gt;
&lt;br /&gt;
== Какие вы знаете методы неконкуретного доступа к общей среде? ==&lt;br /&gt;
Протокол битовой карты (период конкуренции — N, если i-ая станция желает передавать, она шлёт на i-ом интервале бит), двоичный обратный отсчёт — станции передают по очереди биты своего номера, начиная со самого старшего. Побеждает та, у которой наибольший номер.&lt;br /&gt;
&lt;br /&gt;
== Какое физическое кодирование используется в 10Base-T Ethernet? ==&lt;br /&gt;
Манчестерское кодирование.&lt;br /&gt;
&lt;br /&gt;
== Какое кодирование используется в 100Base-T Ethernet? ==&lt;br /&gt;
4b5b (четыре бита кодируются пятью, в целях в т.ч. синхронизации),  MLT-3 (Multi Level Transition — три уровня, -U, 0, +U).&lt;br /&gt;
&lt;br /&gt;
== Чем отличается стандарт 100Base-T4 от 100Base-TX? ==&lt;br /&gt;
T4 использует витую пару категории 3, У T4 нет полного дуплекса.&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;
== Что такое и зачем нужен алгоритм остовного дерева (STP)? ==&lt;br /&gt;
В сети выбирается один корневой мост (англ. Root Bridge). Далее каждый, отличный от корневого, мост просчитывает кратчайший путь к корневому. Соответствующий порт называется корневым портом (англ. Root Port). У любого некорневого коммутатора может быть только один корневой порт. После этого для каждого сегмента сети, к которому присоединён более чем один порт моста, просчитывается кратчайший путь к корневому порту. Мост, через который проходит этот путь, становится назначенным для этой сети (англ. Designated Bridge), а соответствующий порт — назначенным портом (англ. Designated port). Далее во всех сегментах, с которыми соединены более одного порта моста, все мосты блокируют все порты, не являющиеся корневыми и назначенными. В итоге получается древовидная структура (математический граф) с вершиной в виде корневого коммутатор.&lt;br /&gt;
&lt;br /&gt;
Основной задачей STP является устранение петель в топологии произвольной сети Ethernet, в которой есть один или более сетевых мостов, связанных избыточными соединениями. STP решает эту задачу, автоматически блокируя соединения, которые в данный момент для полной связности коммутаторов являются избыточными.&lt;br /&gt;
&lt;br /&gt;
== Зачем нужен уровень MAC и какие задачи он решает? ==&lt;br /&gt;
IEEE разделяет канальный уровень на два подуровня: media access control (MAC) и logical link control (LLC) (управления логической связью). Таким образом, MAC выступает в качестве интерфейса между подуровнем LLC и физическим (первым) уровнем. MAC обеспечивает адресацию и механизмы управления доступом к каналам, что позволяет нескольким терминалам или точкам доступа общаться между собой в многоточечной сети. В широковещательных сетях (таких, как сети на основе Ethernet) MAC-адрес позволяет уникально идентифицировать каждый узел сети и доставлять данные только этому узлу.&lt;br /&gt;
&lt;br /&gt;
== Зачем нужен уровень LLC и какие сервисы он предоставляет? ==&lt;br /&gt;
LLC осуществляет управление передачей данных, обеспечивает проверку и правильность передачи информации по соединению. {{TODO|t=тут, наверное, побольше надо написать}}&lt;br /&gt;
&lt;br /&gt;
== Что такое MAC-адрес в понимании Ethernet сети и как назначаются MAC адреса устройствам? ==&lt;br /&gt;
Первые 3 октета (в порядке их передачи по сети; старшие 3 октета, если рассматривать их в традиционной бит-реверсной шестнадцатеричной записи MAC-адресов) содержат 24-битный уникальный идентификатор организации (OUI), или (Код MFG — Manufacturing, производителя), который производитель получает в IEEE. При этом используются только младшие 22 разряда (бита), 2 старшие имеют специальное назначение: первый бит указывает, для одиночного (0) или группового (1) адресата предназначен кадр, следующий бит указывает, является ли MAC-адрес глобально (0) или локально (1) администрируемым.&lt;br /&gt;
&lt;br /&gt;
Следующие три октета выбираются изготовителем для каждого экземпляра устройства. За исключением сетей системной сетевой архитектуры SNA.&lt;br /&gt;
&lt;br /&gt;
Таким образом, глобально администрируемый MAC-адрес устройства глобально уникален и обычно «зашит» в аппаратуру.&lt;br /&gt;
&lt;br /&gt;
Администратор сети имеет возможность, вместо использования «зашитого», назначить устройству MAC-адрес по своему усмотрению. Такой локально администрируемый MAC-адрес выбирается произвольно.&lt;br /&gt;
&lt;br /&gt;
== Какие вы знаете методы разделения широковещательного канала? ==&lt;br /&gt;
DCF — Distributed Coordination Function. CSMA с избежанием коллизий (jam signal), никакого QoS, возможны инверсии приоритета (всё плохо).&lt;br /&gt;
&lt;br /&gt;
PCF — Point Coordination Function. Работает только, если сеть организована точкой доступа; точка доступа посылает каждые 0.1 секунды специальный сигнал. Между сигналами возможны два периода; в одном она ведёт себя как с DCF, в другом — шлёт станциям пакеты, сообщающие о праве посылать пакеты (AP тут — координатор).&lt;br /&gt;
&lt;br /&gt;
В 802.11e ввели несколько новых функций координации, с QoS. Одна из них (Hybrid Coordination Fuinction) — по сути PCF, но с QoS.&lt;br /&gt;
&lt;br /&gt;
== Что такое шумоподобный сигнал? ==&lt;br /&gt;
Cигнал, содержащий много гармонических (синусоидальных) составляющих в выбранной полосе частот. Шумом называют неупорядоченные случайные сложные колебания со сплошным относительно широким частотным спектром. Отсюда происходит название рассматриваемого сигнала. Использование шумообразных сигналов позволяет значительно уменьшить мощность их источников. Она составляет менее 1 Вт. Кроме этого, применение этих сигналов обеспечивает повышение помехоустройчивости передачи данных.&lt;br /&gt;
&lt;br /&gt;
== Опишите проблемы &amp;quot;скрытой&amp;quot; и &amp;quot;засвеченной&amp;quot; станций в беспроводных сетях. ==&lt;br /&gt;
Описано вот тут: http://book.itep.ru/4/41/i802_418.htm&lt;br /&gt;
&lt;br /&gt;
== Что такое последовательно Баркера и какое её основное свойство? ==&lt;br /&gt;
Числовая последовательность &amp;lt;tex&amp;gt; a_1 , a_2 , \ldots a_N &amp;lt;/tex&amp;gt;, где каждый элемент равен +1 или -1, причём &amp;lt;tex&amp;gt;\forall v : 1 \le v &amp;lt; N&amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt;\left\vert \sum\limits_{j=1}^{N-v} a_j a_{j+v} \right\vert \le 1&amp;lt;/tex&amp;gt;. Последовательности Баркера имеют минимальный уровень боковых лепестков автокорреляционной функции.&lt;br /&gt;
&lt;br /&gt;
== Что такое QPSK? ==&lt;br /&gt;
Фазовая модуляция, при которой возможных значений фазового сдвига 4.&lt;br /&gt;
&lt;br /&gt;
== Что такое СCK коды и когда они применяются вместо кода Баркера? ==&lt;br /&gt;
CCK — Complementary Code Keying. Комплементарными принято называть такие пары последовательностей, для которых сумма автокорреляционных функций последовательностей для любого циклического сдвига, отличного от нуля, всегда равна нулю. Применяются {{TODO|t=WTF}}&lt;br /&gt;
&lt;br /&gt;
== Что такое OFDM? ==&lt;br /&gt;
OFDM — Orthogonal Frequency Division Multiplexing — мультиплексирование разделением на ортогональные несущие. При демультиплексировании в принимающих устройствах используется обратное быстрое преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
== Что такое IEEE 802.11? ==&lt;br /&gt;
Набор стандартов связи для коммуникации в беспроводной локальной сетевой зоне частотных диапазонов 0,9; 2,4; 3,6 и 5 ГГц, описывающих передачу данных на физическом уровне и MAC-уровне.&lt;br /&gt;
&lt;br /&gt;
== Какие есть методы расширения спектра сигнала? ==&lt;br /&gt;
{{TODO|t=допилить, что ли}}&lt;br /&gt;
&lt;br /&gt;
== Что такое PCF и DCF режимы в 802.11? Могут ли одновременно работать станции по PCF и DCF? ==&lt;br /&gt;
По идее, это аналогично вопросу 35. Могут ли одновременно — да, кто мешает? В какой-то из периодов PCF, насколько я помню, вполне может использоваться DCF.&lt;br /&gt;
&lt;br /&gt;
== Что описывают стандарты IEEE 802.16 и 802.16e? ==&lt;br /&gt;
WMAN (Wireless MAN) — беспроводные сети масштаба города. Стандарты описывают их работу на физическом уровне, LLC и MAC.&lt;br /&gt;
&lt;br /&gt;
== Что такое и зачем нужен протокол скользящего окна? ==&lt;br /&gt;
Он работает следующим образом: посылатель посылает какое-то фиксированное количество байт (размер окна), если информация пришла вовремя и без искажений, то получатель посылает отправителю подтверждение — квитанцию. Нужен — для гарантии передачи данных.&lt;br /&gt;
&lt;br /&gt;
== Что такое ACK в протоколах передачи данных? Что такое NAK и когда выгодно его использовать? ==&lt;br /&gt;
ACK — сигнал, означающий подтверждение принятия данных, NAK говорит о том, что данные не пришли. NAK выгодно использовать в случае со стабильной связью (при которой почти не понадобится его посылать).&lt;br /&gt;
&lt;br /&gt;
== Что такое многомодовое и что такое одномодовое оптоволокно? ==&lt;br /&gt;
Одномодовое оптоволокно — волокно, которое может передавать только один луч света одновременно. Многоводовое — соответственно, несколько.&lt;br /&gt;
&lt;br /&gt;
== Как достигается одномодовый режим работы оптоволокна? ==&lt;br /&gt;
Волокно делают настолько тонким, что диаметр доходит до нескольких длин волн света, в результате чего волокно действует подобно волноводу. {{TODO|t=уточнить, если я правильно понял, в вопросе говорится про то, что многомодовое волокно может работать в одномодовом режиме}}&lt;br /&gt;
&lt;br /&gt;
== Что такое &amp;quot;окна прозрачности в оптоволокне&amp;quot;? ==&lt;br /&gt;
Диапазон длин волн оптического излучения, в котором имеет место меньшее, по сравнению с другими диапазонами, затухание излучения в волокне.&lt;br /&gt;
&lt;br /&gt;
== Что такое технологии WDM? ==&lt;br /&gt;
WDM (Wavelength-division multiplexing) — мультиплексирование с разделением по длине волны — технология, позволяющая одновременно передавать несколько информационных каналов по одному оптическому волокну на разных несущих частотах. WDM позволяет существенно увеличить пропускную способность канала, причем она позволяет использовать уже проложенные волоконно-оптические линии.&lt;br /&gt;
&lt;br /&gt;
== В чём принцип технологий PON? ==&lt;br /&gt;
PON (Passive Optical Network) — технология, основанная на древовидной волоконно-кабельной архитектуре с пассивными оптическими разветвителями на узлах, представляет экономичный способ обеспечить широкополосную передачу информации. При этом архитектура PON обладает необходимой эффективностью наращивания узлов сети и пропускной способности, в зависимости от настоящих и будущих потребностей абонентов. Основная идея: использование всего одного приёмопередающего модуля в OLT (optical line terminal) для передачи информации множеству абонентских устройств ONT (optical network terminal) и приёма информации от них. Все узлы-абоненты ведут передачу на одной и той же длине волны, поэтому для разделения сигналов используется концепция множественного доступа с временным разделением.&lt;br /&gt;
&lt;br /&gt;
== Что такое эрбиевый усилитель сигнала? Зачем он нужен? ==&lt;br /&gt;
Волоконно-оптический усилитель на оптическом волокне, легированном ионами эрбия. Применяется в волоконно-оптических линиях передачи для восстановления уровня оптического сигнала. Преимуществом эрбиевых усилителей является отсутствие преобразования в электрический сигнал, возможность одновременного усиления сигналов с разными длинами волн (что обуславливает возможность усиления спектрально-мультиплексированного сигнала), практически точное соответствие рабочего диапазона эрбиевых усилителей области минимальных оптических потерь световодов на основе кварцевого стекла, сравнительно низкий уровень шума и простота включения в волоконно-оптическую систему.&lt;br /&gt;
&lt;br /&gt;
Относительно мощный пучок света смешивается с входным сигналом, используя ответвитель с селекцией по длине волн. Входной сигнал и свет возбуждения должны иметь существенно отличающиеся длины волн. Смешанный свет попадает в раздел волокна с ионами эрбия, добавленными в ядро. Этот мощный световой луч возбуждает ионы эрбия до их более высокого энергетического состояния. Когда фотоны, принадлежащие сигналу в отличной длине волны от накачанного света, встречают возбужденные атомы эрбия, атомы эрбия отдают часть своей энергии сигналу и возвращаются к их более низкому энергетическому состоянию. Важный момент — то, что эрбий отдает свою энергию в форме дополнительных фотонов, которые находятся в той же фазе и направлении, как и усиливаемый сигнал. Таким образом, сигнал усиливается только вдоль его направления перемещения. Вся дополнительная мощность сигнала ведется в том же самом режиме волокна как и входящий сигнал. Обычно есть изолятор, помещенный в вывод, чтобы предотвратить отражения, возвращающиеся из присоединенного волокна. Такие отражения разрушают работу усилителя, и в крайнем случае могут заставить усилитель работать как лазер.&lt;br /&gt;
&lt;br /&gt;
= Тест 2 =&lt;br /&gt;
&lt;br /&gt;
== Что такое элементарный и составной каналы в сетях с канальной коммутацией? ==&lt;br /&gt;
Элементарный канал — базовая техническая характеристика сети с коммутацией каналов, представляющая собой некоторое фиксированное в пределах данного типа сетей значение пропускной способности. Любая линия в сети с коммутацией каналов имеет пропускную способность, кратную элементарному каналу, принятому для данного типа сети.&lt;br /&gt;
&lt;br /&gt;
== Перечислите примеры протоколов стека TCP/IP по уровням ==&lt;br /&gt;
* прикладной (binkp, FTP, Finger, DNS, Gnutella, Gopher, HTTP, HTTPS, IMAP, IRC, XMPP, LDAP, NTP, NNTP, POP3, RDP, SMB, SSH, SMTP, Telnet, SNMP, SIP, DMX-512)&lt;br /&gt;
* транспортный (SPX, XOT, BGP, ISODE, DVMRP, TCP, UDP, SCTP, RDP/RUDP, RTCP)&lt;br /&gt;
* сетевой (ICMP, IPv4, IPv6, IPX, ARP)&lt;br /&gt;
* канальный (Ethernet/IEEE 802.11, Wireless Internet, Token ring, FDDI, HDLC, GVRP, PPP, PPTP, L2TP, ATM, xDSL).&lt;br /&gt;
&lt;br /&gt;
== Какая бывает модуляция? ==&lt;br /&gt;
Фазовая (в зависимости от входного сигнала выходной сдвигается на какую-то фазу), амплитудная (в зависимости от входного сигнала изменяется амплитуда выходного), частотная (в зависимости от входного сигнала изменяется частота выходного).&lt;br /&gt;
&lt;br /&gt;
== Приведите примеры вариантов физического кодирования ==&lt;br /&gt;
===2 уровня===&lt;br /&gt;
* NRZ (Non Return Zero) — простейший код, 1 — есть ток, 0 — нет;&lt;br /&gt;
* NRZI (Non Return Zero Inverted) — смена сигнала происходит при передаче единицы, передача нуля не приводит к изменению сигнала;&lt;br /&gt;
* RZ (Return to Zero) — 0 — положительное напряжение, 1 — отрицательное, в середине сигнала происходит переход в отсутствие напряжение;&lt;br /&gt;
* Манчестерский код — (логическая единица — положительный переход в середине символа, ноль — отрицательный).&lt;br /&gt;
===3 уровня===&lt;br /&gt;
* Биполярный код AMI - биты 0 представляются нулевым напряжением (0 В), биты 1 представляются поочерёдно значениями -U или +U (В);&lt;br /&gt;
* MLT-3 Multi Level Transmission — 3 (многоуровневая передача) — метод кодирования, использующий три уровня сигнала. Метод основывается на циклическом переключении уровней -U, 0, +U. Единице соответствует переход с одного уровня сигнала на следующий. Так же как и в методе NRZI при передаче «нуля» сигнал не меняется.&lt;br /&gt;
===4 уровня===&lt;br /&gt;
Потенциальный код 2B1Q передает пару бит за один битовый интервал. Каждой возможной паре в соответствие ставится свой уровень из четырех возможных уровней потенциала: &amp;quot;00&amp;quot; = &amp;lt;tex&amp;gt;-2.5&amp;lt;/tex&amp;gt;, &amp;quot;01&amp;quot; = &amp;lt;tex&amp;gt;−0.833&amp;lt;/tex&amp;gt;, &amp;quot;11&amp;quot; = &amp;lt;tex&amp;gt;+0.833&amp;lt;/tex&amp;gt;, &amp;quot;10&amp;quot; = &amp;lt;tex&amp;gt;+2.5&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;
После &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; коллизий выбираем рандомное число от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;2^c - 1&amp;lt;/tex&amp;gt;, ждём это число. Для того, чтобы увеличить время ожидания при большом количестве коллизий и, как следствие, уменьшить их вероятность при повторной передаче. &lt;br /&gt;
&lt;br /&gt;
== Нарисуйте схему CSMA/CD ==&lt;br /&gt;
схему? лолшто?&lt;br /&gt;
CSMA — Carrier Sense Multiple Access — множественный доступ с контролем несущей. Слушаем канал, если занят, ждём случайное время. Если свободен — передаём, если коллизия — ждём случайное время. Настойчивость &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; — передаём с вероятностью &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;. Детектируем коллизию — шлём jam signal, сообщая о ней другим станциям, потом ждём случайное время… Полудуплекс из-за того, что слушаем канал.&lt;br /&gt;
&lt;br /&gt;
== Какое кодирование используется в 100 мегабитном Ethernet? == &lt;br /&gt;
В 100BASE-T4 используется 8B6T (8 двоичных символов кодируются 6 тернарными), в 100BASE-TX — 4B5B (4 двоичных символа кодируются 5 двоичными, на более нижнем уровне используется NRZI, поэтому один «лишний» символ используется для синхронизации)&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;
&lt;br /&gt;
== Что такое и зачем нужен алгоритм остовного дерева (STP)? ==&lt;br /&gt;
В сети выбирается один корневой мост (англ. Root Bridge). Далее каждый, отличный от корневого, мост просчитывает кратчайший путь к корневому. Соответствующий порт называется корневым портом (англ. Root Port). У любого некорневого коммутатора может быть только один корневой порт. После этого для каждого сегмента сети, к которому присоединён более чем один порт моста, просчитывается кратчайший путь к корневому порту. Мост, через который проходит этот путь, становится назначенным для этой сети (англ. Designated Bridge), а соответствующий порт — назначенным портом (англ. Designated port). Далее во всех сегментах, с которыми соединены более одного порта моста, все мосты блокируют все порты, не являющиеся корневыми и назначенными. В итоге получается древовидная структура (математический граф) с вершиной в виде корневого коммутатор.&lt;br /&gt;
&lt;br /&gt;
Основной задачей STP является устранение петель в топологии произвольной сети Ethernet, в которой есть один или более сетевых мостов, связанных избыточными соединениями. STP решает эту задачу, автоматически блокируя соединения, которые в данный момент для полной связности коммутаторов являются избыточными.&lt;br /&gt;
&lt;br /&gt;
== Какую задачу решает уровень MAC? ==&lt;br /&gt;
IEEE разделяет канальный уровень на два подуровня: media access control (MAC) и logical link control (LLC) (управления логической связью). Таким образом, MAC выступает в качестве интерфейса между подуровнем LLC и физическим (первым) уровнем. MAC обеспечивает адресацию и механизмы управления доступом к каналам, что позволяет нескольким терминалам или точкам доступа общаться между собой в многоточечной сети. В широковещательных сетях (таких, как сети на основе Ethernet) MAC-адрес позволяет уникально идентифицировать каждый узел сети и доставлять данные только этому узлу.&lt;br /&gt;
&lt;br /&gt;
== Какие есть варианты разделения широковещательного канала? ==&lt;br /&gt;
DCF — Distributed Coordination Function. CSMA с избежанием коллизий (jam signal), никакого QoS, возможны инверсии приоритета (всё плохо).&lt;br /&gt;
&lt;br /&gt;
PCF — Point Coordination Function. Работает только, если сеть организована точкой доступа; точка доступа посылает каждые 0.1 секунды специальный сигнал. Между сигналами возможны два периода; в одном она ведёт себя как с DCF, в другом — шлёт станциям пакеты, сообщающие о праве посылать пакеты (AP тут — координатор).&lt;br /&gt;
&lt;br /&gt;
В 802.11e ввели несколько новых функций координации, с QoS. Одна из них (Hybrid Coordination Fuinction) — по сути PCF, но с QoS.&lt;br /&gt;
&lt;br /&gt;
== Какие сервисы предоставляет подуровень LLC? ==&lt;br /&gt;
LLC осуществляет управление передачей данных, обеспечивает проверку и правильность передачи информации по соединению.&lt;br /&gt;
&lt;br /&gt;
== Что такое шумоподобный сигнал? ==&lt;br /&gt;
Cигнал, содержащий много гармонических (синусоидальных) составляющих в выбранной полосе частот. Шумом называют неупорядоченные случайные сложные колебания со сплошным относительно широким частотным спектром. Отсюда происходит название рассматриваемого сигнала. Использование шумообразных сигналов позволяет значительно уменьшить мощность их источников. Она составляет менее 1 Вт. Кроме этого, применение этих сигналов обеспечивает повышение помехоустойчивости передачи данных. &lt;br /&gt;
&lt;br /&gt;
== Что такое проблема засвеченной станции и проблема скрытой станции? ==&lt;br /&gt;
===проблема скрытой станции===&lt;br /&gt;
В случае, когда расстояние между передатчиком и приемником сравнимо с радиусом надежной связи, отличие от традиционных сетей становится значительным. Ведь для радиосетей важна интерференция на входе приемника, а не на выходе передатчика (как в CSMA). Если передачу осуществляет узел А, узел С находится вне его радиуса действия и может решить, что можно начать передачу. Излучение передатчика С может вызвать помехи на входе узла В.&lt;br /&gt;
===проблема засвеченной станции===&lt;br /&gt;
В случае, когда передачу ведет узел В, узел С может решить, что начало передачи сообщения узлу D не возможно, так как в зоне С детектируется излучение станции В. Таким образом, в радиосетях, прежде чем начать передачу данных надо знать, имеется ли радио активность в зоне приемника-адресата.&lt;br /&gt;
&lt;br /&gt;
== Что такое OFDM? ==&lt;br /&gt;
OFDM — Orthogonal Frequency Division Multiplexing — мультиплексирование разделением на ортогональные несущие. При демультиплексировании в принимающих устройствах используется обратное быстрое преобразование Фурье. &lt;br /&gt;
&lt;br /&gt;
== Чем многомодовое оптоволокно отличается от одномодового? ==&lt;br /&gt;
Одномодовое оптоволокно — волокно, которое может передавать только один луч света одновременно. Многоводовое — соответственно, несколько.&lt;br /&gt;
&lt;br /&gt;
== Что такое CWDM? ==&lt;br /&gt;
CWDM (Coarse WDM) — «грубое» WDM с разносом каналов более 2500 ГГц, позволяет мультиплексировать не более 18 каналов.&lt;br /&gt;
&lt;br /&gt;
== В чём отличительная особенность технологии PON? ==&lt;br /&gt;
PON (Passive Optical Network) — технология, основанная на древовидной волоконно-кабельной архитектуре с пассивными оптическими разветвителями на узлах, представляет экономичный способ обеспечить широкополосную передачу информации. При этом архитектура PON обладает необходимой эффективностью наращивания узлов сети и пропускной способности, в зависимости от настоящих и будущих потребностей абонентов. Основная идея: использование всего одного приёмопередающего модуля в OLT (optical line terminal) для передачи информации множеству абонентских устройств ONT (optical network terminal) и приёма информации от них. Все узлы-абоненты ведут передачу на одной и той же длине волны, поэтому для разделения сигналов используется концепция множественного доступа с временным разделением. &lt;br /&gt;
&lt;br /&gt;
== Перечислите сервисы сетевого уровня ==&lt;br /&gt;
&lt;br /&gt;
===модели соединения: с установкой соединения и без установки соединения===&lt;br /&gt;
Сетевой уровень модели OSI может быть как с установкой соединения, так и без него. Для сравнения — Межсетевой уровень (англ. internet) стека протоколов Модели DoD (Модель TCP/IP) поддерживает только протокол IP, который является протоколом без установки соединения; протоколы с установкой соединения находятся на следующих уровнях этой модели.&lt;br /&gt;
===адрес, присвоенный сетевому узлу===&lt;br /&gt;
Каждый хост в сети должен иметь уникальный адрес, который определяет, где он находится. Этот адрес обычно назначается из иерархической системы. В Интернете адреса известны как адреса протокола IP.&lt;br /&gt;
===продвижение данных===&lt;br /&gt;
Так как многие сети разделены на подсети и соединяются с другими сетями широковещательными каналами, сети используют специальные хосты, которые называются шлюзами или роутерами (маршрутизаторами) для доставления пакетов между сетями. Это также используется в интересах мобильных приложений, когда пользователь двигается от одного приложения к другому, в этом случае пакеты (сообщения) должны следовать за ним. В протоколе IPv4 такая идея описана, но практически не применяется. IPv6 содержит более рациональное решение.&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;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:SkudarnovYaroslav/%D0%A2%D0%B5%D0%BE%D1%80%D0%BC%D0%B8%D0%BD_%D0%BA_%D0%B7%D0%B0%D1%87%D1%91%D1%82%D1%83_%D0%BF%D0%BE_%D1%81%D0%B5%D1%82%D1%8F%D0%BC&amp;diff=45053</id>
		<title>Участник:SkudarnovYaroslav/Теормин к зачёту по сетям</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:SkudarnovYaroslav/%D0%A2%D0%B5%D0%BE%D1%80%D0%BC%D0%B8%D0%BD_%D0%BA_%D0%B7%D0%B0%D1%87%D1%91%D1%82%D1%83_%D0%BF%D0%BE_%D1%81%D0%B5%D1%82%D1%8F%D0%BC&amp;diff=45053"/>
				<updated>2015-03-20T18:34:01Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Тест 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Тест 1 =&lt;br /&gt;
== Дайте определение компьютерной сети ==&lt;br /&gt;
Компьютерная сеть — совокупность компьютеров, объединённых с помощью телекоммуникаций (т. — связь при помощи электронных устройств) для совместного использования данных/ресурсов. Распределённая система — совокупность объединённых компьютеров (аналогично тому, что выше), посредством специального ПО предоставляющих пользователю интерфейс единой системы.&lt;br /&gt;
&lt;br /&gt;
== Какие области технического прогресса породили компьютерные сети? ==&lt;br /&gt;
Коммуникации и компьютерные технологии.&lt;br /&gt;
&lt;br /&gt;
== Приведите классификации компьютерных сетей ==&lt;br /&gt;
а) По размерам (территориальному признаку функционирования): Desk Area Network (рабочая станция; обмен данными организован на основе ATM ({{TODO|t=???}}), Personal Area Network (сеть устройств пользователя), Local Area Network (соединяет устройства в помещениях — домах, школах и т.д.), Metropolitan Area Network (соединяет устройства в одном городе), Wide Area Network (охватывает большие территории, связывает более маленькие сети, ниже скорость), Internet ({{TODO|t=крупнейшая WAN?}})&lt;br /&gt;
&lt;br /&gt;
б) По скорости передачи данных: низкоскоростные — до 10 Мбит/с, среднескоростные — до 100 Мбит/c, высокоскоростные — свыше 100 Мбит/с.&lt;br /&gt;
&lt;br /&gt;
в) По типу среды передачи данных: проводные, беспроводные.&lt;br /&gt;
&lt;br /&gt;
г) По типу абонентов: стационарные/мобильные.&lt;br /&gt;
&lt;br /&gt;
д) По правовой принадлежности: частные, государственные, общественные ({{TODO|t=по идее, последнее должно относиться либо к первому, либо ко второму}}).&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;
* Шина {{---}} 10BASE5, 10BASE2&lt;br /&gt;
* Кольцо {{---}} FDDI Ring&lt;br /&gt;
* Звезда {{---}} что-то про Ethernet Hub&lt;br /&gt;
* Ячеистая {{---}} Netsukuku&lt;br /&gt;
&lt;br /&gt;
== Сформулируйте обобщённую задачу коммутации ==&lt;br /&gt;
а) Определение потоков, для которых требуется прокладка маршрута. б) Маршрутизация (определение маршрута). в) Продвижение потоков (распознавание потоков и локальная коммутация на транзитных узлах. устройство, коммутирующее интерфейсы — коммутатор). г) Мультиплексирование (разделение агрегированного потока на составляющие) и демультиплексирование (наоборот, образование из отдельных агрегированный).&lt;br /&gt;
&lt;br /&gt;
== В чем отличия канальной и пакетной коммутации? ==&lt;br /&gt;
Пакеты поступают в сеть без резервирования линии связи. Маршрут следования хранится на промежуточных узлах и формируется вручную/автоматически (в случае с каналами он становится известен сразу после создания составного канала). Доставка пакетов в правильном порядке без искажений не гарантируется. У пакетных коммутаторов есть буферная память для временного хранения пакетов (промежуточное хранение).&lt;br /&gt;
&lt;br /&gt;
== Что такое эталонная модель OSI? ==&lt;br /&gt;
Модель стека сетевых протоколов, определяющая, что должен делать каждый уровень, разрабатывалась в семидесятых-восьмидесятых годах.&lt;br /&gt;
&lt;br /&gt;
== Что такое стэк протоколов? ==&lt;br /&gt;
Иерархически организованный набор сетевых протоколов, достаточный для организации взаимодействия узлов в сети, примеры — TCP/IP, IPX/SPX.&lt;br /&gt;
&lt;br /&gt;
== Перечислите уровни модели OSI и стека TCP/IP ==&lt;br /&gt;
OSI — Семь уровней (в скобках название единицы обмена): &lt;br /&gt;
* прикладной (APDU)&lt;br /&gt;
* у. представления (PPDU)&lt;br /&gt;
* сеансовый (SPDU)&lt;br /&gt;
* транспортный (TPDU)&lt;br /&gt;
* сетевой (пакет)&lt;br /&gt;
* канальный (кадр)&lt;br /&gt;
* физический (бит). &lt;br /&gt;
TCP/IP:&lt;br /&gt;
* прикладной (HTTP, FTP, DNS)&lt;br /&gt;
* транспортный (TCP, UDP)&lt;br /&gt;
* сетевой (IP)&lt;br /&gt;
* канальный (Ethernet/IEEE 802.11 Wireless Internet/etc).&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;
С. код — код, который можно декодировать без отдельного тактового сигнала/другого источника синхронизации. Примеры: применение синусоид в качестве результирующего сигнала; использование избыточного кодирования; манчестерский код (логическая единица — положительный переход в середине символа, ноль — отрицательный).&lt;br /&gt;
&lt;br /&gt;
== Что такое витая пара? ==&lt;br /&gt;
По стандарту — четыре пары медных проводов, обвитых вокруг друг друга под одной оболочкой.&lt;br /&gt;
&lt;br /&gt;
== Что такое кадр? ==&lt;br /&gt;
Единица передачи данных на уровне передачи данных (канальном уровне)? В Ethernet состоит из хедера (мак исходного адреса, назначения и два байте EtherType), полезная нагрузка, CRC.&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;
Минимальное количество битов, которыми различаются два кодовых слова.&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;quot;коллизия&amp;quot;, в каких системах и на каком уровне возможно её возникновение? ==&lt;br /&gt;
Наложение двух и более кадров от станций, пытающихся передать кадр в один и тот же момент времени в среде передачи коллективного доступа. В системах с широковещательным каналом, на подуровне, управляющим доступом в общей среде, являющимся нижней частью уровня передачи данных.&lt;br /&gt;
&lt;br /&gt;
== Чем &amp;quot;коллизия&amp;quot; отличается от &amp;quot;внешней помехи&amp;quot;? ==&lt;br /&gt;
Коллизия — передаче кадра мешает передача другого; внешняя помеха — передаче кадра мешают проблемы со средой.&lt;br /&gt;
&lt;br /&gt;
== Что такое CSMA/CD? ==&lt;br /&gt;
CSMA — Carrier Sense Multiple Access — множественный доступ с контролем несущей. Слушаем канал, если занят, ждём случайное время. Если свободен — передаём, если коллизия — ждём случайное время. Настойчивость p — передаём с вероятностью p. Детектируем коллизию — шлём jam signal, сообщая о ней другим станциям, потом ждём случайное время… Полудуплекс из-за того, что слушаем канал.&lt;br /&gt;
&lt;br /&gt;
== Зачем нужен алгоритм двоичного экспоненциального отката и как его применение сказывается на разрешении коллизий? ==&lt;br /&gt;
После c коллизий выбираем рандомное число от 0 до 2^c-1, ждём это число. Для того, чтобы увеличить время ожидания при большом количестве коллизий и, как следствие, уменьшить их вероятность при повторной передаче.&lt;br /&gt;
&lt;br /&gt;
== Какие вы знаете методы неконкуретного доступа к общей среде? ==&lt;br /&gt;
Протокол битовой карты (период конкуренции — N, если i-ая станция желает передавать, она шлёт на i-ом интервале бит), двоичный обратный отсчёт — станции передают по очереди биты своего номера, начиная со самого старшего. Побеждает та, у которой наибольший номер.&lt;br /&gt;
&lt;br /&gt;
== Какое физическое кодирование используется в 10Base-T Ethernet? ==&lt;br /&gt;
Манчестерское кодирование.&lt;br /&gt;
&lt;br /&gt;
== Какое кодирование используется в 100Base-T Ethernet? ==&lt;br /&gt;
4b5b (четыре бита кодируются пятью, в целях в т.ч. синхронизации),  MLT-3 (Multi Level Transition — три уровня, -U, 0, +U).&lt;br /&gt;
&lt;br /&gt;
== Чем отличается стандарт 100Base-T4 от 100Base-TX? ==&lt;br /&gt;
T4 использует витую пару категории 3, У T4 нет полного дуплекса.&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;
== Что такое и зачем нужен алгоритм остовного дерева (STP)? ==&lt;br /&gt;
В сети выбирается один корневой мост (англ. Root Bridge). Далее каждый, отличный от корневого, мост просчитывает кратчайший путь к корневому. Соответствующий порт называется корневым портом (англ. Root Port). У любого некорневого коммутатора может быть только один корневой порт. После этого для каждого сегмента сети, к которому присоединён более чем один порт моста, просчитывается кратчайший путь к корневому порту. Мост, через который проходит этот путь, становится назначенным для этой сети (англ. Designated Bridge), а соответствующий порт — назначенным портом (англ. Designated port). Далее во всех сегментах, с которыми соединены более одного порта моста, все мосты блокируют все порты, не являющиеся корневыми и назначенными. В итоге получается древовидная структура (математический граф) с вершиной в виде корневого коммутатор.&lt;br /&gt;
&lt;br /&gt;
Основной задачей STP является устранение петель в топологии произвольной сети Ethernet, в которой есть один или более сетевых мостов, связанных избыточными соединениями. STP решает эту задачу, автоматически блокируя соединения, которые в данный момент для полной связности коммутаторов являются избыточными.&lt;br /&gt;
&lt;br /&gt;
== Зачем нужен уровень MAC и какие задачи он решает? ==&lt;br /&gt;
IEEE разделяет канальный уровень на два подуровня: media access control (MAC) и logical link control (LLC) (управления логической связью). Таким образом, MAC выступает в качестве интерфейса между подуровнем LLC и физическим (первым) уровнем. MAC обеспечивает адресацию и механизмы управления доступом к каналам, что позволяет нескольким терминалам или точкам доступа общаться между собой в многоточечной сети. В широковещательных сетях (таких, как сети на основе Ethernet) MAC-адрес позволяет уникально идентифицировать каждый узел сети и доставлять данные только этому узлу.&lt;br /&gt;
&lt;br /&gt;
== Зачем нужен уровень LLC и какие сервисы он предоставляет? ==&lt;br /&gt;
LLC осуществляет управление передачей данных, обеспечивает проверку и правильность передачи информации по соединению. {{TODO|t=тут, наверное, побольше надо написать}}&lt;br /&gt;
&lt;br /&gt;
== Что такое MAC-адрес в понимании Ethernet сети и как назначаются MAC адреса устройствам? ==&lt;br /&gt;
Первые 3 октета (в порядке их передачи по сети; старшие 3 октета, если рассматривать их в традиционной бит-реверсной шестнадцатеричной записи MAC-адресов) содержат 24-битный уникальный идентификатор организации (OUI), или (Код MFG — Manufacturing, производителя), который производитель получает в IEEE. При этом используются только младшие 22 разряда (бита), 2 старшие имеют специальное назначение: первый бит указывает, для одиночного (0) или группового (1) адресата предназначен кадр, следующий бит указывает, является ли MAC-адрес глобально (0) или локально (1) администрируемым.&lt;br /&gt;
&lt;br /&gt;
Следующие три октета выбираются изготовителем для каждого экземпляра устройства. За исключением сетей системной сетевой архитектуры SNA.&lt;br /&gt;
&lt;br /&gt;
Таким образом, глобально администрируемый MAC-адрес устройства глобально уникален и обычно «зашит» в аппаратуру.&lt;br /&gt;
&lt;br /&gt;
Администратор сети имеет возможность, вместо использования «зашитого», назначить устройству MAC-адрес по своему усмотрению. Такой локально администрируемый MAC-адрес выбирается произвольно.&lt;br /&gt;
&lt;br /&gt;
== Какие вы знаете методы разделения широковещательного канала? ==&lt;br /&gt;
DCF — Distributed Coordination Function. CSMA с избежанием коллизий (jam signal), никакого QoS, возможны инверсии приоритета (всё плохо).&lt;br /&gt;
&lt;br /&gt;
PCF — Point Coordination Function. Работает только, если сеть организована точкой доступа; точка доступа посылает каждые 0.1 секунды специальный сигнал. Между сигналами возможны два периода; в одном она ведёт себя как с DCF, в другом — шлёт станциям пакеты, сообщающие о праве посылать пакеты (AP тут — координатор).&lt;br /&gt;
&lt;br /&gt;
В 802.11e ввели несколько новых функций координации, с QoS. Одна из них (Hybrid Coordination Fuinction) — по сути PCF, но с QoS.&lt;br /&gt;
&lt;br /&gt;
== Что такое шумоподобный сигнал? ==&lt;br /&gt;
Cигнал, содержащий много гармонических (синусоидальных) составляющих в выбранной полосе частот. Шумом называют неупорядоченные случайные сложные колебания со сплошным относительно широким частотным спектром. Отсюда происходит название рассматриваемого сигнала. Использование шумообразных сигналов позволяет значительно уменьшить мощность их источников. Она составляет менее 1 Вт. Кроме этого, применение этих сигналов обеспечивает повышение помехоустройчивости передачи данных.&lt;br /&gt;
&lt;br /&gt;
== Опишите проблемы &amp;quot;скрытой&amp;quot; и &amp;quot;засвеченной&amp;quot; станций в беспроводных сетях. ==&lt;br /&gt;
Описано вот тут: http://book.itep.ru/4/41/i802_418.htm&lt;br /&gt;
&lt;br /&gt;
== Что такое последовательно Баркера и какое её основное свойство? ==&lt;br /&gt;
Числовая последовательность &amp;lt;tex&amp;gt; a_1 , a_2 , \ldots a_N &amp;lt;/tex&amp;gt;, где каждый элемент равен +1 или -1, причём &amp;lt;tex&amp;gt;\forall v : 1 \le v &amp;lt; N&amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt;\left\vert \sum\limits_{j=1}^{N-v} a_j a_{j+v} \right\vert \le 1&amp;lt;/tex&amp;gt;. Последовательности Баркера имеют минимальный уровень боковых лепестков автокорреляционной функции.&lt;br /&gt;
&lt;br /&gt;
== Что такое QPSK? ==&lt;br /&gt;
Фазовая модуляция, при которой возможных значений фазового сдвига 4.&lt;br /&gt;
&lt;br /&gt;
== Что такое СCK коды и когда они применяются вместо кода Баркера? ==&lt;br /&gt;
CCK — Complementary Code Keying. Комплементарными принято называть такие пары последовательностей, для которых сумма автокорреляционных функций последовательностей для любого циклического сдвига, отличного от нуля, всегда равна нулю. Применяются {{TODO|t=WTF}}&lt;br /&gt;
&lt;br /&gt;
== Что такое OFDM? ==&lt;br /&gt;
OFDM — Orthogonal Frequency Division Multiplexing — мультиплексирование разделением на ортогональные несущие. При демультиплексировании в принимающих устройствах используется обратное быстрое преобразование Фурье.&lt;br /&gt;
&lt;br /&gt;
== Что такое IEEE 802.11? ==&lt;br /&gt;
Набор стандартов связи для коммуникации в беспроводной локальной сетевой зоне частотных диапазонов 0,9; 2,4; 3,6 и 5 ГГц, описывающих передачу данных на физическом уровне и MAC-уровне.&lt;br /&gt;
&lt;br /&gt;
== Какие есть методы расширения спектра сигнала? ==&lt;br /&gt;
{{TODO|t=допилить, что ли}}&lt;br /&gt;
&lt;br /&gt;
== Что такое PCF и DCF режимы в 802.11? Могут ли одновременно работать станции по PCF и DCF? ==&lt;br /&gt;
По идее, это аналогично вопросу 35. Могут ли одновременно — да, кто мешает? В какой-то из периодов PCF, насколько я помню, вполне может использоваться DCF.&lt;br /&gt;
&lt;br /&gt;
== Что описывают стандарты IEEE 802.16 и 802.16e? ==&lt;br /&gt;
WMAN (Wireless MAN) — беспроводные сети масштаба города. Стандарты описывают их работу на физическом уровне, LLC и MAC.&lt;br /&gt;
&lt;br /&gt;
== Что такое и зачем нужен протокол скользящего окна? ==&lt;br /&gt;
Он работает следующим образом: посылатель посылает какое-то фиксированное количество байт (размер окна), если информация пришла вовремя и без искажений, то получатель посылает отправителю подтверждение — квитанцию. Нужен — для гарантии передачи данных.&lt;br /&gt;
&lt;br /&gt;
== Что такое ACK в протоколах передачи данных? Что такое NAK и когда выгодно его использовать? ==&lt;br /&gt;
ACK — сигнал, означающий подтверждение принятия данных, NAK говорит о том, что данные не пришли. NAK выгодно использовать в случае со стабильной связью (при которой почти не понадобится его посылать).&lt;br /&gt;
&lt;br /&gt;
== Что такое многомодовое и что такое одномодовое оптоволокно? ==&lt;br /&gt;
Одномодовое оптоволокно — волокно, которое может передавать только один луч света одновременно. Многоводовое — соответственно, несколько.&lt;br /&gt;
&lt;br /&gt;
== Как достигается одномодовый режим работы оптоволокна? ==&lt;br /&gt;
Волокно делают настолько тонким, что диаметр доходит до нескольких длин волн света, в результате чего волокно действует подобно волноводу. {{TODO|t=уточнить, если я правильно понял, в вопросе говорится про то, что многомодовое волокно может работать в одномодовом режиме}}&lt;br /&gt;
&lt;br /&gt;
== Что такое &amp;quot;окна прозрачности в оптоволокне&amp;quot;? ==&lt;br /&gt;
Диапазон длин волн оптического излучения, в котором имеет место меньшее, по сравнению с другими диапазонами, затухание излучения в волокне.&lt;br /&gt;
&lt;br /&gt;
== Что такое технологии WDM? ==&lt;br /&gt;
WDM (Wavelength-division multiplexing) — мультиплексирование с разделением по длине волны — технология, позволяющая одновременно передавать несколько информационных каналов по одному оптическому волокну на разных несущих частотах. WDM позволяет существенно увеличить пропускную способность канала, причем она позволяет использовать уже проложенные волоконно-оптические линии.&lt;br /&gt;
&lt;br /&gt;
== В чём принцип технологий PON? ==&lt;br /&gt;
PON (Passive Optical Network) — технология, основанная на древовидной волоконно-кабельной архитектуре с пассивными оптическими разветвителями на узлах, представляет экономичный способ обеспечить широкополосную передачу информации. При этом архитектура PON обладает необходимой эффективностью наращивания узлов сети и пропускной способности, в зависимости от настоящих и будущих потребностей абонентов. Основная идея: использование всего одного приёмопередающего модуля в OLT (optical line terminal) для передачи информации множеству абонентских устройств ONT (optical network terminal) и приёма информации от них. Все узлы-абоненты ведут передачу на одной и той же длине волны, поэтому для разделения сигналов используется концепция множественного доступа с временным разделением.&lt;br /&gt;
&lt;br /&gt;
== Что такое эрбиевый усилитель сигнала? Зачем он нужен? ==&lt;br /&gt;
Волоконно-оптический усилитель на оптическом волокне, легированном ионами эрбия. Применяется в волоконно-оптических линиях передачи для восстановления уровня оптического сигнала. Преимуществом эрбиевых усилителей является отсутствие преобразования в электрический сигнал, возможность одновременного усиления сигналов с разными длинами волн (что обуславливает возможность усиления спектрально-мультиплексированного сигнала), практически точное соответствие рабочего диапазона эрбиевых усилителей области минимальных оптических потерь световодов на основе кварцевого стекла, сравнительно низкий уровень шума и простота включения в волоконно-оптическую систему.&lt;br /&gt;
&lt;br /&gt;
Относительно мощный пучок света смешивается с входным сигналом, используя ответвитель с селекцией по длине волн. Входной сигнал и свет возбуждения должны иметь существенно отличающиеся длины волн. Смешанный свет попадает в раздел волокна с ионами эрбия, добавленными в ядро. Этот мощный световой луч возбуждает ионы эрбия до их более высокого энергетического состояния. Когда фотоны, принадлежащие сигналу в отличной длине волны от накачанного света, встречают возбужденные атомы эрбия, атомы эрбия отдают часть своей энергии сигналу и возвращаются к их более низкому энергетическому состоянию. Важный момент — то, что эрбий отдает свою энергию в форме дополнительных фотонов, которые находятся в той же фазе и направлении, как и усиливаемый сигнал. Таким образом, сигнал усиливается только вдоль его направления перемещения. Вся дополнительная мощность сигнала ведется в том же самом режиме волокна как и входящий сигнал. Обычно есть изолятор, помещенный в вывод, чтобы предотвратить отражения, возвращающиеся из присоединенного волокна. Такие отражения разрушают работу усилителя, и в крайнем случае могут заставить усилитель работать как лазер.&lt;br /&gt;
&lt;br /&gt;
= Тест 2 =&lt;br /&gt;
&lt;br /&gt;
== Что такое элементарный и составной каналы в сетях с канальной коммутацией? ==&lt;br /&gt;
Элементарный канал — базовая техническая характеристика сети с коммутацией каналов, представляющая собой некоторое фиксированное в пределах данного типа сетей значение пропускной способности. Любая линия в сети с коммутацией каналов имеет пропускную способность, кратную элементарному каналу, принятому для данного типа сети.&lt;br /&gt;
&lt;br /&gt;
== Перечислите примеры протоколов стека TCP/IP по уровням ==&lt;br /&gt;
* прикладной (binkp, FTP, Finger, DNS, Gnutella, Gopher, HTTP, HTTPS, IMAP, IRC, XMPP, LDAP, NTP, NNTP, POP3, RDP, SMB, SSH, SMTP, Telnet, SNMP, SIP, DMX-512)&lt;br /&gt;
* транспортный (SPX, XOT, BGP, ISODE, DVMRP, TCP, UDP, SCTP, RDP/RUDP, RTCP)&lt;br /&gt;
* сетевой (ICMP, IPv4, IPv6, IPX, ARP)&lt;br /&gt;
* канальный (Ethernet/IEEE 802.11, Wireless Internet, Token ring, FDDI, HDLC, GVRP, PPP, PPTP, L2TP, ATM, xDSL).&lt;br /&gt;
&lt;br /&gt;
== Какая бывает модуляция? ==&lt;br /&gt;
Фазовая (в зависимости от входного сигнала выходной сдвигается на какую-то фазу), амплитудная (в зависимости от входного сигнала изменяется амплитуда выходного), частотная (в зависимости от входного сигнала изменяется частота выходного).&lt;br /&gt;
&lt;br /&gt;
== Приведите примеры вариантов физического кодирования ==&lt;br /&gt;
===2 уровня===&lt;br /&gt;
* NRZ (Non Return Zero) — простейший код, 1 — есть ток, 0 — нет;&lt;br /&gt;
* NRZI (Non Return Zero Inverted) — смена сигнала происходит при передаче единицы, передача нуля не приводит к изменению сигнала;&lt;br /&gt;
* RZ (Return to Zero) — 0 — положительное напряжение, 1 — отрицательное, в середине сигнала происходит переход в отсутствие напряжение;&lt;br /&gt;
* Манчестерский код — (логическая единица — положительный переход в середине символа, ноль — отрицательный).&lt;br /&gt;
===3 уровня===&lt;br /&gt;
* Биполярный код AMI - биты 0 представляются нулевым напряжением (0 В), биты 1 представляются поочерёдно значениями -U или +U (В);&lt;br /&gt;
* MLT-3 Multi Level Transmission — 3 (многоуровневая передача) — метод кодирования, использующий три уровня сигнала. Метод основывается на циклическом переключении уровней -U, 0, +U. Единице соответствует переход с одного уровня сигнала на следующий. Так же как и в методе NRZI при передаче «нуля» сигнал не меняется.&lt;br /&gt;
===4 уровня===&lt;br /&gt;
Потенциальный код 2B1Q передает пару бит за один битовый интервал. Каждой возможной паре в соответствие ставится свой уровень из четырех возможных уровней потенциала: &amp;quot;00&amp;quot; = &amp;lt;tex&amp;gt;-2.5&amp;lt;/tex&amp;gt;, &amp;quot;01&amp;quot; = &amp;lt;tex&amp;gt;−0.833&amp;lt;/tex&amp;gt;, &amp;quot;11&amp;quot; = &amp;lt;tex&amp;gt;+0.833&amp;lt;/tex&amp;gt;, &amp;quot;10&amp;quot; = &amp;lt;tex&amp;gt;+2.5&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;
После &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt; коллизий выбираем рандомное число от &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;2^c - 1&amp;lt;/tex&amp;gt;, ждём это число. Для того, чтобы увеличить время ожидания при большом количестве коллизий и, как следствие, уменьшить их вероятность при повторной передаче. &lt;br /&gt;
&lt;br /&gt;
== Нарисуйте схему CSMA/CD ==&lt;br /&gt;
схему? лолшто?&lt;br /&gt;
CSMA — Carrier Sense Multiple Access — множественный доступ с контролем несущей. Слушаем канал, если занят, ждём случайное время. Если свободен — передаём, если коллизия — ждём случайное время. Настойчивость &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; — передаём с вероятностью &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;. Детектируем коллизию — шлём jam signal, сообщая о ней другим станциям, потом ждём случайное время… Полудуплекс из-за того, что слушаем канал.&lt;br /&gt;
&lt;br /&gt;
== Какое кодирование используется в 100 мегабитном Ethernet? == &lt;br /&gt;
В 100BASE-T4 используется 8B6T (8 двоичных символов кодируются 6 тернарными), в 100BASE-TX — 4B5B (4 двоичных символа кодируются 5 двоичными, на более нижнем уровне используется NRZI, поэтому один «лишний» символ используется для синхронизации)&lt;br /&gt;
&lt;br /&gt;
== Что такое протокол скользящего окна? ==&lt;br /&gt;
см. тест 1, вопрос 46&lt;br /&gt;
&lt;br /&gt;
== Чем отличается концентратор от коммутатора? ==&lt;br /&gt;
см. тест 1, вопрос 29&lt;br /&gt;
&lt;br /&gt;
== Что такое и зачем нужны сетевые мосты? ==&lt;br /&gt;
см. тест 1, вопрос 30&lt;br /&gt;
&lt;br /&gt;
== Что такое и зачем нужен алгоритм остовного дерева (STP)? ==&lt;br /&gt;
см. тест 1, вопрос 31&lt;br /&gt;
&lt;br /&gt;
== Какую задачу решает уровень MAC? ==&lt;br /&gt;
см. тест 1, вопрос 32&lt;br /&gt;
&lt;br /&gt;
== Какие есть варианты разделения широковещательного канала? ==&lt;br /&gt;
см. тест 1, вопрос 35&lt;br /&gt;
&lt;br /&gt;
== Какие сервисы предоставляет подуровень LLC? ==&lt;br /&gt;
см. тест 1, вопрос 33&lt;br /&gt;
&lt;br /&gt;
== Что такое шумоподобный сигнал? ==&lt;br /&gt;
см. тест 1, вопрос 36&lt;br /&gt;
&lt;br /&gt;
== Что такое проблема засвеченной станции и проблема скрытой станции? ==&lt;br /&gt;
см. тест 1, вопрос 37&lt;br /&gt;
&lt;br /&gt;
== Что такое OFDM? ==&lt;br /&gt;
см. тест 1, вопрос 41&lt;br /&gt;
&lt;br /&gt;
== Чем многомодовое оптоволокно отличается от одномодового? ==&lt;br /&gt;
см. тест 1, вопрос 48&lt;br /&gt;
&lt;br /&gt;
== Что такое CWDM? ==&lt;br /&gt;
CWDM (Coarse WDM) — «грубое» WDM с разносом каналов более 2500 ГГц, позволяет мультиплексировать не более 18 каналов.&lt;br /&gt;
&lt;br /&gt;
== В чём отличительная особенность технологии PON? ==&lt;br /&gt;
см. тест 1, вопрос 52&lt;br /&gt;
&lt;br /&gt;
== Перечислите сервисы сетевого уровня ==&lt;br /&gt;
{{TODO|t=найти информацию и допилить}}&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;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F&amp;diff=40469</id>
		<title>Префикс-функция</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F&amp;diff=40469"/>
				<updated>2014-10-20T20:14:26Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Реализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition = '''Префикс-функция''' ''(англ. prefix-function)'' от строки {{---}} массив длин наибольших [[Период_и_бордер,_их_связь#Определения|бордеров]] для каждой позиции этой строки}}&lt;br /&gt;
Здесь и далее считаем, что символы в строках нумеруются с &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Определим префикс-функцию от строки &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в позиции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;\pi(s, i) = \max\limits_{k = 1..i - 1} \{k : &amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;s[1..k] = s[i - k + 1..i] \}&amp;lt;/tex&amp;gt;. Если мы не нашли такого &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\pi(s, i)=0&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
==Наивный алгоритм==&lt;br /&gt;
Наивный алгоритм вычисляет префикс-функцию непосредственно по определению, сравнивая префиксы и суффиксы строк. Обозначим длину строки за &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Будем считать, что префикс-функция хранится в массиве &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
 '''int'''[] prefixFunction('''string''' s):&lt;br /&gt;
      '''int'''[] p = '''int'''[s.length]&lt;br /&gt;
      fill(p, 0)&lt;br /&gt;
      '''for''' i = 1 '''to''' n&lt;br /&gt;
          '''for''' k = 1 '''to''' i&lt;br /&gt;
              '''if''' s[1..k] == s[i - k + 1..i]&lt;br /&gt;
                  p[i] = k&lt;br /&gt;
      '''return''' p&lt;br /&gt;
&lt;br /&gt;
===Пример===&lt;br /&gt;
Рассмотрим строку &amp;lt;tex&amp;gt;abcabcd&amp;lt;/tex&amp;gt;, для которой значение префикс-функции равно &amp;lt;tex&amp;gt;[0,0,0,1,2,3,0]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шаг || Строка || Значение функции&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; || a || 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || ab || 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; || abc || 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; || abca || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; || abcab || 2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;6&amp;lt;/tex&amp;gt; || abcabc || 3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;7&amp;lt;/tex&amp;gt; || abcabcd || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Время работы===&lt;br /&gt;
Всего &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt; итераций цикла, на каждой из который происходит сравнение строк за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, что дает в итоге &amp;lt;tex&amp;gt;O(n^3)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Эффективный алгоритм==&lt;br /&gt;
Вносятся несколько важных замечаний:&lt;br /&gt;
* Заметим, что &amp;lt;tex&amp;gt;p[i + 1] \leqslant p[i] + 1&amp;lt;/tex&amp;gt;. Чтобы показать это, рассмотрим суффикс,оканчивающийся на позиции &amp;lt;tex&amp;gt;i + 1&amp;lt;/tex&amp;gt; и имеющий длину &amp;lt;tex&amp;gt;p[i + 1]&amp;lt;/tex&amp;gt;, удалив из него последний символ, мы получим суффикс, оканчивающийся на позиции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и имеющий длину &amp;lt;tex&amp;gt;p[i + 1] - 1&amp;lt;/tex&amp;gt;, следовательно неравенство &amp;lt;tex&amp;gt;p[i + 1] &amp;gt; p[i] + 1&amp;lt;/tex&amp;gt; неверно.&lt;br /&gt;
* Избавимся от явных сравнений строк. Пусть мы вычислили &amp;lt;tex&amp;gt;p[i]&amp;lt;/tex&amp;gt;, тогда, если &amp;lt;tex&amp;gt;s[i + 1] = s[p[i]]&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;p[i + 1] = p[i] + 1&amp;lt;/tex&amp;gt;. Если окажется, что &amp;lt;tex&amp;gt;s[i + 1] \ne s[p[i]]&amp;lt;/tex&amp;gt;, то нужно попытаться попробовать подстроку меньшей длины. Хотелось бы сразу перейти к такому [[Период_и_бордер,_их_связь#Определения|бордеру]] наибольшей длины, для этого подберем такое &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;k = p[i] - 1&amp;lt;/tex&amp;gt;. Делаем это следующим образом. За исходное &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; необходимо взять &amp;lt;tex&amp;gt;p[i - 1]&amp;lt;/tex&amp;gt;, что следует из первого пункта. В случае, когда символы &amp;lt;tex&amp;gt;s[k+1]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;s[i]&amp;lt;/tex&amp;gt; не совпадают, &amp;lt;tex&amp;gt;p[k]&amp;lt;/tex&amp;gt; {{---}} следующее потенциальное наибольшее значение &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, что видно из рисунка. Последнее утверждение верно, пока &amp;lt;tex&amp;gt;k&amp;gt;0&amp;lt;/tex&amp;gt;, что позволит всегда найти его следующее значение. Если &amp;lt;tex&amp;gt;k=0&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;p[i]=1&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;s[i] = s[1]&amp;lt;/tex&amp;gt; , иначе &amp;lt;tex&amp;gt;p[i]=0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:mprfx.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
===Псевдокод===&lt;br /&gt;
 '''int'''[] prefixFunction('''string''' s):&lt;br /&gt;
   p[1] = 0&lt;br /&gt;
   '''for''' i = 2 '''to''' n&lt;br /&gt;
       k = p[i - 1]&lt;br /&gt;
       '''while''' k &amp;gt; 0 '''and''' s[i] != s[k + 1]&lt;br /&gt;
           k = p[k]&lt;br /&gt;
       '''if''' s[i] == s[k + 1]&lt;br /&gt;
           k++&lt;br /&gt;
       p[i] = k&lt;br /&gt;
   '''return''' p&lt;br /&gt;
&lt;br /&gt;
===Время работы===&lt;br /&gt;
Время работы алгоритма составит &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;. Для доказательства этого нужно заметить, что итоговое количество итераций цикла &amp;lt;tex&amp;gt;\mathrm{while}&amp;lt;/tex&amp;gt; определяет асимптотику алгоритма. Теперь стоит отметить, что &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; увеличивается на каждом шаге не более чем на единицу, значит максимально возможное значение &amp;lt;tex&amp;gt;k = n - 1&amp;lt;/tex&amp;gt;. Поскольку внутри цикла &amp;lt;tex&amp;gt;\mathrm{while}&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; лишь уменьшается, получается, что &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; не может суммарно уменьшиться больше, чем &amp;lt;tex&amp;gt;n-1&amp;lt;/tex&amp;gt; раз. Значит цикл &amp;lt;tex&amp;gt;\mathrm{while}&amp;lt;/tex&amp;gt; в итоге выполнится не более &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; раз, что дает итоговую оценку времени алгоритма &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Построение префикс-функции по Z-функции==&lt;br /&gt;
=== Постановка задачи ===&lt;br /&gt;
Дан массив с корректной [[Z-функция | Z-функцией]] для строки &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, получить за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; массив с префикс-функцией для строки &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Описание алгоритма ===&lt;br /&gt;
Пусть Z-функция хранится в массиве &amp;lt;tex&amp;gt;z[1..n]&amp;lt;/tex&amp;gt;. Префикс-функцию будем записывать в массив &amp;lt;tex&amp;gt;p[1..n]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Заметим, что если &amp;lt;tex&amp;gt;z[i] &amp;gt; 0, &amp;lt;/tex&amp;gt; то для всех элементов с индексом &amp;lt;tex&amp;gt;i + j&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;0 \leqslant j &amp;lt; z[i] &amp;lt;/tex&amp;gt;,  значение &amp;lt;tex&amp;gt;p[i + j] &amp;lt;/tex&amp;gt; будет не меньше, чем длина подстроки с &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; по &amp;lt;tex&amp;gt; i + j&amp;lt;/tex&amp;gt;, что равно &amp;lt;tex&amp;gt;j + 1&amp;lt;/tex&amp;gt; (как изображено на рисунке). &lt;br /&gt;
&lt;br /&gt;
Также заметим, что если мы уже установили в какую-то позицию значение &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; с позиции &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, а потом пытаемся установить значение &amp;lt;tex&amp;gt; j' &amp;lt;/tex&amp;gt; c позиции &amp;lt;tex&amp;gt; i' &amp;lt;/tex&amp;gt;, причём &amp;lt;tex&amp;gt; i &amp;lt; i' &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; i + j = i' + j' &amp;lt;/tex&amp;gt;, то изменение с позиции &amp;lt;tex&amp;gt; i' &amp;lt;/tex&amp;gt; только уменьшит значение &amp;lt;tex&amp;gt; p[i + j]&amp;lt;/tex&amp;gt;. Действительно, значение после первого присвоения &amp;lt;tex&amp;gt;p[i + j] = j &amp;gt; j' = p[i' + j']&amp;lt;/tex&amp;gt;. В итоге получаем алгоритм: идем слева направо по массиву &amp;lt;tex&amp;gt;z&amp;lt;/tex&amp;gt; и, находясь на позиции &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;, пытаемся записать в &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; от позиции &amp;lt;tex&amp;gt;i + z[i] - 1 &amp;lt;/tex&amp;gt; до  &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt; j + 1,&amp;lt;/tex&amp;gt; где &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; пробегает все значения &amp;lt;tex&amp;gt; 0 \dots z[i] - 1&amp;lt;/tex&amp;gt;, пока не наткнемся на уже инициализированный элемент. Слева от него все значения тоже нет смысла обновлять, поэтому прерываем эту итерацию. &lt;br /&gt;
&lt;br /&gt;
Убедимся, что алгоритм работает за линейное время (см. псевдокод). Каждый элемент устанавливается ровно один раз. Дальше на нем может случиться только &amp;lt;tex&amp;gt;\mathrm{break}&amp;lt;/tex&amp;gt;. Поэтому в итоге внутренний цикл суммарно отработает за количество установленных значений и количество &amp;lt;tex&amp;gt;\mathrm{break}&amp;lt;/tex&amp;gt;. Количество установленных значений {{---}} &amp;lt;tex&amp;gt; n&amp;lt;/tex&amp;gt;. А число &amp;lt;tex&amp;gt;\mathrm{break}&amp;lt;/tex&amp;gt; тоже будет не больше &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, так как каждый &amp;lt;tex&amp;gt;\mathrm{break}&amp;lt;/tex&amp;gt; переводит внешний цикл на следующую итерацию, откуда получаем итоговую асимптотику &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[Файл:ZP4.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
=== Псевдокод ===&lt;br /&gt;
 '''int'''[] buildPrefixFunctionFromZFunction('''int'''[] z):&lt;br /&gt;
   '''int'''[] p = '''int'''[z.length]&lt;br /&gt;
   fill(p, 0)&lt;br /&gt;
   '''for''' i = 2 '''to''' z.length - 1&lt;br /&gt;
     '''for''' j = z[i] - 1 '''downto''' 0&lt;br /&gt;
       '''if''' p[i + j] &amp;gt; 0 &lt;br /&gt;
         '''break'''&lt;br /&gt;
       '''else'''&lt;br /&gt;
         p[i + j] = j + 1&lt;br /&gt;
   '''return''' p&lt;br /&gt;
&lt;br /&gt;
==Построение строки по префикс-функции==&lt;br /&gt;
===Постановка задачи=== &lt;br /&gt;
Восстановить строку по префикс-функции за &amp;lt;tex&amp;gt;O(n)&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;p&amp;lt;/tex&amp;gt; хранятся значения префикс-функции, в &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; будет записан ответ. Пойдем по массиву &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; слева направо.&lt;br /&gt;
&lt;br /&gt;
Пусть мы хотим узнать значение &amp;lt;tex&amp;gt;s[i]&amp;lt;/tex&amp;gt;. Для этого посмотрим на значение &amp;lt;tex&amp;gt;p[i]&amp;lt;/tex&amp;gt;: если &amp;lt;tex&amp;gt;p[i] =0&amp;lt;/tex&amp;gt;, тогда в &amp;lt;tex&amp;gt;s[i]&amp;lt;/tex&amp;gt; запишем новый символ, иначе &amp;lt;tex&amp;gt;s[i] = s[p[i]]&amp;lt;/tex&amp;gt;. Обратим внимание, что  &amp;lt;tex&amp;gt;s[p[i]]&amp;lt;/tex&amp;gt; нам уже известно, так как &amp;lt;tex&amp;gt;p[i] &amp;lt; i&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Реализация ===&lt;br /&gt;
 '''string''' buildFromPrefix('''int'''[] p):&lt;br /&gt;
   s = &amp;quot;&amp;quot; &lt;br /&gt;
   '''for''' i = 0 '''to''' p.length - 1&lt;br /&gt;
       '''if''' p[i] == 0     &lt;br /&gt;
           s += new character&lt;br /&gt;
       '''else'''&lt;br /&gt;
           s += s[p[i] - 1]&lt;br /&gt;
   '''return''' s&lt;br /&gt;
&lt;br /&gt;
===Доказательство корректности алгоритма===&lt;br /&gt;
Докажем, что если нам дали корректную префикс-функцию, то наш алгоритм построит строку с такой же префикс-функцией. Также заметим, что строк с такой префикс-функцией может быть много, и алгоритм строит только одну из них.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; {{---}} данная префикс-функция, строку &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; построил наш алгоритм, &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; {{---}} массив значений префикс-функции для &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Докажем корректность индукцией по длине массива префикс-функции полученной строки. Для начала заметим, что на предыдущие значения массива &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; прибавление нового символа не влияет, так как при подсчёте префикс-функции на &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;-ой позиции рассматриваются символы на позициях не больше &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;. Поэтому достаточно показать, что очередное значение префикс-функции будет вычислено правильно.&lt;br /&gt;
* База очевидна для строки длины &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Переход: пусть до &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;-ой позиции мы построили строку, что &amp;lt;tex&amp;gt;p[0..n - 1] = q[0..n - 1]&amp;lt;/tex&amp;gt;. Возможны два случая:&lt;br /&gt;
**  &amp;lt;tex&amp;gt;p[n] = 0&amp;lt;/tex&amp;gt;. Тогда мы добавляем новый символ, поэтому &amp;lt;tex&amp;gt;q[n]&amp;lt;/tex&amp;gt; тоже будет равно &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. &lt;br /&gt;
** &amp;lt;tex&amp;gt;p[n] &amp;gt; 0&amp;lt;/tex&amp;gt;. Бордер строки &amp;lt;tex&amp;gt; s[0..n - 1] &amp;lt;/tex&amp;gt; имеет длину &amp;lt;tex&amp;gt; p[n-1] = q[n-1] &amp;lt;/tex&amp;gt;. Поэтому если дописать к строке &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; символ &amp;lt;tex&amp;gt; s[q[n]] &amp;lt;/tex&amp;gt;, то бордер нашей новой строки &amp;lt;tex&amp;gt; s[0..n] &amp;lt;/tex&amp;gt; станет равен &amp;lt;tex&amp;gt; p[n] &amp;lt;/tex&amp;gt;, как можно увидеть на [[Префикс-функция#Эффективный алгоритм | рисунке]].&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Z-функция|Z-функция]]&lt;br /&gt;
*[[Алгоритм Кнута-Морриса-Пратта|Алгоритм Кнута-Морриса-Пратта]]&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
*[[wikipedia:ru:Префикс-функция | Википедия {{---}} Префикс-функция]]&lt;br /&gt;
*[http://e-maxx.ru/algo/prefix_function MAXimal :: algo :: Префикс-функция]&lt;br /&gt;
* Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. {{---}} 2-е изд. {{---}} М.: Издательский дом «Вильямс», 2007. {{---}} С. 1296 ISBN 978-5-8459-0857-5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Поиск подстроки в строке]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D1%87%D0%B8%D1%81%D0%B5%D0%BB&amp;diff=36394</id>
		<title>Алгоритмы алгебры и теории чисел</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B_%D0%B0%D0%BB%D0%B3%D0%B5%D0%B1%D1%80%D1%8B_%D0%B8_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D1%87%D0%B8%D1%81%D0%B5%D0%BB&amp;diff=36394"/>
				<updated>2014-04-13T17:44:36Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
* [[Арифметика чисел в b-ичной системе счисления (Длинная арифметика)]]&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;
&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;
* [[Теорема о подгруппах циклической группы]]&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;
*[[Делители нуля, области целостности]]&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;
== Лекция - Первообразные корни и квадратичные вычеты ==&lt;br /&gt;
* [[Теорема о цикличности мультипликативной группы поля Z/pZ|Теорема о цикличности мультипликативной группы поля &amp;lt;tex&amp;gt;\mathbb{Z}/p\mathbb{Z}&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[Первообразные корни]]&lt;br /&gt;
** [[Существование первообразных корней по определенным модулям|Теорема о существовании первообразных корней по модулям вида &amp;lt;tex&amp;gt;2,4,p^n,2\cdot p^n&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
* [[Квадратичные вычеты|Квадратичные вычеты, количество квадратичных вычетов по простому модулю]]&lt;br /&gt;
** [[Символ Лежандра, критерий Эйлера]]&lt;br /&gt;
** [[Теорема о (((p-1)/2)!)^2=-1(mod p)|Теорема о &amp;lt;tex&amp;gt;((\frac{p-1}{2})!)^2\equiv -1 (mod ~p)&amp;lt;/tex&amp;gt; при &amp;lt;tex&amp;gt;p=4\cdot k+1&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;
*[[Тест Миллера-Рабина]]&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;math&amp;gt;\pi(x)&amp;lt;/math&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;
** [[Цепные дроби для sqrtd и квадратичных иррациональностей|Цепные дроби для &amp;lt;tex&amp;gt;\sqrt{d}&amp;lt;/tex&amp;gt; и квадратичных иррациональностей]]&lt;br /&gt;
* [[Уравнение Пелля]]&lt;br /&gt;
* [[Представление простых в виде суммы двух квадратов]]&lt;br /&gt;
&lt;br /&gt;
== Лекция - Конечные поля ==&lt;br /&gt;
=== Практика - Методы разложения полиномов на множители над конечными полями ===&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<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_eps-%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=34437</id>
		<title>Удаление eps-правил из грамматики</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_eps-%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=34437"/>
				<updated>2013-12-19T15:47:20Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Время работы алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Используемые определения ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Правила вида &amp;lt;tex&amp;gt;A \to \varepsilon&amp;lt;/tex&amp;gt; называются '''&amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правилами''' (''&amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; rule'').&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется '''&amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающим''' (''&amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-generating''), если &amp;lt;tex&amp;gt;A \Rightarrow^* \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм удаления &amp;amp;epsilon;-правил из грамматики ==&lt;br /&gt;
'''Вход:''' КС грамматика &amp;lt;tex&amp;gt; G=\langle N,\Sigma, P, S \rangle&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Выход:''' КС грамматика &amp;lt;tex&amp;gt; G'=\langle N,\Sigma, P', S' \rangle&amp;lt;/tex&amp;gt; без &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правил (может присутствовать правило &amp;lt;tex&amp;gt;S \rightarrow \varepsilon&amp;lt;/tex&amp;gt;, но в этом случае &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; не встречается в правых частях правил); &amp;lt;tex&amp;gt;L(G') = L(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Добавить все правила из &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;P'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# [[#.D0.90.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC_.D0.BF.D0.BE.D0.B8.D1.81.D0.BA.D0.B0_.CE.B5-.D0.BF.D0.BE.D1.80.D0.BE.D0.B6.D0.B4.D0.B0.D1.8E.D1.89.D0.B8.D1.85_.D0.BD.D0.B5.D1.82.D0.B5.D1.80.D0.BC.D0.B8.D0.BD.D0.B0.D0.BB.D0.BE.D0.B2 | Найти все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождаюшие нетерминалы]].&lt;br /&gt;
# Для каждого правила вида &amp;lt;tex&amp;gt;A \rightarrow \alpha_0 B_1 \alpha_1 B_2 \alpha_2 ... B_k \alpha_k&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;\alpha_i&amp;lt;/tex&amp;gt; — последовательности из терминалов и нетерминалов, &amp;lt;tex&amp;gt;B_j&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающие нетерминалы) добавить в &amp;lt;tex&amp;gt;P'&amp;lt;/tex&amp;gt; все возможные варианты правил, в которых либо присутствует, либо удалён каждый из нетерминалов &amp;lt;tex&amp;gt;B_j\; (1 \le j \le k)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Удалить все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правила из &amp;lt;tex&amp;gt;P'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Если в исходной грамматике &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; выводилось &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;, то необходимо добавить новый нетерминал &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, сделать его стартовым, добавить правило &amp;lt;tex&amp;gt;S' \rightarrow S|\varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Доказательство корректности ===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = Если грамматика &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; была построена с помощью описанного выше алгоритма по грамматике &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;L(G') = L(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
Сначала докажем, что, если не выполнять шаг 5 алгоритма, то получится грамматика &amp;lt;tex&amp;gt;G' : L(G') = L(G) \setminus \lbrace \varepsilon \rbrace &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Для этого достаточно доказать, что&lt;br /&gt;
&amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt; (*).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&amp;lt;br\&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;&amp;amp;nbsp; и&amp;amp;nbsp; &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Докажем индукцией по длине порождения в грамматике &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; &lt;br /&gt;
'''База'''. &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow} w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
В этом случае в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть правило &amp;lt;tex&amp;gt;A \rightarrow w&amp;lt;/tex&amp;gt;. По построению &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть правило &amp;lt;tex&amp;gt;A \rightarrow \alpha&amp;lt;/tex&amp;gt;, причем &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; — цепочка &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, элементы которой, возможно, перемежаются &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающими нетерминалами. Тогда в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть порождения &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow} \alpha \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Предположение индукции'''. Пусть из &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w \ne \varepsilon&amp;lt;/tex&amp;gt; менее, чем за &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, следует, что &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Переход'''.&lt;br /&gt;
Пусть в порождении &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, &amp;lt;tex&amp;gt;n &amp;gt; 1&amp;lt;/tex&amp;gt;. Тогда оно имеет вид &amp;lt;tex&amp;gt;A\underset{G'}{\Rightarrow}X_1 X_2...X_k \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;X_i \in N \cup \Sigma &amp;lt;/tex&amp;gt;. Первое использованное правило должно быть построено по правилу грамматики &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;A \rightarrow Y_1 Y_2...Y_m&amp;lt;/tex&amp;gt;, где последовательность &amp;lt;tex&amp;gt;Y_1 Y_2...Y_m&amp;lt;/tex&amp;gt; совпадает с последовательностью &amp;lt;tex&amp;gt;X_1 X_2...X_k&amp;lt;/tex&amp;gt;, символы которой, возможно, перемежаются &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающими нетерминалами.&amp;lt;br/&amp;gt;&lt;br /&gt;
Цепочку &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; можно разбить на &amp;lt;tex&amp;gt;w_1 w_2...w_k&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;X_i \underset{G'}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;X_i&amp;lt;/tex&amp;gt; — терминал, то &amp;lt;tex&amp;gt;w_i = X_i&amp;lt;/tex&amp;gt;, a если нетерминал, то порождение &amp;lt;tex&amp;gt;X_i \underset{G'}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt; содержит менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов. По предположению &amp;lt;tex&amp;gt;X_i \underset{G}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;, значит &amp;lt;tex&amp;gt;A \underset {G}{\Rightarrow} Y_1 Y_2...Y_m \underset{G}{\Rightarrow}^* X_1 X_2...X_k \underset{G}{\Rightarrow}^* w_1 w_2...w_k = w&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;&amp;amp;nbsp; и&amp;amp;nbsp; &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; &lt;br /&gt;
Докажем индукцией по длине порождения в грамматике &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; &lt;br /&gt;
'''База'''. &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow} w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Правило &amp;lt;tex&amp;gt;A \rightarrow w&amp;lt;/tex&amp;gt; присутствует в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;, это же правило будет и в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, поэтому &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Предположение индукции'''. Пусть из &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w \ne \varepsilon&amp;lt;/tex&amp;gt; менее, чем за &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, следует, что &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Переход'''. Пусть в порождении &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, &amp;lt;tex&amp;gt;n &amp;gt; 1&amp;lt;/tex&amp;gt;. Тогда оно имеет вид &amp;lt;tex&amp;gt;A\underset{G}{\Rightarrow}Y_1 Y_2...Y_m \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Y_i \in N \cup \Sigma &amp;lt;/tex&amp;gt;. Цепочку &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; можно разбить на &amp;lt;tex&amp;gt;w_1 w_2...w_m&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Y_i \underset{G}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;Y_{i_1}, Y_{i_2}, ..., Y_{i_p}&amp;lt;/tex&amp;gt; — подпоследовательность, состоящая из всех элементов, таких, что &amp;lt;tex&amp;gt;w_{i_k} \ne \varepsilon&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;Y_{i_1} Y_{i_2} ... Y_{i_p} \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;p \ge 1&amp;lt;/tex&amp;gt;, поскольку &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;A \rightarrow Y_{i_1} Y_{i_2} ... Y_{i_p}&amp;lt;/tex&amp;gt; является правилом в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; по построению &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Так как каждое из порождений &amp;lt;tex&amp;gt;Y_i \underset{G}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt; содержит менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, к ним можно применить предположение индукции и заключить, что, если &amp;lt;tex&amp;gt;w_i \ne \varepsilon&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;Y_i \underset{G'}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow} Y_{i_1} Y_{i_2} ... Y_{i_p} \underset{G'}{\Rightarrow}^* w&amp;lt;/tex&amp;gt;.&lt;br /&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;w \in L(G)&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;w \in L(G')&amp;lt;/tex&amp;gt;. Так как после выполнения шага 5 алгоритма в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; могло добавиться только пустое слово &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;, то язык, задаваемый КС грамматикой &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, совпадает с языком, задаваемым КС грамматикой &amp;lt;tex&amp;gt;G&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; \Gamma = &lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow T_1 T_2 T_3 ... T_n\\&lt;br /&gt;
    T_1\rightarrow t_1|\varepsilon\\&lt;br /&gt;
    T_2\rightarrow t_2|\varepsilon\\&lt;br /&gt;
    ...\\&lt;br /&gt;
    T_n\rightarrow t_n|\varepsilon&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\left| \Gamma \right| = O(n)&amp;lt;/tex&amp;gt;. Из нетерминала &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; можно вывести &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; сочетаний нетерминалов &amp;lt;tex&amp;gt;T_i&amp;lt;/tex&amp;gt;. Таким образом в худшем случае алгоритм работает за &amp;lt;tex&amp;gt;O(2^{\left| \Gamma \right|})&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако если в грамматике устранены [[Удаление_длинных_правил_из_грамматики|длинные правила]], то алгоритм будет работать за &amp;lt;tex&amp;gt;O(\left| \Gamma \right|)&amp;lt;/tex&amp;gt; и добавит в грамматику &amp;lt;tex&amp;gt;O(\left| \Gamma \right|)&amp;lt;/tex&amp;gt; новых правил длинны &amp;lt;tex&amp;gt;O(1)&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 ABCd\\&lt;br /&gt;
    A\rightarrow a|\varepsilon\\&lt;br /&gt;
    B\rightarrow AC\\&lt;br /&gt;
    C\rightarrow c|\varepsilon&lt;br /&gt;
\end{array}&lt;br /&gt;
&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;\varepsilon&amp;lt;/tex&amp;gt;-порождающими нетерминалами.&lt;br /&gt;
# Переберём для каждого правила все возможные сочетания &amp;amp;epsilon;-порождающих нетерминалов и добавим новые правила:&lt;br /&gt;
#* &amp;lt;tex&amp;gt;S\rightarrow Ad|ABd|Bd|BCd|Cd|d&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S \rightarrow ABCd&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;B \rightarrow A|C&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;B \rightarrow AC&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Удалим праила &amp;lt;tex&amp;gt;A\rightarrow \varepsilon&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;C\rightarrow \varepsilon&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате мы получим новую грамматику без &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правил:&lt;br /&gt;
&amp;lt;tex&amp;gt;\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow Ad|ABd|ABCd|Bd|BCd|Cd|d\\&lt;br /&gt;
    A\rightarrow a\\&lt;br /&gt;
    B\rightarrow A|AC|C\\&lt;br /&gt;
    C\rightarrow c&lt;br /&gt;
\end{array}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Алгоритм поиска &amp;amp;epsilon;-порождающих нетерминалов ==&lt;br /&gt;
'''Вход:''' КС грамматика &amp;lt;tex&amp;gt; G=\langle N,\Sigma, P, S \rangle&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Выход:''' множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов.&lt;br /&gt;
&lt;br /&gt;
# Найти все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правила. Составить множество, состоящее из нетерминалов, входящих в левые части таких правил.&lt;br /&gt;
# Перебираем правила грамматики &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Если найдено правило &amp;lt;tex&amp;gt;A \rightarrow C_1C_2...C_k&amp;lt;/tex&amp;gt;, для которого верно, что каждый &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; принадлежит множеству, то добавить &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в множество.&lt;br /&gt;
# Если на шаге 2 множество изменилось, то повторить шаг 2.&lt;br /&gt;
&lt;br /&gt;
=== Доказательство корректности ===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = Описанный выше алгоритм находит все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающие нетерминалы грамматики &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
&lt;br /&gt;
Для доказательства корректности алгоритма достаточно показать, что, если множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов на очередной итерации алгоритма не изменялось, то алгоритм нашел все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающие нетерминалы.&lt;br /&gt;
&lt;br /&gt;
Пусть после завершения алгоритма существуют нетерминалы такие, что они являются &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающими, но не были найдены алгоритмом. Выберем из этих нетерминалов нетерминал &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;, из которого выводится &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; за наименьшее число шагов. Тогда в грамматике есть правило &amp;lt;tex&amp;gt;B \rightarrow C_1C_2...C_k&amp;lt;/tex&amp;gt;, где каждый нетерминал &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающий. Каждый &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; входит в множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов, так как иначе вместо &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; необходимо было взять &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt;. Следовательно, на одной из итераций алгоритма &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; уже добавился в множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов. Противоречие. Следовательно, алгоритм находит все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;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 ABC|DS\\&lt;br /&gt;
    A\rightarrow \varepsilon\\&lt;br /&gt;
    B\rightarrow AC\\&lt;br /&gt;
    C\rightarrow \varepsilon\\&lt;br /&gt;
    D\rightarrow d&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Возьмём множество состоящее из &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов &amp;lt;tex&amp;gt;\lbrace A, C \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Добавим &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; в множество, так как правая часть правила &amp;lt;tex&amp;gt;B\rightarrow AC&amp;lt;/tex&amp;gt; состоит только из нетерминалов из множества.&lt;br /&gt;
# Повторим второй пункт для правила &amp;lt;tex&amp;gt;S\rightarrow ABC&amp;lt;/tex&amp;gt; и получим множество &amp;lt;tex&amp;gt;\lbrace A, B, C, S \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Больше нет нерассмотренных правил, содержащих справа только нетерминалы из множества.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;tex&amp;gt;\varepsilon&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;S&amp;lt;/tex&amp;gt;.&lt;br /&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. — С. 273: ISBN 5-8459-0261-4 (рус.)&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<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_eps-%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33702</id>
		<title>Удаление eps-правил из грамматики</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_eps-%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33702"/>
				<updated>2013-11-17T11:35:36Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Используемые определения ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Правила вида &amp;lt;tex&amp;gt;A \to \varepsilon&amp;lt;/tex&amp;gt; называются '''&amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правилами''' (''&amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; rule'').&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется '''&amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающим''' (''&amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-generating''), если &amp;lt;tex&amp;gt;A \Rightarrow^* \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм удаления &amp;amp;epsilon;-правил из грамматики ==&lt;br /&gt;
'''Вход:''' КС грамматика &amp;lt;tex&amp;gt; G=\langle N,\Sigma, P, S \rangle&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Выход:''' КС грамматика &amp;lt;tex&amp;gt; G'=\langle N,\Sigma, P', S' \rangle&amp;lt;/tex&amp;gt; без &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правил (может присутствовать правило &amp;lt;tex&amp;gt;S \rightarrow \varepsilon&amp;lt;/tex&amp;gt;, но в этом случае &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; не встречается в правых частях правил); &amp;lt;tex&amp;gt;L(G') = L(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Добавить все правила из &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;P'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# [[#.D0.90.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC_.D0.BF.D0.BE.D0.B8.D1.81.D0.BA.D0.B0_.CE.B5-.D0.BF.D0.BE.D1.80.D0.BE.D0.B6.D0.B4.D0.B0.D1.8E.D1.89.D0.B8.D1.85_.D0.BD.D0.B5.D1.82.D0.B5.D1.80.D0.BC.D0.B8.D0.BD.D0.B0.D0.BB.D0.BE.D0.B2 | Найти все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождаюшие нетерминалы]].&lt;br /&gt;
# Для каждого правила вида &amp;lt;tex&amp;gt;A \rightarrow \alpha_0 B_1 \alpha_1 B_2 \alpha_2 ... B_k \alpha_k&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;\alpha_i&amp;lt;/tex&amp;gt; — последовательности из терминалов и нетерминалов, &amp;lt;tex&amp;gt;B_j&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающие нетерминалы) добавить в &amp;lt;tex&amp;gt;P'&amp;lt;/tex&amp;gt; все возможные варианты правил, в которых либо присутствует, либо удалён каждый из нетерминалов &amp;lt;tex&amp;gt;B_j\; (1 \le j \le k)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Удалить все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правила из &amp;lt;tex&amp;gt;P'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Если в исходной грамматике &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; выводилось &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;, то необходимо добавить новый нетерминал &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, сделать его стартовым, добавить правило &amp;lt;tex&amp;gt;S' \rightarrow S|\varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Доказательство корректности ===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = Если грамматика &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; была построена с помощью описанного выше алгоритма по грамматике &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;L(G') = L(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
Сначала докажем, что, если не выполнять шаг 5 алгоритма, то получится грамматика &amp;lt;tex&amp;gt;G' : L(G') = L(G) \setminus \lbrace \varepsilon \rbrace &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Для этого достаточно доказать, что&lt;br /&gt;
&amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt; (*).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&amp;lt;br\&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;&amp;amp;nbsp; и&amp;amp;nbsp; &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Докажем индукцией по длине порождения в грамматике &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; &lt;br /&gt;
'''База'''. &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow} w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
В этом случае в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть правило &amp;lt;tex&amp;gt;A \rightarrow w&amp;lt;/tex&amp;gt;. По построению &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть правило &amp;lt;tex&amp;gt;A \rightarrow \alpha&amp;lt;/tex&amp;gt;, причем &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; — цепочка &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, элементы которой, возможно, перемежаются &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающими нетерминалами. Тогда в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть порождения &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow} \alpha \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Предположение индукции'''. Пусть из &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w \ne \varepsilon&amp;lt;/tex&amp;gt; менее, чем за &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, следует, что &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Переход'''.&lt;br /&gt;
Пусть в порождении &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, &amp;lt;tex&amp;gt;n &amp;gt; 1&amp;lt;/tex&amp;gt;. Тогда оно имеет вид &amp;lt;tex&amp;gt;A\underset{G'}{\Rightarrow}X_1 X_2...X_k \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;X_i \in N \cup \Sigma &amp;lt;/tex&amp;gt;. Первое использованное правило должно быть построено по правилу грамматики &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;A \rightarrow Y_1 Y_2...Y_m&amp;lt;/tex&amp;gt;, где последовательность &amp;lt;tex&amp;gt;Y_1 Y_2...Y_m&amp;lt;/tex&amp;gt; совпадает с последовательностью &amp;lt;tex&amp;gt;X_1 X_2...X_k&amp;lt;/tex&amp;gt;, символы которой, возможно, перемежаются &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающими нетерминалами.&amp;lt;br/&amp;gt;&lt;br /&gt;
Цепочку &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; можно разбить на &amp;lt;tex&amp;gt;w_1 w_2...w_k&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;X_i \underset{G'}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;X_i&amp;lt;/tex&amp;gt; — терминал, то &amp;lt;tex&amp;gt;w_i = X_i&amp;lt;/tex&amp;gt;, a если нетерминал, то порождение &amp;lt;tex&amp;gt;X_i \underset{G'}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt; содержит менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов. По предположению &amp;lt;tex&amp;gt;X_i \underset{G}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;, значит &amp;lt;tex&amp;gt;A \underset {G}{\Rightarrow} Y_1 Y_2...Y_m \underset{G}{\Rightarrow}^* X_1 X_2...X_k \underset{G}{\Rightarrow}^* w_1 w_2...w_k = w&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;&amp;amp;nbsp; и&amp;amp;nbsp; &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; &lt;br /&gt;
Докажем индукцией по длине порождения в грамматике &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; &lt;br /&gt;
'''База'''. &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow} w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Правило &amp;lt;tex&amp;gt;A \rightarrow w&amp;lt;/tex&amp;gt; присутствует в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;, это же правило будет и в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, поэтому &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Предположение индукции'''. Пусть из &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w \ne \varepsilon&amp;lt;/tex&amp;gt; менее, чем за &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, следует, что &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Переход'''. Пусть в порождении &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, &amp;lt;tex&amp;gt;n &amp;gt; 1&amp;lt;/tex&amp;gt;. Тогда оно имеет вид &amp;lt;tex&amp;gt;A\underset{G}{\Rightarrow}Y_1 Y_2...Y_m \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Y_i \in N \cup \Sigma &amp;lt;/tex&amp;gt;. Цепочку &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; можно разбить на &amp;lt;tex&amp;gt;w_1 w_2...w_m&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Y_i \underset{G}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;Y_{i_1}, Y_{i_2}, ..., Y_{i_p}&amp;lt;/tex&amp;gt; — подпоследовательность, состоящая из всех элементов, таких, что &amp;lt;tex&amp;gt;w_{i_k} \ne \varepsilon&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;Y_{i_1} Y_{i_2} ... Y_{i_p} \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;p \ge 1&amp;lt;/tex&amp;gt;, поскольку &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;A \rightarrow Y_{i_1} Y_{i_2} ... Y_{i_p}&amp;lt;/tex&amp;gt; является правилом в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; по построению &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Так как каждое из порождений &amp;lt;tex&amp;gt;Y_i \underset{G}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt; содержит менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, к ним можно применить предположение индукции и заключить, что, если &amp;lt;tex&amp;gt;w_i \ne \varepsilon&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;Y_i \underset{G'}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow} Y_{i_1} Y_{i_2} ... Y_{i_p} \underset{G'}{\Rightarrow}^* w&amp;lt;/tex&amp;gt;.&lt;br /&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;w \in L(G)&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;w \in L(G')&amp;lt;/tex&amp;gt;. Так как после выполнения шага 5 алгоритма в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; могло добавиться только пустое слово &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;, то язык, задаваемый КС грамматикой &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, совпадает с языком, задаваемым КС грамматикой &amp;lt;tex&amp;gt;G&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; \Gamma = &lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow T_1 T_2 T_3 ... T_n\\&lt;br /&gt;
    T_1\rightarrow t_1|\varepsilon\\&lt;br /&gt;
    T_2\rightarrow t_2|\varepsilon\\&lt;br /&gt;
    ...\\&lt;br /&gt;
    T_n\rightarrow t_n|\varepsilon&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\left| \Gamma \right| = O(n)&amp;lt;/tex&amp;gt;. Из нетерминала &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; можно вывести &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt; сочетаний нетерминалов &amp;lt;tex&amp;gt;T_i&amp;lt;/tex&amp;gt;. Таким образом в худшем случае алгоритм работает за &amp;lt;tex&amp;gt;O(\left| \Gamma \right| ^ 2)&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Однако если в грамматике устранены [[Удаление_длинных_правил_из_грамматики|длинные правила]], то алгоритм будет работать за &amp;lt;tex&amp;gt;O(\left| \Gamma \right|)&amp;lt;/tex&amp;gt; и добавит в грамматику &amp;lt;tex&amp;gt;O(\left| \Gamma \right|)&amp;lt;/tex&amp;gt; новых правил длинны &amp;lt;tex&amp;gt;O(1)&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 ABCd\\&lt;br /&gt;
    A\rightarrow a|\varepsilon\\&lt;br /&gt;
    B\rightarrow AC\\&lt;br /&gt;
    C\rightarrow c|\varepsilon&lt;br /&gt;
\end{array}&lt;br /&gt;
&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;\varepsilon&amp;lt;/tex&amp;gt;-порождающими нетерминалами.&lt;br /&gt;
# Переберём для каждого правила все возможные сочетания &amp;amp;epsilon;-порождающих нетерминалов и добавим новые правила:&lt;br /&gt;
#* &amp;lt;tex&amp;gt;S\rightarrow Ad|ABd|Bd|BCd|Cd|d&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S \rightarrow ABCd&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;B \rightarrow A|C&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;B \rightarrow AC&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Удалим праила &amp;lt;tex&amp;gt;A\rightarrow \varepsilon&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;C\rightarrow \varepsilon&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате мы получим новую грамматику без &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правил:&lt;br /&gt;
&amp;lt;tex&amp;gt;\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow Ad|ABd|ABCd|Bd|BCd|Cd|d\\&lt;br /&gt;
    A\rightarrow a\\&lt;br /&gt;
    B\rightarrow A|AC|C\\&lt;br /&gt;
    C\rightarrow c&lt;br /&gt;
\end{array}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Алгоритм поиска &amp;amp;epsilon;-порождающих нетерминалов ==&lt;br /&gt;
'''Вход:''' КС грамматика &amp;lt;tex&amp;gt; G=\langle N,\Sigma, P, S \rangle&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Выход:''' множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов.&lt;br /&gt;
&lt;br /&gt;
# Найти все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правила. Составить множество, состоящее из нетерминалов, входящих в левые части таких правил.&lt;br /&gt;
# Перебираем правила грамматики &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Если найдено правило &amp;lt;tex&amp;gt;A \rightarrow C_1C_2...C_k&amp;lt;/tex&amp;gt;, для которого верно, что каждый &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; принадлежит множеству, то добавить &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в множество.&lt;br /&gt;
# Если на шаге 2 множество изменилось, то повторить шаг 2.&lt;br /&gt;
&lt;br /&gt;
=== Доказательство корректности ===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = Описанный выше алгоритм находит все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающие нетерминалы грамматики &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
&lt;br /&gt;
Для доказательства корректности алгоритма достаточно показать, что, если множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов на очередной итерации алгоритма не изменялось, то алгоритм нашел все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающие нетерминалы.&lt;br /&gt;
&lt;br /&gt;
Пусть после завершения алгоритма существуют нетерминалы такие, что они являются &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающими, но не были найдены алгоритмом. Выберем из этих нетерминалов нетерминал &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;, из которого выводится &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; за наименьшее число шагов. Тогда в грамматике есть правило &amp;lt;tex&amp;gt;B \rightarrow C_1C_2...C_k&amp;lt;/tex&amp;gt;, где каждый нетерминал &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающий. Каждый &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; входит в множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов, так как иначе вместо &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; необходимо было взять &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt;. Следовательно, на одной из итераций алгоритма &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; уже добавился в множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов. Противоречие. Следовательно, алгоритм находит все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;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 ABC|DS\\&lt;br /&gt;
    A\rightarrow \varepsilon\\&lt;br /&gt;
    B\rightarrow AC\\&lt;br /&gt;
    C\rightarrow \varepsilon\\&lt;br /&gt;
    D\rightarrow d&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Возьмём множество состоящее из &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов &amp;lt;tex&amp;gt;\lbrace A, C \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Добавим &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; в множество, так как правая часть правила &amp;lt;tex&amp;gt;B\rightarrow AC&amp;lt;/tex&amp;gt; состоит только из нетерминалов из множества.&lt;br /&gt;
# Повторим второй пункт для правила &amp;lt;tex&amp;gt;S\rightarrow ABC&amp;lt;/tex&amp;gt; и получим множество &amp;lt;tex&amp;gt;\lbrace A, B, C, S \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Больше нет нерассмотренных правил, содержащих справа только нетерминалы из множества.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;lt;tex&amp;gt;\varepsilon&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;S&amp;lt;/tex&amp;gt;.&lt;br /&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. — С. 273: ISBN 5-8459-0261-4 (рус.)&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0_%D0%A5%D0%BE%D0%BC%D1%81%D0%BA%D0%BE%D0%B3%D0%BE&amp;diff=33701</id>
		<title>Нормальная форма Хомского</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0_%D0%A5%D0%BE%D0%BC%D1%81%D0%BA%D0%BE%D0%B3%D0%BE&amp;diff=33701"/>
				<updated>2013-11-17T10:41:46Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=Грамматикой в '''нормальной форме Хомского''' (''Chomsky normal form'') называется [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]], в которой могут содержатся правила только следующего вида:&lt;br /&gt;
&amp;lt;tex&amp;gt;A \rightarrow B C &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A \rightarrow a &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S \rightarrow \varepsilon &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; {{---}} терминал, &amp;lt;tex&amp;gt; A, B, C &amp;lt;/tex&amp;gt; {{---}} нетерминалы, &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; {{---}} стартовая вершина, &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt; {{---}} пустая строка, стартовая вершина не содержится в правых частях правил.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Приведение грамматики к нормальной форме Хомского==&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Любую контекстно-свободную грамматику можно привести к нормальной форме Хомского.&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим контекстно-свободную грамматику &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;. Для приведения ее к нормальной форме Хомского необходимо выполнить пять шагов. На каждом шаге мы строим новую &amp;lt;tex&amp;gt; \Gamma_i &amp;lt;/tex&amp;gt;, которая допускает тот же язык, что и &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Уберём длинные правила.&lt;br /&gt;
#: Воспользуемся [[Удаление длинных правил из грамматики|алгоритмом удаления длинных правил]] из грамматики. Получим грамматику &amp;lt;tex&amp;gt; \Gamma_1 &amp;lt;/tex&amp;gt;, эквивалентную исходной, содержащую правила длины 0, 1 и 2.&lt;br /&gt;
# Удаление &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правил.&lt;br /&gt;
#:Воспользуемся [[Удаление eps-правил из грамматики|алгоритмом удаления &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правил ]] из грамматики. Получим грамматику &amp;lt;tex&amp;gt; \Gamma_2 &amp;lt;/tex&amp;gt;, эквивалентную исходной, но в которой нет &amp;lt;tex&amp;gt;\varepsilon &amp;lt;/tex&amp;gt;-правил.&lt;br /&gt;
# Удаление цепных правил.&lt;br /&gt;
#:Воспользуемся [[Удаление_цепных_правил_из_грамматики| алгоритмом удаления цепных правил]] из грамматики. Алгоритм работает таким образом, что новые &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правила не образуются. Получим грамматику &amp;lt;tex&amp;gt; \Gamma_3 &amp;lt;/tex&amp;gt;, эквивалентную &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Удалим бесполезные символы.&lt;br /&gt;
#:Воспользуемся [[Удаление бесполезных символов из грамматики| алгоритмом удаления бесполезных символов]] из грамматики. Так как &amp;lt;tex&amp;gt; \Gamma_3 &amp;lt;/tex&amp;gt; эквивалентна &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;, то бесполезные символы не могли перестать быть бесполезными. Более того, мы только удаляем правила, новые &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правила и цепные правила не могли появиться.&lt;br /&gt;
# Уберём ситуации, когда в правиле встречаются несколько терминалов.&lt;br /&gt;
#:Для всех правил вида &amp;lt;tex&amp;gt; A \rightarrow u_1 u_2&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt; u_i &amp;lt;/tex&amp;gt; {{---}} терминал или нетерминал) заменим все терминалы &amp;lt;tex&amp;gt; u_i &amp;lt;/tex&amp;gt; на новые нетерминалы &amp;lt;tex&amp;gt; U_i &amp;lt;/tex&amp;gt; и добавим правила &amp;lt;tex&amp;gt; U_i \rightarrow u_i &amp;lt;/tex&amp;gt;. Теперь правила содержат либо одиночный терминал, либо строку из двух нетерминалов. &lt;br /&gt;
Таким образом, мы получили грамматику в нормальной форме Хомского, которая допускает тот же язык, что и &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что размеры грамматики при таком порядке действий возрастают полиномиально.&lt;br /&gt;
&lt;br /&gt;
При удалении длинных правил из каждого правила длины  &amp;lt;tex&amp;gt; k \ge 3 &amp;lt;/tex&amp;gt; могло появиться &amp;lt;tex&amp;gt; k-1 &amp;lt;/tex&amp;gt; новых правил, причем их длина не превышает двух. На этом шаге размер грамматики возрастает не более, чем вдвое.&lt;br /&gt;
&lt;br /&gt;
При удалении &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правил из грамматики, содержащей правила длины 0, 1 и 2, размеры грамматики могли вырасти не больше, чем в 3 раза.&lt;br /&gt;
&lt;br /&gt;
Всего цепных правил в грамматике не больше, чем &amp;lt;tex&amp;gt; n^2 &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; {{---}} число нетерминалов. При удалении цепных правил мы берем каждую из цепных пар и производим добавление нецепных правил, выводимых из второго нетерминала в паре. Если максимальная суммарная длина всех правил, выводимых из какого-либо нетерминала, равна &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, то размер грамматики возрастет не больше, чем на &amp;lt;tex&amp;gt; k \cdot n^2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наконец, на последнем шаге может произойти добавление не более, чем &amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt; {{---}} алфавит грамматики) новых правил, причем все они будут длины 1.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Рассмотрим грамматику для языка правильных скобочных последовательностей: &amp;lt;tex&amp;gt;S\rightarrow \varepsilon|(S)|SS&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Удалим длинные правила и получим грамматику &amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow \varepsilon|A)|SS\\&lt;br /&gt;
    A\rightarrow (S&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Удалим &amp;amp;epsilon; правила - &amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow \varepsilon|S'\\&lt;br /&gt;
    S'\rightarrow A)|S'S'\\&lt;br /&gt;
    A\rightarrow (S'|(&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Удалим цепные правила - &amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow \varepsilon|A)|S'S'\\&lt;br /&gt;
    S'\rightarrow A)|S'S'\\&lt;br /&gt;
    A\rightarrow (S'|(&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Заменим терминалы на нетерминалы - &amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow \varepsilon|AB|S'S'\\&lt;br /&gt;
    S'\rightarrow AB|S'S'\\&lt;br /&gt;
    A\rightarrow CS'|(\\&lt;br /&gt;
    C\rightarrow (\\&lt;br /&gt;
    B\rightarrow )&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;
* [http://en.wikipedia.org/wiki/Chomsky_normal_form Chomsky normal form]&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* http://www.enseignement.polytechnique.fr/informatique/profs/Luc.Maranget/IF/09/chomsky.pdf&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<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%B4%D0%BB%D0%B8%D0%BD%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33700</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%B4%D0%BB%D0%B8%D0%BD%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33700"/>
				<updated>2013-11-17T10:36:10Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Пусть  &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; {{---}} [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]].&lt;br /&gt;
Правило &amp;lt;tex&amp;gt;A \rightarrow \beta &amp;lt;/tex&amp;gt; называется '''длинным''', если &amp;lt;tex&amp;gt;|\beta| &amp;gt; 2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&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;, не содержащую длинных правил. &amp;lt;br&amp;gt;&lt;br /&gt;
Задача удаления длинных правил из грамматики возникает при попытке её приведения к [[нормальная форма Хомского|нормальной форме Хомского]].&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
С каждым длинным правилом &amp;lt;tex&amp;gt;A \rightarrow a_1 a_2 \ldots a_k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;k &amp;gt; 2&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;a_i \in \Sigma \cup N&amp;lt;/tex&amp;gt; проделаем следующее: &amp;lt;br&amp;gt;&lt;br /&gt;
#Добавим в грамматику &amp;lt;tex&amp;gt;k-2&amp;lt;/tex&amp;gt; новых нетерминала &amp;lt;tex&amp;gt;B_1, B_2, \ldots B_{k-2}&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
#Добавим в грамматику &amp;lt;tex&amp;gt;k-1&amp;lt;/tex&amp;gt; новое правило: &amp;lt;br&amp;gt;&lt;br /&gt;
#:&amp;lt;tex&amp;gt;A \rightarrow a_1B_1&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
#:&amp;lt;tex&amp;gt;B_1 \rightarrow a_2B_2&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
#:&amp;lt;tex&amp;gt;B_2 \rightarrow a_3B_3&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
#:&amp;lt;tex&amp;gt;\ldots &amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
#:&amp;lt;tex&amp;gt;B_{k-2} \rightarrow a_{k-1}a_{k}&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
#Удалим из грамматики правило &amp;lt;tex&amp;gt;A \rightarrow a_1 a_2 \ldots a_k&amp;lt;/tex&amp;gt;. &lt;br /&gt;
=== Корректность алгоритма ===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; {{---}} [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]]. &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; {{---}} грамматика, полученная в результате применения алгоритма к &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;L(\Gamma) = L(\Gamma').&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow &amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt;L(\Gamma) \subseteq L(\Gamma')&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;w \in L(\Gamma)&amp;lt;/tex&amp;gt;. Рассмотрим вывод &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;. Если в выводе используется длинное правило &amp;lt;tex&amp;gt;A \rightarrow a_1 a_2 \ldots a_k&amp;lt;/tex&amp;gt;, то заменим его на последовательное применение правил &amp;lt;tex&amp;gt;A \rightarrow a_1B_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;B_1 \rightarrow a_2B_2&amp;lt;/tex&amp;gt;, &lt;br /&gt;
&amp;lt;tex&amp;gt;B_2 \rightarrow a_3B_3&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\ldots &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;B_{k-2} \rightarrow a_{k-1}a_{k}&amp;lt;/tex&amp;gt;. Получим вывод &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow &amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt;L(\Gamma') \subseteq L(\Gamma)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Допустим, что это не так, то есть &amp;lt;tex&amp;gt;\exists w \in L(\Gamma'), w \notin L(\Gamma)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt; &lt;br /&gt;
Рассмотрим вывод &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\Gamma' \cup \Gamma&amp;lt;/tex&amp;gt;, минимальный по количеству примененных правил, отсутствующих в &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Найдем в этом выводе первое применение некоторого правила &amp;lt;tex&amp;gt;A \rightarrow a_1A_1, a_1 \in \Sigma \cup N&amp;lt;/tex&amp;gt;, которого нет в &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. В ходе алгоритма оно было получено из некоторого длинного правила &amp;lt;tex&amp;gt;A \rightarrow a_1 a_2 \ldots a_k&amp;lt;/tex&amp;gt;. Применим &amp;lt;tex&amp;gt;A \rightarrow a_1 a_2 \ldots a_k&amp;lt;/tex&amp;gt; вместо &amp;lt;tex&amp;gt;A \rightarrow a_1A_1&amp;lt;/tex&amp;gt; и удалим в выводе все применения правил, полученных из &amp;lt;tex&amp;gt;A \rightarrow a_1 a_2 \ldots a_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Получим вывод &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\Gamma \cup \Gamma'&amp;lt;/tex&amp;gt;, в котором меньше применений правил, отсутствующих в &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, чем в исходном. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Время работы алгоритма ==&lt;br /&gt;
Данный алгоритм работает за &amp;lt;tex&amp;gt;O(\left| \Gamma \right|)&amp;lt;/tex&amp;gt; и добавляет в грамматику &amp;lt;tex&amp;gt;O(\left| \Gamma \right|)&amp;lt;/tex&amp;gt; новых правил длинны &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Пример работы ==&lt;br /&gt;
Покажем, как описанный алгоритм будет работать на следующей грамматике: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;S \rightarrow AB&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;A \rightarrow aBcB&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;B \rightarrow def&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для правила &amp;lt;tex&amp;gt;A \rightarrow aBcB&amp;lt;/tex&amp;gt; вводим 2 новых нетерминала &amp;lt;tex&amp;gt;A_1, A_2&amp;lt;/tex&amp;gt; и 3 новых правила: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;A \rightarrow aA_1&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;A_1 \rightarrow BA_2&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;A_2 \rightarrow cB&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для правила &amp;lt;tex&amp;gt;B \rightarrow def&amp;lt;/tex&amp;gt; вводим 1 новый нетерминал &amp;lt;tex&amp;gt;B_1&amp;lt;/tex&amp;gt; и 2 новых правила: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;B \rightarrow dB_1&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;B_1 \rightarrow ef&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В итоге полученная грамматика &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; будет иметь вид: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;S \rightarrow AB&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;A \rightarrow aA_1&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;A_1 \rightarrow BA_2&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;A_2 \rightarrow cB&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;B \rightarrow dB_1&amp;lt;/tex&amp;gt;, &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;B_1 \rightarrow ef&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&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;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<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_%D1%86%D0%B5%D0%BF%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33699</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_%D1%86%D0%B5%D0%BF%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33699"/>
				<updated>2013-11-17T10:18:31Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Цепное правило''' (''unit rule'') — правило вида &amp;lt;tex&amp;gt;A\rightarrow B&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; — нетерминалы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&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;, не содержащую цепных правил. &amp;lt;br&amp;gt;&lt;br /&gt;
Задача удаления цепных правил из грамматики возникает при попытке её приведения к [[нормальная форма Хомского|нормальной форме Хомского]].&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Цепная пара''' (''unit pair'') — упорядоченная пара &amp;lt;tex&amp;gt;(A,B)&amp;lt;/tex&amp;gt;, в которой &amp;lt;tex&amp;gt;A\Rightarrow ^* B&amp;lt;/tex&amp;gt;, используя только цепные правила.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм удаления цепных правил из грамматики:&lt;br /&gt;
#Найти все цепные пары в грамматике &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Для каждой цепной пары &amp;lt;tex&amp;gt;(A,B)&amp;lt;/tex&amp;gt; добавить в грамматику &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; все правила вида &amp;lt;tex&amp;gt;A\rightarrow\alpha&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;B\rightarrow\alpha&amp;lt;/tex&amp;gt; {{---}} нецепное правило из &amp;lt;tex&amp;gt;\Gamma&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;(A,A)&amp;lt;/tex&amp;gt; {{---}} цепная пара для любого нетерминала, так как &amp;lt;tex&amp;gt;A\Rightarrow ^* A&amp;lt;/tex&amp;gt; за ноль шагов.&lt;br /&gt;
&lt;br /&gt;
'''Индукция.''' Если пара &amp;lt;tex&amp;gt;(A,B)&amp;lt;/tex&amp;gt; {{---}} цепная, и есть правило &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;(A,C)&amp;lt;/tex&amp;gt; {{---}} цепная пара.&lt;br /&gt;
&lt;br /&gt;
Нетрудно понять, что такой алгоритм найдет все цепные правила грамматики &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, и только их.&lt;br /&gt;
&lt;br /&gt;
===Корректность алгоритма===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; {{---}} [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]]. &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; {{---}} грамматика, полученная в результате применения алгоритма к &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;L(\Gamma) = L(\Gamma').&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow &amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt;L(\Gamma) \subseteq L(\Gamma')&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;w\in L(\Gamma)&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; имеет левое порождение &amp;lt;tex&amp;gt;S\overset{*}{\underset{lm}{\Rightarrow}} w&amp;lt;/tex&amp;gt;. Где бы в левом порождении ни использовалось цепное правило, нетерминал в правой части становится крайним слева в выводимой цепочке и сразу же заменяется. Таким образом, левое порождение в &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; можно разбить на последовательность шагов, в которых ноль или несколько цепных правил сопровождаются нецепным. Заметим, что любое нецепное правило, перед которым нет цепных, образует такой шаг. Но по построению &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; каждый из этих шагов может быть выполнен одним её правилом. Таким образом, &amp;lt;tex&amp;gt;S\overset{*}{\underset{\Gamma'}{\Rightarrow}} w&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;w\in L(\Gamma')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow &amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt;L(\Gamma') \subseteq L(\Gamma)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;w\in L(\Gamma')&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;S\overset{*}{\underset{\Gamma'}{\Rightarrow}} w&amp;lt;/tex&amp;gt;. Так как каждое правило &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; эквивалентно последовательности из нуля или нескольких цепных правил &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, за которой следует нецепное правило из &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, то из &amp;lt;tex&amp;gt;\alpha{\underset{\Gamma'}{\Rightarrow}} \beta&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;\alpha\overset{*}{\underset{\Gamma}{\Rightarrow}} \beta&amp;lt;/tex&amp;gt;. Таким образом, каждый шаг порождения в &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; может быть заменен одним или несколькими шагами в &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. Собрав эти последовательности шагов, получим, что &amp;lt;tex&amp;gt;S\overset{*}{\underset{\Gamma}{\Rightarrow}} w&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;w\in L(\Gamma)&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;O(\left| \Gamma \right| ^ 2)&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;
    A\rightarrow B|a\\&lt;br /&gt;
    B\rightarrow C|b\\&lt;br /&gt;
    C\rightarrow DD|c&lt;br /&gt;
\end{array}&amp;lt;/tex&amp;gt;, в которой есть два цепных правила &amp;lt;tex&amp;gt;A\rightarrow B&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Для каждого нетерминала создадим цепную пару. Теперь множество цепных пар будет состоять из &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(C, C)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(D, D)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Рассмотрим цепное правило &amp;lt;tex&amp;gt;A\rightarrow B&amp;lt;/tex&amp;gt;. Так как существует цепная пара &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt;, второй элемент которой совпадает с левым нетерминалом из правила,&amp;lt;br&amp;gt;добавим в множество пару &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt;, у которой первый элемент такой же как у найденной, а второй равен правому нетерминалу из текущего правила.&lt;br /&gt;
# Повторим второй пункт для правила &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt; и пары &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt;. Теперь множество цепных пар будет состоять из &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(C, C)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(D, D)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(B, C)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Повторим второй пункт для правила &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt; и пары &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt;, и получим множество &amp;lt;tex&amp;gt;\lbrace (A, A), (B, B), (C, C), (D, D), (A, B), (B, C), (A, C)\rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Для каждой пары добавим в &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; новые правила:&lt;br /&gt;
#* &amp;lt;tex&amp;gt;A\rightarrow b&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;A\rightarrow c&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A\rightarrow DD&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(A, C)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;B\rightarrow c&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B\rightarrow DD&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(B, C)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* Оставшиеся цепные пары новых правил не добавят.&lt;br /&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>91.215.121.216</name></author>	</entry>

	<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=33698</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=33698"/>
				<updated>2013-11-17T09:47:17Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Время работы алгоритма */&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>91.215.121.216</name></author>	</entry>

	<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=33697</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=33697"/>
				<updated>2013-11-16T22:28:59Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: &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>91.215.121.216</name></author>	</entry>

	<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=33364</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=33364"/>
				<updated>2013-10-31T20:43:54Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Пример */&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; называется '''порождающим''', если из него может быть выведена конечная терминальная цепочка. Иначе он называется '''непорождающим'''.&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;
Рассмотрим грамматику:&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;
    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;B&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;, так как оно содержит в правой части нетерминал, которого нет в полученном множестве.&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; называется '''достижимым''' в КС-грамматике &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;. Иначе он называется '''недостижимым'''.&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;
{{Лемма&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;
Рассмотрим грамматику:&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; называется '''полезным''' в КС-грамматике &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;. Иначе он называется '''бесполезным'''.&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;
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0_%D0%A5%D0%BE%D0%BC%D1%81%D0%BA%D0%BE%D0%B3%D0%BE&amp;diff=33363</id>
		<title>Нормальная форма Хомского</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0_%D0%A5%D0%BE%D0%BC%D1%81%D0%BA%D0%BE%D0%B3%D0%BE&amp;diff=33363"/>
				<updated>2013-10-30T21:04:21Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Несколько определений==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Грамматикой в '''нормальной форме Хомского''' (''Chomsky normal form'') называется [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]], в которой могут содержатся правила только следующего вида:&lt;br /&gt;
&amp;lt;tex&amp;gt;A \rightarrow B C &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A \rightarrow a &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S \rightarrow \varepsilon &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; {{---}} терминал, &amp;lt;tex&amp;gt; A, B, C &amp;lt;/tex&amp;gt; {{---}} нетерминалы, &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; {{---}} стартовая вершина, &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt; {{---}} пустая строка, стартовая вершина не содержится в правых частях правил.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Приведение грамматики к нормальной форме Хомского==&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Любую контекстно-свободную грамматику можно привести к нормальной форме Хомского.&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим контекстно-свободную грамматику &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;. Для приведения ее к нормальной форме Хомского необходимо выполнить пять шагов. На каждом шаге мы строим новую &amp;lt;tex&amp;gt; \Gamma_i &amp;lt;/tex&amp;gt;, которая допускает тот же язык, что и &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Уберём длинные правила.&lt;br /&gt;
#: Воспользуемся [[Удаление длинных правил из грамматики|алгоритмом удаления длинных правил]] из грамматики. Получим грамматику &amp;lt;tex&amp;gt; \Gamma_1 &amp;lt;/tex&amp;gt;, эквивалентную исходной, содержащую правила длины 0, 1 и 2.&lt;br /&gt;
# Удаление &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правил.&lt;br /&gt;
#:Воспользуемся [[Удаление eps-правил из грамматики|алгоритмом удаления &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правил ]] из грамматики. Получим грамматику &amp;lt;tex&amp;gt; \Gamma_2 &amp;lt;/tex&amp;gt;, эквивалентную исходной, но в которой нет &amp;lt;tex&amp;gt;\varepsilon &amp;lt;/tex&amp;gt;-правил.&lt;br /&gt;
# Удаление цепных правил.&lt;br /&gt;
#:Воспользуемся [[Удаление_цепных_правил_из_грамматики| алгоритмом удаления цепных правил]] из грамматики. Алгоритм работает таким образом, что новые &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правила не образуются. Получим грамматику &amp;lt;tex&amp;gt; \Gamma_3 &amp;lt;/tex&amp;gt;, эквивалентную &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Удалим бесполезные символы.&lt;br /&gt;
#:Воспользуемся [[Удаление бесполезных символов из грамматики| алгоритмом удаления бесполезных символов]] из грамматики. Так как &amp;lt;tex&amp;gt; \Gamma_3 &amp;lt;/tex&amp;gt; эквивалентна &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;, то бесполезные символы не могли перестать быть бесполезными. Более того, мы только удаляем правила, новые &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правила и цепные правила не могли появиться.&lt;br /&gt;
# Уберём ситуации, когда в правиле встречаются несколько терминалов.&lt;br /&gt;
#:Для всех правил вида &amp;lt;tex&amp;gt; A \rightarrow u_1 u_2&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt; u_i &amp;lt;/tex&amp;gt; {{---}} терминал или нетерминал) заменим все терминалы &amp;lt;tex&amp;gt; u_i &amp;lt;/tex&amp;gt; на новые нетерминалы &amp;lt;tex&amp;gt; U_i &amp;lt;/tex&amp;gt; и добавим правила &amp;lt;tex&amp;gt; U_i \rightarrow u_i &amp;lt;/tex&amp;gt;. Теперь правила содержат либо одиночный терминал, либо строку из двух нетерминалов. &lt;br /&gt;
Таким образом, мы получили грамматику в нормальной форме Хомского, которая допускает тот же язык, что и &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что размеры грамматики при таком порядке действий возрастают полиномиально.&lt;br /&gt;
&lt;br /&gt;
При удалении длинных правил из каждого правила длины  &amp;lt;tex&amp;gt; k \ge 3 &amp;lt;/tex&amp;gt; могло появиться &amp;lt;tex&amp;gt; k-1 &amp;lt;/tex&amp;gt; новых правил, причем их длина не превышает двух. На этом шаге размер грамматики возрастает не более, чем вдвое.&lt;br /&gt;
&lt;br /&gt;
При удалении &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правил из грамматики, содержащей правила длины 0, 1 и 2, размеры грамматики могли вырасти не больше, чем в 3 раза.&lt;br /&gt;
&lt;br /&gt;
Всего цепных правил в грамматике не больше, чем &amp;lt;tex&amp;gt; n^2 &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; {{---}} число нетерминалов. При удалении цепных правил мы берем каждую из цепных пар и производим добавление нецепных правил, выводимых из второго нетерминала в паре. Если максимальная суммарная длина всех правил, выводимых из какого-либо нетерминала, равна &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, то размер грамматики возрастет не больше, чем на &amp;lt;tex&amp;gt; k \cdot n^2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наконец, на последнем шаге может произойти добавление не более, чем &amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt; {{---}} алфавит грамматики) новых правил, причем все они будут длины 1.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Рассмотрим грамматику для языка правильных скобочных последовательностей: &amp;lt;tex&amp;gt;S\rightarrow \varepsilon|``(&amp;quot;S``)&amp;quot;|SS&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Удалим длинные правила и получим грамматику &amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow \varepsilon|A``)&amp;quot;|SS\\&lt;br /&gt;
    A\rightarrow ``(&amp;quot;S&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Удалим &amp;amp;epsilon; правила - &amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow \varepsilon|S'\\&lt;br /&gt;
    S'\rightarrow A``)&amp;quot;|S'S'\\&lt;br /&gt;
    A\rightarrow ``(&amp;quot;S'|``(&amp;quot;&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Удалим цепные правила - &amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow \varepsilon|A``)&amp;quot;|S'S'\\&lt;br /&gt;
    S'\rightarrow A``)&amp;quot;|S'S'\\&lt;br /&gt;
    A\rightarrow ``(&amp;quot;S'|``(&amp;quot;&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Заменим терминалы на нетерминалы - &amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow \varepsilon|AB|S'S'\\&lt;br /&gt;
    S'\rightarrow AB|S'S'\\&lt;br /&gt;
    A\rightarrow CS'|``(&amp;quot;\\&lt;br /&gt;
    C\rightarrow ``(&amp;quot;\\&lt;br /&gt;
    B\rightarrow ``)&amp;quot;&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* http://www.enseignement.polytechnique.fr/informatique/profs/Luc.Maranget/IF/09/chomsky.pdf&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0_%D0%A5%D0%BE%D0%BC%D1%81%D0%BA%D0%BE%D0%B3%D0%BE&amp;diff=33362</id>
		<title>Нормальная форма Хомского</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0_%D0%A5%D0%BE%D0%BC%D1%81%D0%BA%D0%BE%D0%B3%D0%BE&amp;diff=33362"/>
				<updated>2013-10-30T19:58:54Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Несколько определений==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Грамматикой в '''нормальной форме Хомского''' (''Chomsky normal form'') называется [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]], в которой могут содержатся правила только следующего вида:&lt;br /&gt;
&amp;lt;tex&amp;gt;A \rightarrow B C &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A \rightarrow a &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;S \rightarrow \varepsilon &amp;lt;/tex&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
где &amp;lt;tex&amp;gt; a &amp;lt;/tex&amp;gt; {{---}} терминал, &amp;lt;tex&amp;gt; A, B, C &amp;lt;/tex&amp;gt; {{---}} нетерминалы, &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; {{---}} стартовая вершина, &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt; {{---}} пустая строка, стартовая вершина не содержится в правых частях правил.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Приведение грамматики к нормальной форме Хомского==&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Любую контекстно-свободную грамматику можно привести к нормальной форме Хомского.&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим контекстно-свободную грамматику &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;. Для приведения ее к нормальной форме Хомского необходимо выполнить пять шагов. На каждом шаге мы строим новую &amp;lt;tex&amp;gt; \Gamma_i &amp;lt;/tex&amp;gt;, которая допускает тот же язык, что и &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Уберём длинные правила.&lt;br /&gt;
#: Воспользуемся [[Удаление длинных правил из грамматики|алгоритмом удаления длинных правил]] из грамматики. Получим грамматику &amp;lt;tex&amp;gt; \Gamma_1 &amp;lt;/tex&amp;gt;, эквивалентную исходной, содержащую правила длины 0, 1 и 2.&lt;br /&gt;
# Удаление &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правил.&lt;br /&gt;
#:Воспользуемся [[Удаление eps-правил из грамматики|алгоритмом удаления &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правил ]] из грамматики. Получим грамматику &amp;lt;tex&amp;gt; \Gamma_2 &amp;lt;/tex&amp;gt;, эквивалентную исходной, но в которой нет &amp;lt;tex&amp;gt;\varepsilon &amp;lt;/tex&amp;gt;-правил.&lt;br /&gt;
# Удаление цепных правил.&lt;br /&gt;
#:Воспользуемся [[Удаление_цепных_правил_из_грамматики| алгоритмом удаления цепных правил]] из грамматики. Алгоритм работает таким образом, что новые &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правила не образуются. Получим грамматику &amp;lt;tex&amp;gt; \Gamma_3 &amp;lt;/tex&amp;gt;, эквивалентную &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Удалим бесполезные символы.&lt;br /&gt;
#:Воспользуемся [[Удаление бесполезных символов из грамматики| алгоритмом удаления бесполезных символов]] из грамматики. Так как &amp;lt;tex&amp;gt; \Gamma_3 &amp;lt;/tex&amp;gt; эквивалентна &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;, то бесполезные символы не могли перестать быть бесполезными. Более того, мы только удаляем правила, новые &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правила и цепные правила не могли появиться.&lt;br /&gt;
# Уберём ситуации, когда в правиле встречаются несколько терминалов.&lt;br /&gt;
#:Для всех правил вида &amp;lt;tex&amp;gt; A \rightarrow u_1 u_2&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt; u_i &amp;lt;/tex&amp;gt; {{---}} терминал или нетерминал) заменим все терминалы &amp;lt;tex&amp;gt; u_i &amp;lt;/tex&amp;gt; на новые нетерминалы &amp;lt;tex&amp;gt; U_i &amp;lt;/tex&amp;gt; и добавим правила &amp;lt;tex&amp;gt; U_i \rightarrow u_i &amp;lt;/tex&amp;gt;. Теперь правила содержат либо одиночный терминал, либо строку из двух нетерминалов. &lt;br /&gt;
Таким образом, мы получили грамматику в нормальной форме Хомского, которая допускает тот же язык, что и &amp;lt;tex&amp;gt; \Gamma &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Заметим, что размеры грамматики при таком порядке действий возрастают полиномиально.&lt;br /&gt;
&lt;br /&gt;
При удалении длинных правил из каждого правила длины  &amp;lt;tex&amp;gt; k \ge 3 &amp;lt;/tex&amp;gt; могло появиться &amp;lt;tex&amp;gt; k-1 &amp;lt;/tex&amp;gt; новых правил, причем их длина не превышает двух. На этом шаге размер грамматики возрастает не более, чем вдвое.&lt;br /&gt;
&lt;br /&gt;
При удалении &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt;-правил из грамматики, содержащей правила длины 0, 1 и 2, размеры грамматики могли вырасти не больше, чем в 3 раза.&lt;br /&gt;
&lt;br /&gt;
Всего цепных правил в грамматике не больше, чем &amp;lt;tex&amp;gt; n^2 &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; {{---}} число нетерминалов. При удалении цепных правил мы берем каждую из цепных пар и производим добавление нецепных правил, выводимых из второго нетерминала в паре. Если максимальная суммарная длина всех правил, выводимых из какого-либо нетерминала, равна &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt;, то размер грамматики возрастет не больше, чем на &amp;lt;tex&amp;gt; k \cdot n^2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Наконец, на последнем шаге может произойти добавление не более, чем &amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;\Sigma&amp;lt;/tex&amp;gt; {{---}} алфавит грамматики) новых правил, причем все они будут длины 1.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Рассмотрим грамматику для языка правильных скобочных последовательностей: &amp;lt;tex&amp;gt;S\rightarrow \varepsilon|(S)|SS&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* http://www.enseignement.polytechnique.fr/informatique/profs/Luc.Maranget/IF/09/chomsky.pdf&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<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_eps-%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33361</id>
		<title>Удаление eps-правил из грамматики</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_eps-%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33361"/>
				<updated>2013-10-30T19:35:22Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Алгоритм удаления &amp;amp;epsilon;-правил из грамматики */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Используемые определения ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Правила вида &amp;lt;tex&amp;gt;A \to \varepsilon&amp;lt;/tex&amp;gt; называются '''&amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правилами'''.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется '''&amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающим''', если &amp;lt;tex&amp;gt;A \Rightarrow^* \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм удаления &amp;amp;epsilon;-правил из грамматики ==&lt;br /&gt;
'''Вход:''' КС грамматика &amp;lt;tex&amp;gt; G=\langle N,\Sigma, P, S \rangle&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Выход:''' КС грамматика &amp;lt;tex&amp;gt; G'=\langle N,\Sigma, P', S' \rangle&amp;lt;/tex&amp;gt; без &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правил (может присутствовать правило &amp;lt;tex&amp;gt;S \rightarrow \varepsilon&amp;lt;/tex&amp;gt;, но в этом случае &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; не встречается в правых частях правил); &amp;lt;tex&amp;gt;L(G') = L(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Добавить все правила из &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;P'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# [[#.D0.90.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC_.D0.BF.D0.BE.D0.B8.D1.81.D0.BA.D0.B0_.CE.B5-.D0.BF.D0.BE.D1.80.D0.BE.D0.B6.D0.B4.D0.B0.D1.8E.D1.89.D0.B8.D1.85_.D0.BD.D0.B5.D1.82.D0.B5.D1.80.D0.BC.D0.B8.D0.BD.D0.B0.D0.BB.D0.BE.D0.B2 | Найти все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождаюшие нетерминалы]].&lt;br /&gt;
# Для каждого правила вида &amp;lt;tex&amp;gt;A \rightarrow \alpha_0 B_1 \alpha_1 B_2 \alpha_2 ... B_k \alpha_k&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;\alpha_i&amp;lt;/tex&amp;gt; — последовательности из терминалов и нетерминалов, &amp;lt;tex&amp;gt;B_j&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающие нетерминалы) добавить в &amp;lt;tex&amp;gt;P'&amp;lt;/tex&amp;gt; все возможные варианты правил, в которых либо присутствует, либо удалён каждый из нетерминалов &amp;lt;tex&amp;gt;B_j\; (1 \le j \le k)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Удалить все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правила из &amp;lt;tex&amp;gt;P'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Если в исходной грамматике &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; выводилось &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;, то необходимо добавить новый нетерминал &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, сделать его стартовым, добавить правило &amp;lt;tex&amp;gt;S' \rightarrow S|\varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Доказательство корректности ===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = Если грамматика &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; была построена с помощью описанного выше алгоритма по грамматике &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;L(G') = L(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
Сначала докажем, что, если не выполнять шаг 5 алгоритма, то получится грамматика &amp;lt;tex&amp;gt;G' : L(G') = L(G) \setminus \lbrace \varepsilon \rbrace &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Для этого достаточно доказать, что&lt;br /&gt;
&amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt; (*).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&amp;lt;br\&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;&amp;amp;nbsp; и&amp;amp;nbsp; &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Докажем индукцией по длине порождения в грамматике &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; &lt;br /&gt;
'''База'''. &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow} w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
В этом случае в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть правило &amp;lt;tex&amp;gt;A \rightarrow w&amp;lt;/tex&amp;gt;. По построению &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть правило &amp;lt;tex&amp;gt;A \rightarrow \alpha&amp;lt;/tex&amp;gt;, причем &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; — цепочка &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, элементы которой, возможно, перемежаются &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающими нетерминалами. Тогда в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть порождения &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow} \alpha \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Предположение индукции'''. Пусть из &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w \ne \varepsilon&amp;lt;/tex&amp;gt; менее, чем за &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, следует, что &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Переход'''.&lt;br /&gt;
Пусть в порождении &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, &amp;lt;tex&amp;gt;n &amp;gt; 1&amp;lt;/tex&amp;gt;. Тогда оно имеет вид &amp;lt;tex&amp;gt;A\underset{G'}{\Rightarrow}X_1 X_2...X_k \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;X_i \in N \cup \Sigma &amp;lt;/tex&amp;gt;. Первое использованное правило должно быть построено по правилу грамматики &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;A \rightarrow Y_1 Y_2...Y_m&amp;lt;/tex&amp;gt;, где последовательность &amp;lt;tex&amp;gt;Y_1 Y_2...Y_m&amp;lt;/tex&amp;gt; совпадает с последовательностью &amp;lt;tex&amp;gt;X_1 X_2...X_k&amp;lt;/tex&amp;gt;, символы которой, возможно, перемежаются &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающими нетерминалами.&amp;lt;br/&amp;gt;&lt;br /&gt;
Цепочку &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; можно разбить на &amp;lt;tex&amp;gt;w_1 w_2...w_k&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;X_i \underset{G'}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;X_i&amp;lt;/tex&amp;gt; — терминал, то &amp;lt;tex&amp;gt;w_i = X_i&amp;lt;/tex&amp;gt;, a если нетерминал, то порождение &amp;lt;tex&amp;gt;X_i \underset{G'}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt; содержит менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов. По предположению &amp;lt;tex&amp;gt;X_i \underset{G}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;, значит &amp;lt;tex&amp;gt;A \underset {G}{\Rightarrow} Y_1 Y_2...Y_m \underset{G}{\Rightarrow}^* X_1 X_2...X_k \underset{G}{\Rightarrow}^* w_1 w_2...w_k = w&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;&amp;amp;nbsp; и&amp;amp;nbsp; &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; &lt;br /&gt;
Докажем индукцией по длине порождения в грамматике &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; &lt;br /&gt;
'''База'''. &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow} w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Правило &amp;lt;tex&amp;gt;A \rightarrow w&amp;lt;/tex&amp;gt; присутствует в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;, это же правило будет и в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, поэтому &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Предположение индукции'''. Пусть из &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w \ne \varepsilon&amp;lt;/tex&amp;gt; менее, чем за &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, следует, что &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Переход'''. Пусть в порождении &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, &amp;lt;tex&amp;gt;n &amp;gt; 1&amp;lt;/tex&amp;gt;. Тогда оно имеет вид &amp;lt;tex&amp;gt;A\underset{G}{\Rightarrow}Y_1 Y_2...Y_m \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Y_i \in N \cup \Sigma &amp;lt;/tex&amp;gt;. Цепочку &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; можно разбить на &amp;lt;tex&amp;gt;w_1 w_2...w_m&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Y_i \underset{G}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;Y_{i_1}, Y_{i_2}, ..., Y_{i_p}&amp;lt;/tex&amp;gt; — подпоследовательность, состоящая из всех элементов, таких, что &amp;lt;tex&amp;gt;w_{i_k} \ne \varepsilon&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;Y_{i_1} Y_{i_2} ... Y_{i_p} \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;p \ge 1&amp;lt;/tex&amp;gt;, поскольку &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;A \rightarrow Y_{i_1} Y_{i_2} ... Y_{i_p}&amp;lt;/tex&amp;gt; является правилом в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; по построению &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Так как каждое из порождений &amp;lt;tex&amp;gt;Y_i \underset{G}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt; содержит менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, к ним можно применить предположение индукции и заключить, что, если &amp;lt;tex&amp;gt;w_i \ne \varepsilon&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;Y_i \underset{G'}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow} Y_{i_1} Y_{i_2} ... Y_{i_p} \underset{G'}{\Rightarrow}^* w&amp;lt;/tex&amp;gt;.&lt;br /&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;w \in L(G)&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;w \in L(G')&amp;lt;/tex&amp;gt;. Так как после выполнения шага 5 алгоритма в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; могло добавиться только пустое слово &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;, то язык, задаваемый КС грамматикой &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, совпадает с языком, задаваемым КС грамматикой &amp;lt;tex&amp;gt;G&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 ABCd\\&lt;br /&gt;
    A\rightarrow a|\varepsilon\\&lt;br /&gt;
    B\rightarrow AC\\&lt;br /&gt;
    C\rightarrow c|\varepsilon&lt;br /&gt;
\end{array}&lt;br /&gt;
&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;amp;epsilon;-порождающими нетерминалами.&lt;br /&gt;
# Переберём для каждого правила все возможные сочетания &amp;amp;epsilon;-порождающих нетерминалов и добавим новые правила:&lt;br /&gt;
#* &amp;lt;tex&amp;gt;S\rightarrow Ad|ABd|Bd|BCd|Cd|d&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S \rightarrow ABCd&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;B \rightarrow A|C&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;B \rightarrow AC&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Удалим праила &amp;lt;tex&amp;gt;A\rightarrow \varepsilon&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;C\rightarrow \varepsilon&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В результате мы получим новую грамматику без &amp;amp;epsilon; правил:&lt;br /&gt;
&amp;lt;tex&amp;gt;\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow Ad|ABd|ABCd|Bd|BCd|Cd|d\\&lt;br /&gt;
    A\rightarrow a\\&lt;br /&gt;
    B\rightarrow A|AC|C\\&lt;br /&gt;
    C\rightarrow c&lt;br /&gt;
\end{array}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Алгоритм поиска &amp;amp;epsilon;-порождающих нетерминалов ==&lt;br /&gt;
'''Вход:''' КС грамматика &amp;lt;tex&amp;gt; G=\langle N,\Sigma, P, S \rangle&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Выход:''' множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов.&lt;br /&gt;
&lt;br /&gt;
# Найти все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правила. Составить множество, состоящее из нетерминалов, входящих в левые части таких правил.&lt;br /&gt;
# Перебираем правила грамматики &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Если найдено правило &amp;lt;tex&amp;gt;A \rightarrow C_1C_2...C_k&amp;lt;/tex&amp;gt;, для которого верно, что каждый &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; принадлежит множеству, то добавить &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в множество.&lt;br /&gt;
# Если на шаге 2 множество изменилось, то повторить шаг 2.&lt;br /&gt;
&lt;br /&gt;
=== Доказательство корректности ===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = Описанный выше алгоритм находит все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающие нетерминалы грамматики &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
&lt;br /&gt;
Для доказательства корректности алгоритма достаточно показать, что, если множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов на очередной итерации алгоритма не изменялось, то алгоритм нашел все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающие нетерминалы.&lt;br /&gt;
&lt;br /&gt;
Пусть после завершения алгоритма существуют нетерминалы такие, что они являются &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающими, но не были найдены алгоритмом. Выберем из этих нетерминалов нетерминал &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;, из которого выводится &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; за наименьшее число шагов. Тогда в грамматике есть правило &amp;lt;tex&amp;gt;B \rightarrow C_1C_2...C_k&amp;lt;/tex&amp;gt;, где каждый нетерминал &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающий. Каждый &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; входит в множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов, так как иначе вместо &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; необходимо было взять &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt;. Следовательно, на одной из итераций алгоритма &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; уже добавился в множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов. Противоречие. Следовательно, алгоритм находит все &amp;lt;tex&amp;gt;\varepsilon&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 ABC|DS\\&lt;br /&gt;
    A\rightarrow \varepsilon\\&lt;br /&gt;
    B\rightarrow AC\\&lt;br /&gt;
    C\rightarrow \varepsilon\\&lt;br /&gt;
    D\rightarrow d&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Возьмём множество состоящее &amp;amp;epsilon;-порождающих нетерминалов &amp;lt;tex&amp;gt;\lbrace A, C \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Добавим &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; в множество, так как правая часть правила &amp;lt;tex&amp;gt;B\rightarrow AC&amp;lt;/tex&amp;gt; состоит только из нетерминалов из множества.&lt;br /&gt;
# Повторим второй пункт для правила &amp;lt;tex&amp;gt;S\rightarrow ABC&amp;lt;/tex&amp;gt; и получим множество &amp;lt;tex&amp;gt;\lbrace A, B, C, S \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Больше нету нерассмотренных правил, содержащих справа только нетерминалы из множества.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;amp;epsilon;-порождающими нетерминалами являются &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;S&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* ''Хопкрофт Д., Мотвани Р., Ульман Д.''  '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — С. 273: ISBN 5-8459-0261-4 (рус.)&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<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_eps-%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33360</id>
		<title>Удаление eps-правил из грамматики</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_eps-%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33360"/>
				<updated>2013-10-30T19:09:29Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Алгоритм поиска &amp;amp;epsilon;-порождающих нетерминалов */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Используемые определения ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Правила вида &amp;lt;tex&amp;gt;A \to \varepsilon&amp;lt;/tex&amp;gt; называются '''&amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правилами'''.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition = Нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется '''&amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающим''', если &amp;lt;tex&amp;gt;A \Rightarrow^* \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм удаления &amp;amp;epsilon;-правил из грамматики ==&lt;br /&gt;
'''Вход:''' КС грамматика &amp;lt;tex&amp;gt; G=\langle N,\Sigma, P, S \rangle&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Выход:''' КС грамматика &amp;lt;tex&amp;gt; G'=\langle N,\Sigma, P', S' \rangle&amp;lt;/tex&amp;gt; без &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правил (может присутствовать правило &amp;lt;tex&amp;gt;S \rightarrow \varepsilon&amp;lt;/tex&amp;gt;, но в этом случае &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; не встречается в правых частях правил); &amp;lt;tex&amp;gt;L(G') = L(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# Добавить все правила из &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;P'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# [[#.D0.90.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC_.D0.BF.D0.BE.D0.B8.D1.81.D0.BA.D0.B0_.CE.B5-.D0.BF.D0.BE.D1.80.D0.BE.D0.B6.D0.B4.D0.B0.D1.8E.D1.89.D0.B8.D1.85_.D0.BD.D0.B5.D1.82.D0.B5.D1.80.D0.BC.D0.B8.D0.BD.D0.B0.D0.BB.D0.BE.D0.B2 | Найти все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождаюшие нетерминалы]].&lt;br /&gt;
# Для каждого правила вида &amp;lt;tex&amp;gt;A \rightarrow \alpha_0 B_1 \alpha_1 B_2 \alpha_2 ... B_k \alpha_k&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;\alpha_i&amp;lt;/tex&amp;gt; — последовательности из терминалов и нетерминалов, &amp;lt;tex&amp;gt;B_j&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающие нетерминалы) добавить в &amp;lt;tex&amp;gt;P'&amp;lt;/tex&amp;gt; все возможные варианты правил, в которых либо присутствует, либо удалён каждый из нетерминалов &amp;lt;tex&amp;gt;B_j\; (1 \le j \le k)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Удалить все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правила из &amp;lt;tex&amp;gt;P'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Если в исходной грамматике &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; выводилось &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;, то необходимо добавить новый нетерминал &amp;lt;tex&amp;gt;S'&amp;lt;/tex&amp;gt;, сделать его стартовым, добавить правило &amp;lt;tex&amp;gt;S' \rightarrow S|\varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Доказательство корректности ===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = Если грамматика &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; была построена с помощью описанного выше алгоритма по грамматике &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;L(G') = L(G)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
Сначала докажем, что, если не выполнять шаг 5 алгоритма, то получится грамматика &amp;lt;tex&amp;gt;G' : L(G') = L(G) \setminus \lbrace \varepsilon \rbrace &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Для этого достаточно доказать, что&lt;br /&gt;
&amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt; (*).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt;&amp;lt;br\&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;&amp;amp;nbsp; и&amp;amp;nbsp; &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Докажем индукцией по длине порождения в грамматике &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; &lt;br /&gt;
'''База'''. &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow} w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
В этом случае в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; есть правило &amp;lt;tex&amp;gt;A \rightarrow w&amp;lt;/tex&amp;gt;. По построению &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть правило &amp;lt;tex&amp;gt;A \rightarrow \alpha&amp;lt;/tex&amp;gt;, причем &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; — цепочка &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt;, элементы которой, возможно, перемежаются &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающими нетерминалами. Тогда в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; есть порождения &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow} \alpha \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Предположение индукции'''. Пусть из &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w \ne \varepsilon&amp;lt;/tex&amp;gt; менее, чем за &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, следует, что &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Переход'''.&lt;br /&gt;
Пусть в порождении &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, &amp;lt;tex&amp;gt;n &amp;gt; 1&amp;lt;/tex&amp;gt;. Тогда оно имеет вид &amp;lt;tex&amp;gt;A\underset{G'}{\Rightarrow}X_1 X_2...X_k \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;X_i \in N \cup \Sigma &amp;lt;/tex&amp;gt;. Первое использованное правило должно быть построено по правилу грамматики &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;A \rightarrow Y_1 Y_2...Y_m&amp;lt;/tex&amp;gt;, где последовательность &amp;lt;tex&amp;gt;Y_1 Y_2...Y_m&amp;lt;/tex&amp;gt; совпадает с последовательностью &amp;lt;tex&amp;gt;X_1 X_2...X_k&amp;lt;/tex&amp;gt;, символы которой, возможно, перемежаются &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающими нетерминалами.&amp;lt;br/&amp;gt;&lt;br /&gt;
Цепочку &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; можно разбить на &amp;lt;tex&amp;gt;w_1 w_2...w_k&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;X_i \underset{G'}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;X_i&amp;lt;/tex&amp;gt; — терминал, то &amp;lt;tex&amp;gt;w_i = X_i&amp;lt;/tex&amp;gt;, a если нетерминал, то порождение &amp;lt;tex&amp;gt;X_i \underset{G'}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt; содержит менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов. По предположению &amp;lt;tex&amp;gt;X_i \underset{G}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;, значит &amp;lt;tex&amp;gt;A \underset {G}{\Rightarrow} Y_1 Y_2...Y_m \underset{G}{\Rightarrow}^* X_1 X_2...X_k \underset{G}{\Rightarrow}^* w_1 w_2...w_k = w&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;&amp;amp;nbsp; и&amp;amp;nbsp; &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; &lt;br /&gt;
Докажем индукцией по длине порождения в грамматике &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, что &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; &lt;br /&gt;
'''База'''. &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow} w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Правило &amp;lt;tex&amp;gt;A \rightarrow w&amp;lt;/tex&amp;gt; присутствует в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;, это же правило будет и в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, поэтому &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Предположение индукции'''. Пусть из &amp;lt;tex&amp;gt;A \underset{G}{\Rightarrow}^*w \ne \varepsilon&amp;lt;/tex&amp;gt; менее, чем за &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, следует, что &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow}^*w &amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Переход'''. Пусть в порождении &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, &amp;lt;tex&amp;gt;n &amp;gt; 1&amp;lt;/tex&amp;gt;. Тогда оно имеет вид &amp;lt;tex&amp;gt;A\underset{G}{\Rightarrow}Y_1 Y_2...Y_m \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Y_i \in N \cup \Sigma &amp;lt;/tex&amp;gt;. Цепочку &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; можно разбить на &amp;lt;tex&amp;gt;w_1 w_2...w_m&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;Y_i \underset{G}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;Y_{i_1}, Y_{i_2}, ..., Y_{i_p}&amp;lt;/tex&amp;gt; — подпоследовательность, состоящая из всех элементов, таких, что &amp;lt;tex&amp;gt;w_{i_k} \ne \varepsilon&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;Y_{i_1} Y_{i_2} ... Y_{i_p} \underset{G}{\Rightarrow}^*w&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;p \ge 1&amp;lt;/tex&amp;gt;, поскольку &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;A \rightarrow Y_{i_1} Y_{i_2} ... Y_{i_p}&amp;lt;/tex&amp;gt; является правилом в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; по построению &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Так как каждое из порождений &amp;lt;tex&amp;gt;Y_i \underset{G}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt; содержит менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шагов, к ним можно применить предположение индукции и заключить, что, если &amp;lt;tex&amp;gt;w_i \ne \varepsilon&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;Y_i \underset{G'}{\Rightarrow}^*w_i&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt;A \underset{G'}{\Rightarrow} Y_{i_1} Y_{i_2} ... Y_{i_p} \underset{G'}{\Rightarrow}^* w&amp;lt;/tex&amp;gt;.&lt;br /&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;w \in L(G)&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;w \ne \varepsilon&amp;lt;/tex&amp;gt; тогда и только тогда, когда &amp;lt;tex&amp;gt;w \in L(G')&amp;lt;/tex&amp;gt;. Так как после выполнения шага 5 алгоритма в &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; могло добавиться только пустое слово &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;, то язык, задаваемый КС грамматикой &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;, совпадает с языком, задаваемым КС грамматикой &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм поиска &amp;amp;epsilon;-порождающих нетерминалов ==&lt;br /&gt;
'''Вход:''' КС грамматика &amp;lt;tex&amp;gt; G=\langle N,\Sigma, P, S \rangle&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
'''Выход:''' множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов.&lt;br /&gt;
&lt;br /&gt;
# Найти все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-правила. Составить множество, состоящее из нетерминалов, входящих в левые части таких правил.&lt;br /&gt;
# Перебираем правила грамматики &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Если найдено правило &amp;lt;tex&amp;gt;A \rightarrow C_1C_2...C_k&amp;lt;/tex&amp;gt;, для которого верно, что каждый &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; принадлежит множеству, то добавить &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; в множество.&lt;br /&gt;
# Если на шаге 2 множество изменилось, то повторить шаг 2.&lt;br /&gt;
&lt;br /&gt;
=== Доказательство корректности ===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement = Описанный выше алгоритм находит все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающие нетерминалы грамматики &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof =&lt;br /&gt;
&lt;br /&gt;
Для доказательства корректности алгоритма достаточно показать, что, если множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов на очередной итерации алгоритма не изменялось, то алгоритм нашел все &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающие нетерминалы.&lt;br /&gt;
&lt;br /&gt;
Пусть после завершения алгоритма существуют нетерминалы такие, что они являются &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающими, но не были найдены алгоритмом. Выберем из этих нетерминалов нетерминал &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;, из которого выводится &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; за наименьшее число шагов. Тогда в грамматике есть правило &amp;lt;tex&amp;gt;B \rightarrow C_1C_2...C_k&amp;lt;/tex&amp;gt;, где каждый нетерминал &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; — &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающий. Каждый &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt; входит в множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов, так как иначе вместо &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; необходимо было взять &amp;lt;tex&amp;gt;C_i&amp;lt;/tex&amp;gt;. Следовательно, на одной из итераций алгоритма &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; уже добавился в множество &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-порождающих нетерминалов. Противоречие. Следовательно, алгоритм находит все &amp;lt;tex&amp;gt;\varepsilon&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 ABC|DS\\&lt;br /&gt;
    A\rightarrow \varepsilon\\&lt;br /&gt;
    B\rightarrow AC\\&lt;br /&gt;
    C\rightarrow \varepsilon\\&lt;br /&gt;
    D\rightarrow d&lt;br /&gt;
\end{array}&lt;br /&gt;
&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Возьмём множество состоящее &amp;amp;epsilon;-порождающих нетерминалов &amp;lt;tex&amp;gt;\lbrace A, C \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Добавим &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; в множество, так как правая часть правила &amp;lt;tex&amp;gt;B\rightarrow AC&amp;lt;/tex&amp;gt; состоит только из нетерминалов из множества.&lt;br /&gt;
# Повторим второй пункт для правила &amp;lt;tex&amp;gt;S\rightarrow ABC&amp;lt;/tex&amp;gt; и получим множество &amp;lt;tex&amp;gt;\lbrace A, B, C, S \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Больше нету нерассмотренных правил, содержащих справа только нетерминалы из множества.&lt;br /&gt;
&lt;br /&gt;
Таким образом &amp;amp;epsilon;-порождающими нетерминалами являются &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;S&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* ''Хопкрофт Д., Мотвани Р., Ульман Д.''  '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — С. 273: ISBN 5-8459-0261-4 (рус.)&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<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_%D1%86%D0%B5%D0%BF%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33359</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_%D1%86%D0%B5%D0%BF%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33359"/>
				<updated>2013-10-30T19:02:22Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Цепное правило''' — правило вида &amp;lt;tex&amp;gt;A\rightarrow B&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; — нетерминалы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&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;, не содержащую цепных правил. &amp;lt;br&amp;gt;&lt;br /&gt;
Задача удаления цепных правил из грамматики возникает при попытке её приведения к [[нормальная форма Хомского|нормальной форме Хомского]].&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Цепная пара''' — упорядоченная пара &amp;lt;tex&amp;gt;(A,B)&amp;lt;/tex&amp;gt;, в которой &amp;lt;tex&amp;gt;A\Rightarrow ^* B&amp;lt;/tex&amp;gt;, используя только цепные правила.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм удаления цепных правил из грамматики:&lt;br /&gt;
#Найти все цепные пары в грамматике &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Для каждой цепной пары &amp;lt;tex&amp;gt;(A,B)&amp;lt;/tex&amp;gt; добавить в грамматику &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; все правила вида &amp;lt;tex&amp;gt;A\rightarrow\alpha&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;B\rightarrow\alpha&amp;lt;/tex&amp;gt; {{---}} нецепное правило из &amp;lt;tex&amp;gt;\Gamma&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;(A,A)&amp;lt;/tex&amp;gt; {{---}} цепная пара для любого нетерминала, так как &amp;lt;tex&amp;gt;A\Rightarrow ^* A&amp;lt;/tex&amp;gt; за ноль шагов.&lt;br /&gt;
&lt;br /&gt;
'''Индукция.''' Если пара &amp;lt;tex&amp;gt;(A,B)&amp;lt;/tex&amp;gt; {{---}} цепная, и есть правило &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;(A,C)&amp;lt;/tex&amp;gt; {{---}} цепная пара.&lt;br /&gt;
&lt;br /&gt;
Нетрудно понять, что такой алгоритм найдет все цепные правила грамматики &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, и только их.&lt;br /&gt;
&lt;br /&gt;
===Корректность алгоритма===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; {{---}} [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]]. &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; {{---}} грамматика, полученная в результате применения алгоритма к &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;L(\Gamma) = L(\Gamma').&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow &amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt;L(\Gamma) \subseteq L(\Gamma')&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;w\in L(\Gamma)&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; имеет левое порождение &amp;lt;tex&amp;gt;S\overset{*}{\underset{lm}{\Rightarrow}} w&amp;lt;/tex&amp;gt;. Где бы в левом порождении ни использовалось цепное правило, нетерминал в правой части становится крайним слева в выводимой цепочке и сразу же заменяется. Таким образом, левое порождение в &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; можно разбить на последовательность шагов, в которых ноль или несколько цепных правил сопровождаются нецепным. Заметим, что любое нецепное правило, перед которым нет цепных, образует такой шаг. Но по построению &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; каждый из этих шагов может быть выполнен одним её правилом. Таким образом, &amp;lt;tex&amp;gt;S\overset{*}{\underset{\Gamma'}{\Rightarrow}} w&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;w\in L(\Gamma')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow &amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt;L(\Gamma') \subseteq L(\Gamma)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;w\in L(\Gamma')&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;S\overset{*}{\underset{\Gamma'}{\Rightarrow}} w&amp;lt;/tex&amp;gt;. Так как каждое правило &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; эквивалентно последовательности из нуля или нескольких цепных правил &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, за которой следует нецепное правило из &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, то из &amp;lt;tex&amp;gt;\alpha{\underset{\Gamma'}{\Rightarrow}} \beta&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;\alpha\overset{*}{\underset{\Gamma}{\Rightarrow}} \beta&amp;lt;/tex&amp;gt;. Таким образом, каждый шаг порождения в &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; может быть заменен одним или несколькими шагами в &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. Собрав эти последовательности шагов, получим, что &amp;lt;tex&amp;gt;S\overset{*}{\underset{\Gamma}{\Rightarrow}} w&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;w\in L(\Gamma)&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;
    A\rightarrow B|a\\&lt;br /&gt;
    B\rightarrow C|b\\&lt;br /&gt;
    C\rightarrow DD|c&lt;br /&gt;
\end{array}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# В этой грамматике два цепных правила &amp;lt;tex&amp;gt;A\rightarrow B&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt;. Для каждого такого правила создадим цепную пару.&amp;lt;br&amp;gt;Теперь множество цепных пар будет состоять из &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Рассмотрим цепное правило &amp;lt;tex&amp;gt;A\rightarrow B&amp;lt;/tex&amp;gt;. Так как существует цепная пара &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt;, второй элемент которой совпадает с левым нетерминалом из правила,&amp;lt;br&amp;gt;добавим в множество пару &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt;, у которой первый элемент такой же как у найденной, а второй равен правому нетерминалу из текущего правила.&lt;br /&gt;
# Повторим второй пункт для правила &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt; и пары &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt;. Теперь множество цепных пар будет состоять из &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(B, C)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Повторим второй пункт для правила &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt; и пары &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt;, и получим множество &amp;lt;tex&amp;gt;\lbrace (A, A), (A, B), (A, C), (B, B), (B, C) \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Для каждой пары добавим в &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; новые правила:&lt;br /&gt;
#* &amp;lt;tex&amp;gt;A\rightarrow b&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;A\rightarrow c&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A\rightarrow DD&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(A, C)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;B\rightarrow c&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B\rightarrow DD&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(B, C)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* Пары &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt; новых правил не добавят.&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>91.215.121.216</name></author>	</entry>

	<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_%D1%86%D0%B5%D0%BF%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33358</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_%D1%86%D0%B5%D0%BF%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33358"/>
				<updated>2013-10-30T18:43:55Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Пример */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Цепное правило''' — правило вида &amp;lt;tex&amp;gt;A\rightarrow B&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; — нетерминалы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&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;, не содержащую цепных правил. &amp;lt;br&amp;gt;&lt;br /&gt;
Задача удаления цепных правил из грамматики возникает при попытке её приведения к [[нормальная форма Хомского|нормальной форме Хомского]].&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Цепная пара''' — упорядоченная пара &amp;lt;tex&amp;gt;(A,B)&amp;lt;/tex&amp;gt;, в которой &amp;lt;tex&amp;gt;A\Rightarrow ^* B&amp;lt;/tex&amp;gt;, используя только цепные правила.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм удаления цепных правил из грамматики:&lt;br /&gt;
#Найти все цепные пары в грамматике &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Для каждой цепной пары &amp;lt;tex&amp;gt;(A,B)&amp;lt;/tex&amp;gt; добавить в грамматику &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; все правила вида &amp;lt;tex&amp;gt;A\rightarrow\alpha&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;B\rightarrow\alpha&amp;lt;/tex&amp;gt; {{---}} нецепное правило из &amp;lt;tex&amp;gt;\Gamma&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;(A,A)&amp;lt;/tex&amp;gt; {{---}} цепная пара для любого нетерминала, так как &amp;lt;tex&amp;gt;A\Rightarrow ^* A&amp;lt;/tex&amp;gt; за ноль шагов.&lt;br /&gt;
&lt;br /&gt;
'''Индукция.''' Если пара &amp;lt;tex&amp;gt;(A,B)&amp;lt;/tex&amp;gt; {{---}} цепная, и есть правило &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;(A,C)&amp;lt;/tex&amp;gt; {{---}} цепная пара.&lt;br /&gt;
&lt;br /&gt;
Нетрудно понять, что такой алгоритм найдет все цепные правила грамматики &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, и только их.&lt;br /&gt;
&lt;br /&gt;
===Корректность алгоритма===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; {{---}} [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]]. &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; {{---}} грамматика, полученная в результате применения алгоритма к &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;L(\Gamma) = L(\Gamma').&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow &amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt;L(\Gamma) \subseteq L(\Gamma')&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;w\in L(\Gamma)&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; имеет левое порождение &amp;lt;tex&amp;gt;S\overset{*}{\underset{lm}{\Rightarrow}} w&amp;lt;/tex&amp;gt;. Где бы в левом порождении ни использовалось цепное правило, нетерминал в правой части становится крайним слева в выводимой цепочке и сразу же заменяется. Таким образом, левое порождение в &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; можно разбить на последовательность шагов, в которых ноль или несколько цепных правил сопровождаются нецепным. Заметим, что любое нецепное правило, перед которым нет цепных, образует такой шаг. Но по построению &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; каждый из этих шагов может быть выполнен одним её правилом. Таким образом, &amp;lt;tex&amp;gt;S\overset{*}{\underset{\Gamma'}{\Rightarrow}} w&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;w\in L(\Gamma')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow &amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt;L(\Gamma') \subseteq L(\Gamma)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;w\in L(\Gamma')&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;S\overset{*}{\underset{\Gamma'}{\Rightarrow}} w&amp;lt;/tex&amp;gt;. Так как каждое правило &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; эквивалентно последовательности из нуля или нескольких цепных правил &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, за которой следует нецепное правило из &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, то из &amp;lt;tex&amp;gt;\alpha{\underset{\Gamma'}{\Rightarrow}} \beta&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;\alpha\overset{*}{\underset{\Gamma}{\Rightarrow}} \beta&amp;lt;/tex&amp;gt;. Таким образом, каждый шаг порождения в &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; может быть заменен одним или несколькими шагами в &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. Собрав эти последовательности шагов, получим, что &amp;lt;tex&amp;gt;S\overset{*}{\underset{\Gamma}{\Rightarrow}} w&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;w\in L(\Gamma)&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;
    A\rightarrow B|a\\&lt;br /&gt;
    B\rightarrow C|b\\&lt;br /&gt;
    C\rightarrow DD|c&lt;br /&gt;
\end{array}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# В этой грамматике два цепных правила &amp;lt;tex&amp;gt;A\rightarrow B&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt;. Для каждого такого правила создадим цепную пару.&amp;lt;br&amp;gt;Теперь множество цепных пар будет состоять из &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Рассмотрим цепное правило &amp;lt;tex&amp;gt;A\rightarrow B&amp;lt;/tex&amp;gt;. Так как существует цепная пара &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt;, второй элемент которой совпадает с левым нетерминалом из правила,&amp;lt;br&amp;gt;добавим в множество пару &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt;, у которой первый элемент такой же как у найденной, а второй равен правому нетерминалу из текущего правила.&lt;br /&gt;
# Повторим второй пункт для правила &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt; и пары &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt;. Теперь множество цепных пар будет состоять из &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(B, C)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Повторим второй пункт для правила &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt; и пары &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt;, и получем множество &amp;lt;tex&amp;gt;\lbrace (A, A), (A, B), (A, C), (B, B), (B, C) \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Для каждой пары добавим в &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; новые правила:&lt;br /&gt;
#* &amp;lt;tex&amp;gt;A\rightarrow b&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;A\rightarrow c&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A\rightarrow DD&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(A, C)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;B\rightarrow c&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B\rightarrow DD&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(B, C)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* Пары &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt; новых правил не добавят.&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>91.215.121.216</name></author>	</entry>

	<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_%D1%86%D0%B5%D0%BF%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33357</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_%D1%86%D0%B5%D0%BF%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB_%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=33357"/>
				<updated>2013-10-30T18:24:55Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Цепное правило''' — правило вида &amp;lt;tex&amp;gt;A\rightarrow B&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; — нетерминалы.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Постановка задачи ==&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;, не содержащую цепных правил. &amp;lt;br&amp;gt;&lt;br /&gt;
Задача удаления цепных правил из грамматики возникает при попытке её приведения к [[нормальная форма Хомского|нормальной форме Хомского]].&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Цепная пара''' — упорядоченная пара &amp;lt;tex&amp;gt;(A,B)&amp;lt;/tex&amp;gt;, в которой &amp;lt;tex&amp;gt;A\Rightarrow ^* B&amp;lt;/tex&amp;gt;, используя только цепные правила.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Алгоритм удаления цепных правил из грамматики:&lt;br /&gt;
#Найти все цепные пары в грамматике &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Для каждой цепной пары &amp;lt;tex&amp;gt;(A,B)&amp;lt;/tex&amp;gt; добавить в грамматику &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; все правила вида &amp;lt;tex&amp;gt;A\rightarrow\alpha&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;B\rightarrow\alpha&amp;lt;/tex&amp;gt; {{---}} нецепное правило из &amp;lt;tex&amp;gt;\Gamma&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;(A,A)&amp;lt;/tex&amp;gt; {{---}} цепная пара для любого нетерминала, так как &amp;lt;tex&amp;gt;A\Rightarrow ^* A&amp;lt;/tex&amp;gt; за ноль шагов.&lt;br /&gt;
&lt;br /&gt;
'''Индукция.''' Если пара &amp;lt;tex&amp;gt;(A,B)&amp;lt;/tex&amp;gt; {{---}} цепная, и есть правило &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;(A,C)&amp;lt;/tex&amp;gt; {{---}} цепная пара.&lt;br /&gt;
&lt;br /&gt;
Нетрудно понять, что такой алгоритм найдет все цепные правила грамматики &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, и только их.&lt;br /&gt;
&lt;br /&gt;
===Корректность алгоритма===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; {{---}} [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]]. &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; {{---}} грамматика, полученная в результате применения алгоритма к &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;L(\Gamma) = L(\Gamma').&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow &amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt;L(\Gamma) \subseteq L(\Gamma')&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;w\in L(\Gamma)&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; имеет левое порождение &amp;lt;tex&amp;gt;S\overset{*}{\underset{lm}{\Rightarrow}} w&amp;lt;/tex&amp;gt;. Где бы в левом порождении ни использовалось цепное правило, нетерминал в правой части становится крайним слева в выводимой цепочке и сразу же заменяется. Таким образом, левое порождение в &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt; можно разбить на последовательность шагов, в которых ноль или несколько цепных правил сопровождаются нецепным. Заметим, что любое нецепное правило, перед которым нет цепных, образует такой шаг. Но по построению &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; каждый из этих шагов может быть выполнен одним её правилом. Таким образом, &amp;lt;tex&amp;gt;S\overset{*}{\underset{\Gamma'}{\Rightarrow}} w&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;w\in L(\Gamma')&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow &amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt;L(\Gamma') \subseteq L(\Gamma)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;w\in L(\Gamma')&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;S\overset{*}{\underset{\Gamma'}{\Rightarrow}} w&amp;lt;/tex&amp;gt;. Так как каждое правило &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; эквивалентно последовательности из нуля или нескольких цепных правил &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, за которой следует нецепное правило из &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;, то из &amp;lt;tex&amp;gt;\alpha{\underset{\Gamma'}{\Rightarrow}} \beta&amp;lt;/tex&amp;gt; следует &amp;lt;tex&amp;gt;\alpha\overset{*}{\underset{\Gamma}{\Rightarrow}} \beta&amp;lt;/tex&amp;gt;. Таким образом, каждый шаг порождения в &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; может быть заменен одним или несколькими шагами в &amp;lt;tex&amp;gt;\Gamma&amp;lt;/tex&amp;gt;. Собрав эти последовательности шагов, получим, что &amp;lt;tex&amp;gt;S\overset{*}{\underset{\Gamma}{\Rightarrow}} w&amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;w\in L(\Gamma)&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;
    A\rightarrow B|a\\&lt;br /&gt;
    B\rightarrow C|b\\&lt;br /&gt;
    C\rightarrow DD|c&lt;br /&gt;
\end{array}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# В этой грамматике два цепных правила &amp;lt;tex&amp;gt;A\rightarrow B&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt;. Для каждого такого правила создадим цепную пару.&amp;lt;br&amp;gt;Теперь множество цепных пар будет состоять из &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Рассмотрим цепное правило &amp;lt;tex&amp;gt;A\rightarrow B&amp;lt;/tex&amp;gt;. Так как существует цепная пара &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt;, второй элемент которой совпадает с левым нетерминалом из правила,&amp;lt;br&amp;gt;добавим в множество пару &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt;, у которой первый элемент такой же как у найденной, а второй равен правому нетерминалу из текущего правила.&lt;br /&gt;
# Повторим второй пункт для правила &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt; и пары &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt;. Теперь множество цепных пар будет состоять из &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(B, C)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Повторим второй пункт для правила &amp;lt;tex&amp;gt;B\rightarrow C&amp;lt;/tex&amp;gt; и пары &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt;, и получем множество &amp;lt;tex&amp;gt;\lbrace (A, A), (A, B), (A, C), (B, B), (B, C) \rbrace&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Для каждой пары добавим в &amp;lt;tex&amp;gt;\Gamma'&amp;lt;/tex&amp;gt; новые правила:&lt;br /&gt;
#* &amp;lt;tex&amp;gt;A\rightarrow a&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(A, A)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;A\rightarrow b&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(A, B)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;A\rightarrow c&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A\rightarrow DD&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(A, C)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;B\rightarrow b&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(B, B)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;B\rightarrow c&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;B\rightarrow DD&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(B, C)&amp;lt;/tex&amp;gt;&lt;br /&gt;
#* &amp;lt;tex&amp;gt;C\rightarrow c&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;C\rightarrow DD&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;(C, C)&amp;lt;/tex&amp;gt;&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>91.215.121.216</name></author>	</entry>

	<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=33356</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=33356"/>
				<updated>2013-10-30T16:45:43Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Порождающие и непорождающие нетерминалы */&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; называется '''порождающим''', если из него может быть выведена конечная терминальная цепочка. Иначе он называется '''непорождающим'''.&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;
Рассмотрим грамматику:&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
\begin{array}{l l}   &lt;br /&gt;
    S\rightarrow Ac|Bc\\&lt;br /&gt;
    A\rightarrow SD\\&lt;br /&gt;
    A\rightarrow a\\&lt;br /&gt;
    B\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;br&amp;gt;Нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; нам не подходит, так как из него можно вывести нетерминалы &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;D&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 Bc&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;.&lt;br /&gt;
# После следуещего обхода правил из грамматики множество не изменится.&lt;br /&gt;
# Теперь удалим правило &amp;lt;tex&amp;gt;S\rightarrow Ac&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; называется '''достижимым''' в КС-грамматике &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;. Иначе он называется '''недостижимым'''.&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;
{{Лемма&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;
Рассмотрим грамматику:&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; называется '''полезным''' в КС-грамматике &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;. Иначе он называется '''бесполезным'''.&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;
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<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=33355</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=33355"/>
				<updated>2013-10-30T16:13:16Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Пример */&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; называется '''порождающим''', если из него может быть выведена конечная терминальная цепочка. Иначе он называется '''непорождающим'''.&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;
== Достижимые и недостижимые нетерминалы ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется '''достижимым''' в КС-грамматике &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;. Иначе он называется '''недостижимым'''.&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;
{{Лемма&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;
Рассмотрим грамматику:&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; называется '''полезным''' в КС-грамматике &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;. Иначе он называется '''бесполезным'''.&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;
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<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=33354</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=33354"/>
				<updated>2013-10-30T07:49:49Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Достижимые и недостижимые нетерминалы */&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; называется '''порождающим''', если из него может быть выведена конечная терминальная цепочка. Иначе он называется '''непорождающим'''.&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;
== Достижимые и недостижимые нетерминалы ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется '''достижимым''' в КС-грамматике &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;. Иначе он называется '''недостижимым'''.&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;
{{Лемма&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;
Рассмотрим грамматику:&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;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;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;\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; называется '''полезным''' в КС-грамматике &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;. Иначе он называется '''бесполезным'''.&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;
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	<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=33353</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=33353"/>
				<updated>2013-10-30T07:16:18Z</updated>
		
		<summary type="html">&lt;p&gt;91.215.121.216: /* Алгоритм удаления бесполезных нетерминалов */&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; называется '''порождающим''', если из него может быть выведена конечная терминальная цепочка. Иначе он называется '''непорождающим'''.&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;
== Достижимые и недостижимые нетерминалы ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется '''достижимым''' в КС-грамматике &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;. Иначе он называется '''недостижимым'''.&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;
{{Лемма&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;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Нетерминал &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется '''полезным''' в КС-грамматике &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;. Иначе он называется '''бесполезным'''.&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;
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)&lt;br /&gt;
&lt;br /&gt;
[[Категория: Теория формальных языков]]&lt;br /&gt;
[[Категория: Контекстно-свободные грамматики]]&lt;/div&gt;</summary>
		<author><name>91.215.121.216</name></author>	</entry>

	</feed>