Редактирование: Нормальная форма Хомского

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
 +
==Несколько определений==
 +
 
{{Определение
 
{{Определение
|definition=Грамматикой в '''нормальной форме Хомского''' (англ. ''Chomsky normal form'') называется [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]], в которой могут содержаться правила только следующего вида:
+
|definition=Грамматикой в '''нормальной форме Хомского''' (''Chomsky normal form'') называется грамматика, в которой могут содержатся правила только следующего вида
:<tex>A \rightarrow B C </tex>,
+
<tex>A \rightarrow B C </tex>.
  
:<tex>A \rightarrow a </tex>,
+
<tex>A \rightarrow a </tex>.
  
:<tex>S \rightarrow \varepsilon </tex>,
+
<tex>S \rightarrow \varepsilon </tex>.
  
где <tex> a </tex> {{---}} терминал, <tex> A, B, C </tex> {{---}} нетерминалы, <tex> S </tex> {{---}} стартовая вершина, <tex> \varepsilon </tex> {{---}} пустая строка, стартовая вершина не содержится в правых частях правил.
+
(где <tex> a </tex> {{---}} терминал, <tex> A, B, C </tex> {{---}} нетерминалы, <tex> S </tex> {{---}} стартовая вершина, <tex> \varepsilon </tex> {{---}} пустая строка, стартовая вершина не содержится в правых частях правил).
 
}}
 
}}
  
==Приведение грамматики к нормальной форме Хомского==
+
{{Определение
 +
|definition=Вершина называется обнуляемой, если из нее можно прямо или косвенно получить пустую строку.
 +
Если <tex> A \rightarrow \varepsilon </tex>, то <tex> A </tex> {{---}} обнуляемая.
  
{{Теорема
+
Если <tex> A \rightarrow B_1....B_n </tex>, где все <tex> B_i </tex> обнуляемые, то <tex> A </tex> тоже обнуляемая.
|statement=Любую контекстно-свободную грамматику можно привести к нормальной форме Хомского.
+
}}
|proof=
 
Рассмотрим контекстно-свободную грамматику <tex> \Gamma </tex>. Для приведения ее к нормальной форме Хомского необходимо выполнить пять шагов. На каждом шаге мы строим новую <tex> \Gamma_i </tex>, которая допускает тот же язык, что и <tex> \Gamma </tex>.
 
  
# Уберём длинные правила.
+
{{Определение
#: Воспользуемся [[Удаление длинных правил из грамматики|алгоритмом удаления длинных правил]] из грамматики. Получим грамматику <tex> \Gamma_1
+
|definition=Пара вершин <tex> A </tex> и <tex> B </tex> называется узловой, если <tex> A \Rightarrow^* B </tex>.  
</tex>, эквивалентную исходной, содержащую правила длины <tex>0, 1</tex> и <tex>2</tex>.
 
# Удаление <tex> \varepsilon </tex>-правил.
 
#:Воспользуемся [[Удаление eps-правил из грамматики|алгоритмом удаления <tex> \varepsilon </tex>-правил ]] из грамматики. Получим грамматику <tex> \Gamma_2 </tex>, эквивалентную исходной, но в которой нет <tex>\varepsilon </tex>-правил.
 
# Удаление цепных правил.
 
#:Воспользуемся [[Удаление_цепных_правил_из_грамматики| алгоритмом удаления цепных правил]] из грамматики. Алгоритм работает таким образом, что новые <tex> \varepsilon </tex>-правила не образуются. Получим грамматику <tex> \Gamma_3 </tex>, эквивалентную <tex> \Gamma </tex>.
 
# Удалим бесполезные символы.
 
#:Воспользуемся [[Удаление бесполезных символов из грамматики| алгоритмом удаления бесполезных символов]] из грамматики. Так как <tex> \Gamma_3 </tex> эквивалентна <tex> \Gamma </tex>, то бесполезные символы не могли перестать быть бесполезными. Более того, мы только удаляем правила, новые <tex>\varepsilon</tex>-правила и цепные правила не могли появиться.
 
# Уберём ситуации, когда в правиле встречаются несколько терминалов.
 
#:Для всех правил вида <tex> A \rightarrow u_1 u_2</tex> (где <tex> u_i </tex> {{---}} терминал или нетерминал) заменим все терминалы <tex> u_i </tex> на новые нетерминалы <tex> U_i </tex> и добавим правила <tex> U_i \rightarrow u_i </tex>. Теперь правила содержат либо одиночный терминал, либо строку из двух нетерминалов.
 
Таким образом, мы получили грамматику в нормальной форме Хомского, которая допускает тот же язык, что и <tex> \Gamma </tex>.
 
  
Стоит заметить, что порядок выполнения операций важен. Первое правило должно быть выполнено перед вторым, иначе время нормализации ухудшится до <tex>O(2^{\left| \Gamma \right|})</tex>. Третье правило идет после второго, потому что после удаления <tex>\varepsilon</tex>-правил, могут образоваться новые цепные правила. Также четвертое правило должно быть выполнено позже третьего и второго, так как они могут порождать бесполезные символы.
+
<tex> \forall A </tex> выполняется <tex> (A, A) </tex> {{---}} узловая пара.
  
При таком порядке действий размеры грамматики возрастают полиномиально.
+
Если <tex> (A, B) </tex> {{---}} узловая пара, а <tex> B \rightarrow C </tex>, то <tex> (A, C) </tex> тоже узловая пара.
 +
}}
  
После удалении длинных правил из каждого правила длины  <tex> k \geqslant 3 </tex> могло появиться <tex> k-1 </tex> новых правил, причем их длина не превышает двух. На этом шаге размер грамматики возрастает не более, чем вдвое.
+
==Преобразование грамматики в нормальную форму Хомского==
  
При удалении <tex> \varepsilon </tex>-правил из грамматики, содержащей правила длины <tex>0, 1</tex> и <tex>2</tex>, размеры грамматики могли вырасти не больше, чем в <tex>3</tex> раза.
+
Рассмотрим [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободную грамматику]] <tex> \Gamma </tex>. Для преобразования ее в нормальную форму Хомского необходимо выполнить 5 шагов. Каждый шаг работает c преобразованной грамматикой.
  
Всего цепных правил в грамматике не больше, чем <tex> n^2 </tex>, где <tex> n </tex> {{---}} число нетерминалов. При удалении цепных правил мы берем каждую из цепных пар и производим добавление нецепных правил, выводимых из второго нетерминала в паре. Если максимальная суммарная длина всех правил, выводимых из какого-либо нетерминала, равна <tex> k </tex>, то размер грамматики возрастет не больше, чем на <tex> k \cdot n^2 </tex>.
+
# Создание новой стартовой вершины.
 
+
#: Создадим новую стартовую вершину <tex> S_0 </tex> с новым правилом <tex> S_0 \rightarrow S </tex>, где <tex> S </tex> {{---}} старая стартовая вершина. Получим <tex> \Gamma_1 </tex>.
Наконец, на последнем шаге может произойти добавление не более, чем <tex>|\Sigma|</tex> (<tex>\Sigma</tex> {{---}} алфавит грамматики) новых правил, причем все они будут длины <tex>1</tex>.
+
# Удаление <tex> \varepsilon </tex>-правил.
}}
+
##Если <tex> A \rightarrow \varepsilon </tex>, то выкинем такое правило.
 
