Приведение грамматики к ослабленной нормальной форме Грейбах — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (rollbackEdits.php mass rollback)
 
(не показаны 34 промежуточные версии 11 участников)
Строка 1: Строка 1:
== Определение ==
 
 
{{Определение
 
{{Определение
|definition=Грамматикой в '''ослабленной нормальной форме Грейбах''' (''Greibach weaked normal form'') называется [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]], в которой могут содержаться только правила одного из следующих типов:
+
|definition=Грамматикой в '''нормальной форме Грейбах''' (англ. ''Greibach normal form'') называется [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]], в которой могут содержаться только правила одного из следующих типов:
* <tex> A \rightarrow a\gamma </tex>,
+
:<tex> A \rightarrow a\gamma </tex>
* <tex> S \rightarrow \varepsilon </tex>,
+
 
где <tex> a </tex> {{---}} терминал, <tex> A </tex> {{---}} нетерминал, <tex> S </tex> {{---}} стартовый нетерминал (причём он не должен встречаться в правых частях правил), <tex> \varepsilon </tex> {{---}} пустая строка, <tex> \gamma </tex> {{---}} строка из произвольного числа терминалов и нетерминалов.   
+
:<tex> S \rightarrow \varepsilon </tex>
 +
где <tex> a </tex> {{---}} терминал, <tex> A </tex> {{---}} нетерминал (возможно, стартовый), <tex> S </tex> {{---}} стартовый нетерминал (причём он не должен встречаться в правых частях правил), <tex> \varepsilon </tex> {{---}} пустая строка, <tex> \gamma </tex> {{---}} строка из не более, чем двух нетерминалов.
 +
}}
 +
 
 +
{{Определение
 +
|definition=Грамматикой в '''ослабленной нормальной форме Грейбах''' (англ. ''Greibach weak normal form'') называется [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная грамматика]], в которой могут содержаться только правила одного из следующих типов:
 +
:<tex> A \rightarrow a\gamma </tex>
 +
 
 +
:<tex> S \rightarrow \varepsilon </tex>
 +
где <tex> a </tex> {{---}} терминал, <tex> A </tex> {{---}} нетерминал (возможно, стартовый), <tex> S </tex> {{---}} стартовый нетерминал (причём он не должен встречаться в правых частях правил), <tex> \varepsilon </tex> {{---}} пустая строка, <tex> \gamma </tex> {{---}} строка из произвольного числа терминалов и нетерминалов.   
 
}}
 
}}
 +
  
 
== Приведение грамматики к ослабленной нормальной форме Грейбах ==
 
== Приведение грамматики к ослабленной нормальной форме Грейбах ==
Строка 13: Строка 22:
 
Рассмотрим контекстно-свободную грамматику <tex> \Gamma </tex>. Для приведения её к нормальной ослабленной форме Грейбах нужно выполнить три шага. На каждом шаге мы строим новую грамматику, допускающую тот же язык, что и <tex> \Gamma </tex>.
 
Рассмотрим контекстно-свободную грамматику <tex> \Gamma </tex>. Для приведения её к нормальной ослабленной форме Грейбах нужно выполнить три шага. На каждом шаге мы строим новую грамматику, допускающую тот же язык, что и <tex> \Gamma </tex>.
  
<ol>
+
#Избавимся от <tex> \varepsilon </tex>-правил. Для этого воспользуемся [[Удаление_eps-правил_из_грамматики | алгоритмом удаления <tex> \varepsilon </tex>-правил]].
<li> Избавимся от <tex> \varepsilon </tex>-правил.
+
#Воспользуемся [[Устранение_левой_рекурсии|алгоритмом устранения левой рекурсии]].Получим грамматику, все правила которой будут иметь следующий вид:
Для этого воспользуемся [[Удаление_eps-правил_из_грамматики | алгоритмом удаления <tex> \varepsilon </tex>-правил]].
+
#* <tex> A_i \rightarrow a \gamma </tex>,  
</li>
+
#* <tex> A_i \rightarrow A_j \gamma </tex>, где <tex> A_i </tex>, <tex> A_j </tex> {{---}} нетерминалы, <tex> a </tex> {{---}} терминал, <tex> \gamma </tex> {{---}} произвольная последовательность из терминалов и нетерминалов, <tex> i < j </tex>.
<li> Воспользуемся [[Устранение_левой_рекурсии|алгоритмом устранения левой рекурсии]].
+
#Воспользуемся следующей функцией для придания грамматике нужного вида:
Получим грамматику, все правила которой будут иметь следующий вид:
+
'''function''' greibah(правила <tex>A_1 \dots A_n</tex> из контекстно-свободной грамматики <tex> \Gamma </tex>):
<ul>
+
    '''for''' i = n .. 1
