Нормальная форма Хомского — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (Пример)
м (rollbackEdits.php mass rollback)
 
(не показано 12 промежуточных версий 2 участников)
Строка 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> {{---}} пустая строка, стартовая вершина не содержится в правых частях правил.
Строка 30: Строка 30:
 
Таким образом, мы получили грамматику в нормальной форме Хомского, которая допускает тот же язык, что и <tex> \Gamma </tex>.
 
Таким образом, мы получили грамматику в нормальной форме Хомского, которая допускает тот же язык, что и <tex> \Gamma </tex>.
  
Стоит заметить, что порядок выполнения операций важен. Первое правило должно быть выполнено перед вторым, иначе время нормализации ухудшится до <tex>O(2^{\left| \Gamma \right|})</tex>. Третье правило идет после второго, потому что после удаления <tex>\varepsilon</tex>-правил, могут образоваться новые цепные правила. Также четвертое правило должно быть выполнено позже третьего, так как оно может порождать бесполезные символы.
+
Стоит заметить, что порядок выполнения операций важен. Первое правило должно быть выполнено перед вторым, иначе время нормализации ухудшится до <tex>O(2^{\left| \Gamma \right|})</tex>. Третье правило идет после второго, потому что после удаления <tex>\varepsilon</tex>-правил, могут образоваться новые цепные правила. Также четвертое правило должно быть выполнено позже третьего и второго, так как они могут порождать бесполезные символы.
  
 
При таком порядке действий размеры грамматики возрастают полиномиально.
 
При таком порядке действий размеры грамматики возрастают полиномиально.
Строка 44: Строка 44:
  
 
== Пример ==
 
