Изменения

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

Нормальная форма Хомского

3355 байт добавлено, 21:38, 21 декабря 2015
м
Источники информации
==Несколько определений==
 
{{Определение
|definition=Грамматикой в '''нормальной форме Хомского''' (англ. ''Chomsky normal form'') называется [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]], в которой могут содержатся содержаться правила только следующего вида::<tex>A \rightarrow B C </tex>.,
:<tex>A \rightarrow a </tex>.,
:<tex>S \rightarrow \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> {{---}} обнуляемый.=Приведение грамматики к нормальной форме Хомского==
Если {{Теорема|statement=Любую контекстно-свободную грамматику можно привести к нормальной форме Хомского.|proof=Рассмотрим контекстно-свободную грамматику <tex> A \rightarrow B_1....B_n Gamma </tex>, где все . Для приведения ее к нормальной форме Хомского необходимо выполнить пять шагов. На каждом шаге мы строим новую <tex> B_i \Gamma_i </tex> обнуляемые, то которая допускает тот же язык, что и <tex> A \Gamma </tex> тоже обнуляемый.}}
{{Определение# Уберём длинные правила.#: Воспользуемся [[Удаление длинных правил из грамматики|алгоритмом удаления длинных правил]] из грамматики. Получим грамматику <tex> \Gamma_1 </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>.# Удалим бесполезные символы.#:Воспользуемся [[Удаление бесполезных символов из грамматики|definition=Пара нетерминалов алгоритмом удаления бесполезных символов]] из грамматики. Так как <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> B U_i \rightarrow u_i </tex> называется узловой. Теперь правила содержат либо одиночный терминал, либо строку из двух нетерминалов. Таким образом, если мы получили грамматику в нормальной форме Хомского, которая допускает тот же язык, что и <tex> A \Rightarrow^* B Gamma </tex>.
Стоит заметить, что порядок выполнения операций важен. Первое правило должно быть выполнено перед вторым, иначе время нормализации ухудшится до <tex> O(2^{\forall A left| \Gamma \right|})</tex> выполняется . Третье правило идет после второго, потому что после удаления <tex> (A, A) \varepsilon</tex> {{---}} узловая параправил, могут образоваться новые цепные правила. Также четвертое правило должно быть выполнено позже третьего и второго, так как они могут порождать бесполезные символы.
Если <tex> (A, B) </tex> {{---}} узловая пара, а <tex> B \rightarrow C </tex>, то <tex> (A, C) </tex> тоже узловая параПри таком порядке действий размеры грамматики возрастают полиномиально.}}
{{Определение|definition=Правило После удалении длинных правил из каждого правила длины <tex> A k \rightarrow w geqslant 3 </tex> называется смешанным, если могло появиться <tex> w k-1 </tex> содержит хотя бы один терминал и хотя бы один нетерминалновых правил, причем их длина не превышает двух. На этом шаге размер грамматики возрастает не более, чем вдвое. }}
==Преобразование При удалении <tex> \varepsilon </tex>-правил из грамматики , содержащей правила длины <tex>0, 1</tex> и <tex>2</tex>, размеры грамматики могли вырасти не больше, чем в нормальную форму Хомского==<tex>3</tex> раза.
Рассмотрим [[Контекстно-свободные грамматикиВсего цепных правил в грамматике не больше, выводчем <tex> n^2 </tex>, лево- и правосторонний вывод, дерево разбора|контекстно-свободную грамматику]] где <tex> \Gamma n </tex>{{---}} число нетерминалов. Для преобразования ее При удалении цепных правил мы берем каждую из цепных пар и производим добавление нецепных правил, выводимых из второго нетерминала в нормальную форму Хомского необходимо выполнить 5 шаговпаре. На каждом шаге мы строим новую Если максимальная суммарная длина всех правил, выводимых из какого-либо нетерминала, равна <tex> \Gamma_i k </tex>, которая допускает тот же языкто размер грамматики возрастет не больше, что и чем на <tex> k \Gamma cdot n^2 </tex>.
# Создание новой стартовой вершины.#: Создадим новую стартовую вершину <tex> S_0 </tex> с новым правилом <tex> S_0 \rightarrow S </tex>, где <tex> S </tex> {{---}} старая стартовая вершина. Добавим в <tex> \Gamma_1 </tex> эту вершинуНаконец, правило и <tex> \Gamma </tex>.# Удаление <tex> \varepsilon </tex>-правил.##Если <tex> A \rightarrow \varepsilon </tex>, то выкинем такое правило.##Если <tex> A \rightarrow w </tex>, где <tex> w </tex> на последнем шаге может произойти добавление не содержит <tex> \varepsilon </tex> и обнуляемых нетерминаловболее, то добавим такое правило в чем <tex> |\Gamma_2 Sigma|</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 Sigma</tex> {{---}} вхождение обнуляемого нетерминала, <tex> w_i </tex> не содержит обнуляемых нетерминалов. Добавим в <tex> \Gamma_2 </tex> все правила, которые можно получить удалением всевозможных комбинаций <tex> N_i </tex> из <tex> w </tex>. Таких вариантов будет <tex> 2^n </tex>. #:Если стартовая вершина <tex> \Gamma_1 </tex> является обнуляемой, то добавим в <tex> \Gamma_2 </tex> правило <tex> S_0 \rightarrow \varepsilon </tex>.# Преобразование узловых пар.#:Для каждой узловой пары <tex> (A, Bалфавит грамматики) </tex>новых правил, найдем причем все правила <tex> B \rightarrow w </tex>, где <tex> w </tex> {{---}} произвольная строка терминалов и нетерминалов, и добавим <tex> A \rightarrow w </tex> в <tex> \Gamma_3 </tex>.# Преобразование смешанных правил.#:Если <tex> A \rightarrow w </tex> {{---}} смешанное правило, то можно представить они будут длины <tex> w </tex> в виде <tex> w=v_0 c_1 v_1 c_2 ... v_{n-1} c_n v_n </tex>, где <tex> v_i </tex> {{---}} строка нетерминалов, а <tex> c_i </tex> является терминалом. Тогда для каждого <tex> c_i </tex> добавим нетерминал <tex> C_i </tex> и правило <tex> C_i \rightarrow c_i </tex> в <tex> \Gamma_4 </tex>. Получим <tex> w'=v_0 C_1 v_1 C_2 ... v{n-1} C_n v_n </tex>. Добавим правило <tex> A \rightarrow w' </tex> в <tex> \Gamma_4 </tex>. # Преобразование длинных правил.#:Для каждого правила вида <tex> A \rightarrow B_0 B_1 ... B_n </tex>, где <tex> n \ge 2 </tex>, добавим новые нетерминалы <tex> A_1, A_2, ... , A_{n-2} </tex> и правила <tex> A \rightarrow B_1 A_1 </tex>, <tex> A_1 \rightarrow B_2 A_2 </tex>, <tex> A_2 \rightarrow B_3 A_3 </tex>, <tex> ... </tex> , <tex> A_{n-2} \rightarrow B_{n-1} B_n </tex> в <tex> \Gamma_5 </tex>.
После пятого шага == Пример =={| border="1" class="wikitable" style="width: 500px; height: 500px; float: left;"!style="background:#41aef0"|Текущий шаг!style="background:#41aef0"|Грамматика после применения правила|-|''0. Исходная грамматика ''|<tex>S\rightarrow aXbX|aZ</tex> <br> <tex> X\rightarrow aY|bY|\Gamma_5 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> A X\rightarrow B C aY|bY|\varepsilon</tex> и <br> <tex> A Y\rightarrow a X|cc</tex>, где <br> <tex> A, B, C 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> a 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_0 S_{3}\rightarrow a</tex> <br> <tex>S_{4}\rightarrow y</tex> <br> <tex>X_{1}\varepsilon rightarrow b</tex>. Новая грамматика допускает тот же язык, что и <br> <tex> Y_{1}\Gamma rightarrow c</tex>.|}<div style="clear:both;"></div>
== См. также ==
* [[Контекстно-свободные_грамматики,_вывод,_лево-_и_правосторонний_вывод,_дерево_разбора|Контекстно-свободные грамматики]]
* [[Нормальная_форма_Куроды | Нормальная форма Куроды]]
* [[Приведение_грамматики_к_ослабленной_нормальной_форме_Грейбах | Приведение грамматики к ослабленной нормальной форме Грейбах]]
==Источники информации==
* [[wikipedia:en:Chomsky normal form | Wikipedia {{---}} Chomsky normal form]]
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528с. : ISBN 5-8459-0261-4 (рус.)
Заметим, что любую контекстно-свободную грамматику можно привести к нормальной форме Хомского. Такая форма очень удобна для работы многих алгоритмов над грамматиками, например, [[Алгоритм Кока-Янгера-Касами разбора грамматики в НФХ|алгоритм Кока-Янгера-Касами]].
==Литература==[[Категория: Теория формальных языков]][[Категория: Контекстно-свободные грамматики]]* http[[Категория://www.enseignement.polytechnique.fr/informatique/profs/Luc.Maranget/IF/09/chomsky.pdfНормальные формы КС-грамматик]]
275
правок

Навигация