<li> <tex> A_i \rightarrow a \gamma </tex>, </li>
+
      '''for''' j = i + 1 .. n
<li> <tex> A_i \rightarrow A_j \gamma </tex>, </li>
+
          Для каждого правила вывода из <tex> A_j </tex> вида <tex> A_j \rightarrow \delta_1 | \ldots | \delta_k </tex> заменить каждое правило <tex> A_i \rightarrow A_j \gamma </tex> на <tex> A_i \rightarrow \delta_1\gamma | \ldots | \delta_k\gamma </tex>.
</ul>
 
где <tex> A_i </tex>, <tex> A_j </tex> {{---}} нетерминалы, <tex> a </tex> {{---}} терминал, <tex> \gamma </tex> {{---}} произвольная последовательность из терминалов и нетерминалов, <tex> i < j </tex>.
 
</li>
 
<li>
 
Воспользуемся следующей процедурой для придания грамматике нужного вида:
 
<div>
 
for i = n downto 1
 
    for j = i + 1 to n
 
      Для каждого правила вывода из <tex> A_j \rightarrow \delta_1 | \ldots | \delta_k </tex> заменить каждое правило <tex> A_i \rightarrow A_j \gamma </tex> на <tex> A_i \rightarrow \delta_1\gamma | \ldots | \delta_k\gamma </tex>.
 
</div>
 
  
После каждой итерации главного цикла все правила для <tex> A_k, \, k \ge i </tex> будут иметь вид <tex> A_k \rightarrow a \alpha </tex>.
+
После каждой итерации главного цикла все правила для <tex> A_k </tex> (где <tex>k \geqslant i</tex>) будут иметь вид <tex> A_k \rightarrow a \gamma </tex>.
Значит, после применения процедуры все правила грамматики будут иметь вид <tex> A \rightarrow a \alpha </tex>.
+
Значит, после применения процедуры все правила грамматики будут иметь вид <tex> A \rightarrow a \gamma </tex>.
</li>
 
</ol>
 
  
Таким образом мы получили грамматику в ослабленной нормальной форме Грейбах, которая допускает то же язык, что и <tex> \Gamma </tex>.
+
Таким образом, мы получили грамматику в ослабленной нормальной форме Грейбах, которая допускает тот же язык, что и исходная.
 
}}
 
}}
 +
 +