== Пример ==
Рассмотрим пример для следующей грамматики:
+
{| border="1" class="wikitable" style="width: 500px; height: 500px; float: left;"
{| border="1" cellpadding="3" cellspacing="0" style="text-align:center" width=60%
+
!style="background:#41aef0"|Текущий шаг
!style="background:#f2f2f2"|Правило
+
!style="background:#41aef0"|Грамматика после применения правила
!style="background:#f2f2f2"|Грамматика после применения правила
 
 
|-
 
|-
|style="background:#ffffff"|''0. Исходная грамматика''
+
|''0. Исходная грамматика''
|style="background:#ffffff"|<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>
+
|<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>
 
|-
 
|-
|style="background:#ffffff"|''1. Удаление длинных правил''
+
|''1. Удаление длинных правил''
|style="background:#ffffff"|<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>
+
|<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>
 
|-
 
|-
|style="background:#ffffff"|''2. Удаление <tex>\varepsilon</tex>-правил''
+
|''2. Удаление <tex>\varepsilon</tex>-правил''
|style="background:#ffffff"|<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>  
+
|<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>  
 
|-
 
|-
|style="background:#ffffff"|''3. Удаление цепных правил''
+
|''3. Удаление цепных правил''
|style="background:#ffffff"|<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>  
+
|<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>  
 
|-
 
|-
|style="background:#ffffff"|''4. Удаление бесполезных символов''
+
|''4. Удаление бесполезных символов''
|style="background:#ffffff"|<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>
+
|<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>
 
|-
 
|-
|style="background:#ffffff"|''5. Уберём ситуации, когда в правиле встречаются несколько терминалов.''
+
|''5. Уберём ситуации, когда в правиле встречаются несколько терминалов.''
|style="background:#ffffff"|<tex>S\rightarrow S_{2}S_{1}</tex><br> <tex>X\rightarrow S_{2}Y|X_{1}Y</tex><br> <tex>Y\rightarrow S_{2}Y|X_{1}Y|Y_{1}Y_{1}</tex> <br> <tex>S_{1}\rightarrow XS_{2}|S_{3}X|y</tex> <br> <tex>S_{2}\rightarrow S_{3}X|y</tex>  <br> <tex>S_{2}\rightarrow a</tex> <br> <tex>S_{3}\rightarrow y</tex> <br> <tex>X_{1}\rightarrow b</tex>  <br> <tex>Y_{1}\rightarrow c</tex>
+
|<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>
  
 
== См. также  ==
 
== См. также  ==
Строка 75: Строка 75:
 
==Источники информации==
 
==Источники информации==
 
* [[wikipedia:en:Chomsky normal form | Wikipedia {{---}} Chomsky normal form]]
 
* [[wikipedia:en:Chomsky normal form | Wikipedia {{---}} Chomsky normal form]]
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 280с. : ISBN 5-8459-0261-4 (рус.)
+
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528с. : ISBN 5-8459-0261-4 (рус.)
  
  

Текущая версия на 19:17, 4 сентября 2022

Определение:
Грамматикой в нормальной форме Хомского (англ. Chomsky normal form) называется контекстно-свободная грамматика, в которой могут содержаться правила только следующего вида:
[math]A \rightarrow B C [/math],
[math]A \rightarrow a [/math],
[math]S \rightarrow \varepsilon [/math],
где [math] a [/math] — терминал, [math] A, B, C [/math] — нетерминалы, [math] S [/math] — стартовая вершина, [math] \varepsilon [/math] — пустая строка, стартовая вершина не содержится в правых частях правил.


Приведение грамматики к нормальной форме Хомского

Теорема:
Любую контекстно-свободную грамматику можно привести к нормальной форме Хомского.
Доказательство:
[math]\triangleright[/math]

Рассмотрим контекстно-свободную грамматику [math] \Gamma [/math]. Для приведения ее к нормальной форме Хомского необходимо выполнить пять шагов. На каждом шаге мы строим новую [math] \Gamma_i [/math], которая допускает тот же язык, что и [math] \Gamma [/math].

  1. Уберём длинные правила.
    Воспользуемся алгоритмом удаления длинных правил из грамматики. Получим грамматику [math] \Gamma_1 [/math], эквивалентную исходной, содержащую правила длины [math]0, 1[/math] и [math]2[/math].
  2. Удаление [math] \varepsilon [/math]-правил.
    Воспользуемся алгоритмом удаления [math] \varepsilon [/math]-правил из грамматики. Получим грамматику [math] \Gamma_2 [/math], эквивалентную исходной, но в которой нет [math]\varepsilon [/math]-правил.
  3. Удаление цепных правил.
    Воспользуемся алгоритмом удаления цепных правил из грамматики. Алгоритм работает таким образом, что новые [math] \varepsilon [/math]-правила не образуются. Получим грамматику [math] \Gamma_3 [/math], эквивалентную [math] \Gamma [/math].
  4. Удалим бесполезные символы.
    Воспользуемся алгоритмом удаления бесполезных символов из грамматики. Так как [math] \Gamma_3 [/math] эквивалентна [math] \Gamma [/math], то бесполезные символы не могли перестать быть бесполезными. Более того, мы только удаляем правила, новые [math]\varepsilon[/math]-правила и цепные правила не могли появиться.
  5. Уберём ситуации, когда в правиле встречаются несколько терминалов.
    Для всех правил вида [math] A \rightarrow u_1 u_2[/math] (где [math] u_i [/math] — терминал или нетерминал) заменим все терминалы [math] u_i [/math] на новые нетерминалы [math] U_i [/math] и добавим правила [math] U_i \rightarrow u_i [/math]. Теперь правила содержат либо одиночный терминал, либо строку из двух нетерминалов.

Таким образом, мы получили грамматику в нормальной форме Хомского, которая допускает тот же язык, что и [math] \Gamma [/math].

Стоит заметить, что порядок выполнения операций важен. Первое правило должно быть выполнено перед вторым, иначе время нормализации ухудшится до [math]O(2^{\left| \Gamma \right|})[/math]. Третье правило идет после второго, потому что после удаления [math]\varepsilon[/math]-правил, могут образоваться новые цепные правила. Также четвертое правило должно быть выполнено позже третьего и второго, так как они могут порождать бесполезные символы.

При таком порядке действий размеры грамматики возрастают полиномиально.

После удалении длинных правил из каждого правила длины [math] k \geqslant 3 [/math] могло появиться [math] k-1 [/math] новых правил, причем их длина не превышает двух. На этом шаге размер грамматики возрастает не более, чем вдвое.

При удалении [math] \varepsilon [/math]-правил из грамматики, содержащей правила длины [math]0, 1[/math] и [math]2[/math], размеры грамматики могли вырасти не больше, чем в [math]3[/math] раза.

Всего цепных правил в грамматике не больше, чем [math] n^2 [/math], где [math] n [/math] — число нетерминалов. При удалении цепных правил мы берем каждую из цепных пар и производим добавление нецепных правил, выводимых из второго нетерминала в паре. Если максимальная суммарная длина всех правил, выводимых из какого-либо нетерминала, равна [math] k [/math], то размер грамматики возрастет не больше, чем на [math] k \cdot n^2 [/math].

Наконец, на последнем шаге может произойти добавление не более, чем [math]|\Sigma|[/math] ([math]\Sigma[/math] — алфавит грамматики) новых правил, причем все они будут длины [math]1[/math].
[math]\triangleleft[/math]

Пример

Текущий шаг Грамматика после применения правила
0. Исходная грамматика [math]S\rightarrow aXbX|aZ[/math]
[math]X\rightarrow aY|bY|\varepsilon[/math]
[math]Y\rightarrow X|cc[/math]
[math]Z\rightarrow ZX[/math]
1. Удаление длинных правил [math]S\rightarrow aS_{1}|aZ[/math]
[math]X\rightarrow aY|bY|\varepsilon[/math]
[math]Y\rightarrow X|cc[/math]
[math]Z\rightarrow ZX[/math]
[math]S_{1}\rightarrow XS_{2}[/math]
[math]S_{2}\rightarrow yX[/math]
2. Удаление [math]\varepsilon[/math]-правил [math]S\rightarrow aS_{1}|aZ[/math]
[math]X\rightarrow aY|bY[/math]
[math]Y\rightarrow aY|bY|cc[/math]
[math]Z\rightarrow ZX[/math]
[math]S_{1}\rightarrow XS_{2}|S_{2}[/math]
[math]S_{2}\rightarrow yX|y[/math]
3. Удаление цепных правил [math]S\rightarrow aS_{1}|aZ[/math]
[math]X\rightarrow aY|bY[/math]
[math]Y\rightarrow aY|bY|cc[/math]
[math]Z\rightarrow ZX[/math]
[math]S_{1}\rightarrow XS_{2}|yX|y[/math]
[math]S_{2}\rightarrow yX|y[/math]
4. Удаление бесполезных символов [math]S\rightarrow aS_{1}[/math]
[math]X\rightarrow aY|bY[/math]
[math]Y\rightarrow aY|bY|cc[/math]
[math]S_{1}\rightarrow XS_{2}|yX|y[/math]
[math]S_{2}\rightarrow yX|y[/math]
5. Уберём ситуации, когда в правиле встречаются несколько терминалов. [math]S\rightarrow S_{3}S_{1}[/math]
[math]X\rightarrow S_{3}Y|X_{1}Y[/math]
[math]Y\rightarrow S_{3}Y|X_{1}Y|Y_{1}Y_{1}[/math]
[math]S_{1}\rightarrow XS_{2}|S_{4}X|y[/math]
[math]S_{2}\rightarrow S_{4}X|y[/math]
[math]S_{3}\rightarrow a[/math]
[math]S_{4}\rightarrow y[/math]
[math]X_{1}\rightarrow b[/math]
[math]Y_{1}\rightarrow c[/math]

См. также

Источники информации

  • Wikipedia — Chomsky normal form
  • Хопкрофт Д., Мотвани Р., Ульман Д.Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528с. : ISBN 5-8459-0261-4 (рус.)