+
##Если <tex> A \rightarrow w </tex>, где <tex> w </tex> не содержит <tex> \varepsilon </tex> и обнуляемых переменных, то добавим такое правило в <tex> \Gamma_2 </tex>.
== Пример ==
+
##Если <tex> A \rightarrow w </tex>, причем <tex> w </tex> содержит обнуляемые переменные, то представим <tex> w </tex> в виде <tex> w=w_0 N_0 w_1 N_1 ... w_{n-1} N_{n-1} w_n N_n </tex>, где <tex> N_i </tex> {{---}} вхождение обнуляемой переменной, <tex> w_i </tex> не содержит обнуляемых переменных. Добавим в <tex> \Gamma_2 </tex> все правила, которые можно получить удалением всевозможных комбинаций <tex> N_i </tex> из <tex> w </tex>. Таких вариантов будет <tex> 2^n </tex>.
{| border="1" class="wikitable" style="width: 500px; height: 500px; float: left;"
+
#:Если стартовая вершина <tex> \Gamma_1 </tex> является обнуляемой, то добавим в <tex> \Gamma_2 </tex> правило <tex> S_0 \rightarrow \varepsilon </tex>.
!style="background:#41aef0"|Текущий шаг
+
# Преобразование узловых пар.
!style="background:#41aef0"|Грамматика после применения правила
+
##
|-
+
# Преобразование правил с длинной правой частью.
|''0. Исходная грамматика''
 
|<tex>S\rightarrow aXbX|aZ</tex> <br> <tex>X\rightarrow aY|bY|\varepsilon</tex> <br> <tex>Y\rightarrow X|cc</tex><br> <tex>Z\rightarrow ZX</tex>
 
|-
 
|''1. Удаление длинных правил''
 
|<tex>S\rightarrow aS_{1}|aZ</tex> <br> <tex>X\rightarrow aY|bY|\varepsilon</tex> <br> <tex>Y\rightarrow X|cc</tex> <br> <tex>Z\rightarrow ZX</tex> <br> <tex>S_{1}\rightarrow XS_{2}</tex> <br> <tex>S_{2}\rightarrow yX</tex>
 
|-
 
|''2. Удаление <tex>\varepsilon</tex>-правил''
 
|<tex>S\rightarrow aS_{1}|aZ</tex><br> <tex>X\rightarrow aY|bY</tex> <br> <tex>Y\rightarrow aY|bY|cc</tex> <br> <tex>Z\rightarrow ZX</tex> <br> <tex>S_{1}\rightarrow XS_{2}|S_{2}</tex> <br> <tex>S_{2}\rightarrow yX|y</tex>
 
|-
 
|''3. Удаление цепных правил''
 
|<tex>S\rightarrow aS_{1}|aZ</tex><br> <tex>X\rightarrow aY|bY</tex> <br> <tex>Y\rightarrow aY|bY|cc</tex> <br> <tex>Z\rightarrow ZX</tex> <br> <tex>S_{1}\rightarrow XS_{2}|yX|y</tex> <br> <tex>S_{2}\rightarrow yX|y</tex>
 
|-
 
|''4. Удаление бесполезных символов''
 
|<tex>S\rightarrow aS_{1}</tex> <br> <tex>X\rightarrow aY|bY</tex> <br> <tex>Y\rightarrow aY|bY|cc</tex> <br> <tex>S_{1}\rightarrow XS_{2}|yX|y</tex> <br> <tex>S_{2}\rightarrow yX|y</tex>
 
|-
 
|''5. Уберём ситуации, когда в правиле встречаются несколько терминалов.''
 
|<tex>S\rightarrow S_{3}S_{1}</tex><br> <tex>X\rightarrow S_{3}Y|X_{1}Y</tex> <br> <tex>Y\rightarrow S_{3}Y|X_{1}Y|Y_{1}Y_{1}</tex> <br> <tex>S_{1}\rightarrow XS_{2}|S_{4}X|y</tex> <br> <tex>S_{2}\rightarrow S_{4}X|y</tex> <br> <tex>S_{3}\rightarrow a</tex> <br> <tex>S_{4}\rightarrow y</tex> <br> <tex>X_{1}\rightarrow b</tex>  <br> <tex>Y_{1}\rightarrow c</tex>
 
|}
 