== Пример ==
 +
{| border="1" class="wikitable" style="width: 500px; height: 500px; float: left;"
 +
!style="background:#41aef0"|Текущий шаг
 +
!style="background:#41aef0"|Грамматика после применения правила
 +
|-
 +
|''0. Исходная грамматика''
 +
|<tex>S\rightarrow XA|BB</tex> <br> <tex>B\rightarrow b|SB</tex> <br> <tex>X\rightarrow b</tex><br> <tex>A\rightarrow a</tex>
 +
|-
 +
|''1. Удаление <tex>\varepsilon</tex>-правил''
 +
|<tex>S\rightarrow XA|BB</tex> <br> <tex>B\rightarrow b|SB</tex> <br> <tex>X\rightarrow b</tex><br> <tex>A\rightarrow a</tex>
 +
|-
 +
|''2. Удаление стартового нетерминала из правых частей правил
 +
|<tex>S\rightarrow XA|BB</tex> <br> <tex>B\rightarrow bAB|BBB|b</tex> <br> <tex>X\rightarrow b</tex><br> <tex>A\rightarrow a</tex>
 +
|-
 +
|''3. Удаление левой рекурсии
 +
|<tex>S\rightarrow XA|BB</tex> <br> <tex>B\rightarrow bAB|b|bABZ|bZ</tex> <br> <tex>Z\rightarrow BB|BBZ</tex> <br> <tex>X\rightarrow b</tex> <br> <tex>A\rightarrow a</tex>
 +
|-
 +
|''4. Выполняем функцию '''greibah''' для правила <tex>S\rightarrow XA|BB</tex>
 +
|<tex>S\rightarrow bA|bABB|bB|bABZB|bZB</tex> <br> <tex>B\rightarrow bAB|b|bABZ|bZ</tex> <br> <tex>Z\rightarrow BB|BBZ</tex> <br> <tex>X\rightarrow b</tex> <br> <tex>A\rightarrow a</tex>
 +
|-
 +
|''5. Выполняем функцию '''greibah''' для правила <tex>Z\rightarrow BB|BBZ</tex>
 +
|<tex>S\rightarrow bA|bABB|bB|bABZB|bZB</tex> <br> <tex>B\rightarrow bAB|b|bABZ|bZ</tex> <br> <tex>Z\rightarrow bABB|bB|bABZB|bZB|bABBZ|bBZ|bABZBZ|bZBZ</tex> <br> <tex>X\rightarrow b</tex> <br> <tex>A\rightarrow a</tex>
 +
|}
 +
<div style="clear:both;"></div>
 +
 +
 +
=== Асимптотика ===
 +
 +
Алгоритм состоит из трех шагов, сложность первого и последнего шага равны <tex>O(\left| \Gamma \right|)</tex> и <tex>O(\left| \Gamma \right| ^ 2)</tex> соответственно. Таким обзом, сложность алгоритма является <tex>O(\left| \Gamma \right| ^ 2) + O\left(n\sum\limits_{i=1}^n a_j\right)</tex>, где второй член {{---}} сложность алгоритма удаления левой рекурсии.
 +
 +
== Применение ==
 +
'''Простота доказательств'''
 +
 +
Использование нормальных форм существенно упрощает доказательство теорем. Например, использование нормальной формы Грейбах позволяет доказать, что для каждого контекстно-свободного языка (не содержащего <tex>\varepsilon</tex>) существует автомат с магазинной памятью без переходов по <tex>\varepsilon</tex>. <ref>[http://www.cis.upenn.edu/~jean/old511/html/cis51108sl4b.pdf Jean Gallier {{---}} Discrete Mathematics]</ref>
 +
 +
'''Разбор грамматики'''
 +
 +
Нормальная форма Хомского позволяет производить разбор грамматики. Например, с помощью [[Алгоритм Кока-Янгера-Касами разбора грамматики в НФХ|алгоритма Кока-Янгера-Касами]]. В свою очередь, нормальная форма Грейбах позволяет использовать метод рекурсивного спуска, сложность которого является линейной, несмотря на возвраты.
 +
 +
== См. также  ==
 +
* [[Контекстно-свободные_грамматики,_вывод,_лево-_и_правосторонний_вывод,_дерево_разбора|Контекстно-свободные грамматики]]
 +
* [[Нормальная_форма_Куроды | Нормальная форма Куроды]]
 +
* [[Нормальная_форма_Хомского | Нормальная форма Хомского]]
 +
 +
==Примечания==
 +
 +
<references />
 +
 +
==Источники информации==
 +
* [[wikipedia:en:Greibach normal form | Wikipedia {{---}} Greibach normal form]]
 +
* [http://www.iitg.ernet.in/gkd/ma513/oct/oct18/note.pdf MA513: Formal Languages and Automata Theory]
 +
 +
[[Категория: Теория формальных языков]]
 +
[[Категория: Контекстно-свободные грамматики]]
 +
[[Категория: Нормальные формы КС-грамматик]]

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

Определение:
Грамматикой в нормальной форме Грейбах (англ. Greibach normal form) называется контекстно-свободная грамматика, в которой могут содержаться только правила одного из следующих типов:
Aaγ
Sε
где a — терминал, A — нетерминал (возможно, стартовый), S — стартовый нетерминал (причём он не должен встречаться в правых частях правил), ε — пустая строка, γ — строка из не более, чем двух нетерминалов.


Определение:
Грамматикой в ослабленной нормальной форме Грейбах (англ. Greibach weak normal form) называется контекстно-свободная грамматика, в которой могут содержаться только правила одного из следующих типов:
Aaγ
Sε
где a — терминал, A — нетерминал (возможно, стартовый), S — стартовый нетерминал (причём он не должен встречаться в правых частях правил), ε — пустая строка, γ — строка из произвольного числа терминалов и нетерминалов.


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

Теорема:
Любую контекстно-свободную грамматику можно привести к ослабленной нормальной форме Грейбах.
Доказательство:

Рассмотрим контекстно-свободную грамматику Γ. Для приведения её к нормальной ослабленной форме Грейбах нужно выполнить три шага. На каждом шаге мы строим новую грамматику, допускающую тот же язык, что и Γ.

  1. Избавимся от ε-правил. Для этого воспользуемся алгоритмом удаления ε-правил.
  2. Воспользуемся алгоритмом устранения левой рекурсии.Получим грамматику, все правила которой будут иметь следующий вид:
    • Aiaγ,
    • AiAjγ, где Ai, Aj — нетерминалы, a — терминал, γ — произвольная последовательность из терминалов и нетерминалов, i<j.
  3. Воспользуемся следующей функцией для придания грамматике нужного вида:
function greibah(правила A1An из контекстно-свободной грамматики Γ): 
   for i = n .. 1
      for j = i + 1 .. n
         Для каждого правила вывода из Aj вида Ajδ1||δk заменить каждое правило AiAjγ на Aiδ1γ||δkγ.

После каждой итерации главного цикла все правила для Ak (где ki) будут иметь вид Akaγ. Значит, после применения процедуры все правила грамматики будут иметь вид Aaγ.

Таким образом, мы получили грамматику в ослабленной нормальной форме Грейбах, которая допускает тот же язык, что и исходная.

Пример

Текущий шаг Грамматика после применения правила
0. Исходная грамматика SXA|BB
Bb|SB
Xb
Aa
1. Удаление ε-правил SXA|BB
Bb|SB
Xb
Aa
2. Удаление стартового нетерминала из правых частей правил SXA|BB
BbAB|BBB|b
Xb
Aa
3. Удаление левой рекурсии SXA|BB
BbAB|b|bABZ|bZ
ZBB|BBZ
Xb
Aa
4. Выполняем функцию greibah для правила SXA|BB SbA|bABB|bB|bABZB|bZB
BbAB|b|bABZ|bZ
ZBB|BBZ
Xb
Aa
5. Выполняем функцию greibah для правила ZBB|BBZ SbA|bABB|bB|bABZB|bZB
BbAB|b|bABZ|bZ
ZbABB|bB|bABZB|bZB|bABBZ|bBZ|bABZBZ|bZBZ
Xb
Aa


Асимптотика

Алгоритм состоит из трех шагов, сложность первого и последнего шага равны O(|Γ|) и O(|Γ|2) соответственно. Таким обзом, сложность алгоритма является O(|Γ|2)+O(nni=1aj), где второй член — сложность алгоритма удаления левой рекурсии.

Применение

Простота доказательств

Использование нормальных форм существенно упрощает доказательство теорем. Например, использование нормальной формы Грейбах позволяет доказать, что для каждого контекстно-свободного языка (не содержащего ε) существует автомат с магазинной памятью без переходов по ε. [1]

Разбор грамматики

Нормальная форма Хомского позволяет производить разбор грамматики. Например, с помощью алгоритма Кока-Янгера-Касами. В свою очередь, нормальная форма Грейбах позволяет использовать метод рекурсивного спуска, сложность которого является линейной, несмотря на возвраты.

См. также

Примечания

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