<div style="clear:both;"></div>
 
  
== См. также  ==
 
* [[Контекстно-свободные_грамматики,_вывод,_лево-_и_правосторонний_вывод,_дерево_разбора|Контекстно-свободные грамматики]]
 
* [[Нормальная_форма_Куроды | Нормальная форма Куроды]]
 
* [[Приведение_грамматики_к_ослабленной_нормальной_форме_Грейбах | Приведение грамматики к ослабленной нормальной форме Грейбах]]
 
  
==Источники информации==
+
Рассмотрим [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободную грамматику]] <tex>\Gamma</tex>, из которой удалены [[Удаление бесполезных символов из грамматики|бесполезные символы]], [[Удаление eps-правил из грамматики|<tex>\varepsilon</tex>-правила]], [[Удаление длинных правил из грамматики|длинные правила]] и [[Удаление цепных правил из грамматики|цепные правила]]. Такая грамматика содержит только правила следующего вида:
* [[wikipedia:en:Chomsky normal form | Wikipedia {{---}} Chomsky normal form]]
+
*<tex>A \rightarrow BC</tex>
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528с. : ISBN 5-8459-0261-4 (рус.)
+
*<tex>A \rightarrow Bc</tex>
 +
*<tex>A \rightarrow bC</tex>
 +
*<tex>A \rightarrow bc</tex>
 +
*<tex>A \rightarrow a</tex>
 +
*возможно, <tex>S \rightarrow \varepsilon</tex> (при условии, что <tex>S</tex> не содержится в правых частях правил)
 +
Избавимся от правил, в правых частях которых записаны два символа, один из которых является терминалом, то есть правил вида <tex>A \rightarrow Bc</tex>, <tex>A \rightarrow bC</tex> и <tex>A \rightarrow bc</tex>. Введем для каждого терминала <tex>a</tex> "персональный" нетерминал <tex>N_a</tex>. Затем правила вида <tex>A \rightarrow Bc</tex> заменим парой правил <tex>A \rightarrow BN_c</tex> и <tex>N_c \rightarrow c</tex>, правила вида <tex>A \rightarrow bC</tex> заменим парой правил <tex>A \rightarrow N_bC</tex> и <tex>N_b \rightarrow b</tex>, а правила вида <tex>A \rightarrow bc</tex> {{---}} тройкой правил <tex>A \rightarrow N_bN_c</tex>, <tex>N_b \rightarrow b</tex> и <tex>N_c \rightarrow c</tex>.
  
 +
Теперь у нас остались только правила вида <tex>A \rightarrow BC</tex>, <tex>A \rightarrow a</tex> и, возможно, <tex>S \rightarrow \varepsilon</tex> (при условии, что <tex>S</tex> не содержится в правых частях правил). Грамматика, содержащая правила только такого вида, называется грамматикой в '''нормальной форме Хомского'''.
  
[[Категория: Теория формальных языков]]
+
Заметим, что любую контекстно-свободную грамматику можно привести к нормальной форме Хомского. Такая форма грамматики очень удобна для работы многих алгоритмов над грамматиками, например, [[Алгоритм Кока-Янгера-Касами разбора грамматики в НФХ|алгоритм Кока-Янгера-Касами]]
[[Категория: Контекстно-свободные грамматики]]
 
[[Категория: Нормальные формы КС-грамматик]]
 

Пожалуйста, учтите, что любой ваш вклад в проект «Викиконспекты» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Викиконспекты:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Чтобы изменить эту страницу, пожалуйста, ответьте на приведённый ниже вопрос (подробнее):

Отменить | Справка по редактированию (в новом окне)

Шаблоны, используемые на этой странице: