Дана контекстно‑свободная грамматика G с правилами S→aSb | SS | ε — докажите, генерирует ли она язык {a^n b^n | n>=0} целиком, есть ли неоднозначность, и предложите метод устранения неоднозначности или обоснование её невозможности
Кратко и по пунктам. 1) Что генерирует заданная грамматика Грамматика S→aSb∣SS∣ε
S \to aSb \mid SS \mid \varepsilon S→aSb∣SS∣ε
генерирует язык правильно сбалансированных последовательностей букв aaa и bbb (аналог языка сбалансированных скобок): множество всех слов с равным числом aaa и bbb, причём в каждом префиксе число aaa не меньше числа bbb. Обозначим этот язык DDD. Ясно, что {anbn∣n≥0}⊆D\{a^n b^n \mid n\ge0\}\subseteq D{anbn∣n≥0}⊆D, т.к. правило S→aSbS\to aSbS→aSb даёт цепочку S⇒anSbn⇒anbnS\Rightarrow a^n S b^n\Rightarrow a^n b^nS⇒anSbn⇒anbn. Однако грамматика даёт и слова вне вида anbna^n b^nanbn. Например, S⇒SS⇒aSb aSb⇒ab ab,
S\Rightarrow SS\Rightarrow aSb\,aSb\Rightarrow ab\,ab, S⇒SS⇒aSbaSb⇒abab,
то есть abab∈L(G)abab\in L(G)abab∈L(G) но abab∉{anbn}abab\not\in\{a^n b^n\}abab∈{anbn}. Следовательно L(G)L(G)L(G) строго содержит {anbn}\{a^n b^n\}{anbn} и не равен ему. 2) Неоднозначность Грамматика неоднозначна (правило S→SSS\to SSS→SS даёт разные бинарные ассоциации конкатенации). Пример для слова ababababababababab (три раза ababab): его можно получить с разной структурой разбиения на компоненты: - первый способ (группировка слева): S⇒SS⇒SSS⇒(aSb)SS⇒abSS⇒ab(aSb)S⇒ab ab ab.
S\Rightarrow SS\Rightarrow SSS\Rightarrow (aSb)SS\Rightarrow abSS\Rightarrow ab(aSb)S\Rightarrow ab\,ab\,ab. S⇒SS⇒SSS⇒(aSb)SS⇒abSS⇒ab(aSb)S⇒ababab.
- второй способ (группировка справа): S⇒SS⇒SSS⇒S(aSb)S⇒(aSb)(aSb)S⇒ab ab ab.
S\Rightarrow SS\Rightarrow SSS\Rightarrow S(aSb)S\Rightarrow (aSb)(aSb)S\Rightarrow ab\,ab\,ab. S⇒SS⇒SSS⇒S(aSb)S⇒(aSb)(aSb)S⇒ababab.
Эти два вывода дают разные синтаксические деревья, значит грамматика неоднозначна. 3) Устранение неоднозначности Язык DDD (однобуквенный язык сбалансированных скобок) допускает однозначную КС-грамматику. Одна стандартная неамбиграмматика: S→a S b S∣ε.
S \to a\,S\,b\,S \mid \varepsilon. S→aSbS∣ε.
Обоснование однозначности: любое ненулевое слово w∈Dw\in Dw∈D начинается с aaa; существует единственная позиция соответствующей закрывающей bbb — первая позиция, где в префиксе число aaa и bbb сравнялось; это даёт единственное разложение w=aubvw=aubvw=aubv с u,v∈Du,v\in Du,v∈D. Правило S→aSbSS\to aSbSS→aSbS как раз кодирует это единственное разбиение, поэтому разбор уникален. Выводы: - Грамматика S→aSb∣SS∣εS\to aSb\mid SS\mid\varepsilonS→aSb∣SS∣ε не равна языку {anbn}\{a^n b^n\}{anbn}; она генерирует более широкий язык сбалансированных последовательностей. - Грамматика неоднозначна. - Можно заменить её на эквивалентную неамбиграмматику, например S→aSbS∣εS\to aSbS\mid\varepsilonS→aSbS∣ε, которая порождёт тот же язык и будет однозначной.
1) Что генерирует заданная грамматика
Грамматика
S→aSb∣SS∣ε S \to aSb \mid SS \mid \varepsilon
S→aSb∣SS∣ε генерирует язык правильно сбалансированных последовательностей букв aaa и bbb (аналог языка сбалансированных скобок): множество всех слов с равным числом aaa и bbb, причём в каждом префиксе число aaa не меньше числа bbb. Обозначим этот язык DDD.
Ясно, что {anbn∣n≥0}⊆D\{a^n b^n \mid n\ge0\}\subseteq D{anbn∣n≥0}⊆D, т.к. правило S→aSbS\to aSbS→aSb даёт цепочку S⇒anSbn⇒anbnS\Rightarrow a^n S b^n\Rightarrow a^n b^nS⇒anSbn⇒anbn. Однако грамматика даёт и слова вне вида anbna^n b^nanbn. Например,
S⇒SS⇒aSb aSb⇒ab ab, S\Rightarrow SS\Rightarrow aSb\,aSb\Rightarrow ab\,ab,
S⇒SS⇒aSbaSb⇒abab, то есть abab∈L(G)abab\in L(G)abab∈L(G) но abab∉{anbn}abab\not\in\{a^n b^n\}abab∈{anbn}. Следовательно L(G)L(G)L(G) строго содержит {anbn}\{a^n b^n\}{anbn} и не равен ему.
2) Неоднозначность
Грамматика неоднозначна (правило S→SSS\to SSS→SS даёт разные бинарные ассоциации конкатенации). Пример для слова ababababababababab (три раза ababab): его можно получить с разной структурой разбиения на компоненты:
- первый способ (группировка слева):
S⇒SS⇒SSS⇒(aSb)SS⇒abSS⇒ab(aSb)S⇒ab ab ab. S\Rightarrow SS\Rightarrow SSS\Rightarrow (aSb)SS\Rightarrow abSS\Rightarrow ab(aSb)S\Rightarrow ab\,ab\,ab.
S⇒SS⇒SSS⇒(aSb)SS⇒abSS⇒ab(aSb)S⇒ababab. - второй способ (группировка справа):
S⇒SS⇒SSS⇒S(aSb)S⇒(aSb)(aSb)S⇒ab ab ab. S\Rightarrow SS\Rightarrow SSS\Rightarrow S(aSb)S\Rightarrow (aSb)(aSb)S\Rightarrow ab\,ab\,ab.
S⇒SS⇒SSS⇒S(aSb)S⇒(aSb)(aSb)S⇒ababab. Эти два вывода дают разные синтаксические деревья, значит грамматика неоднозначна.
3) Устранение неоднозначности
Язык DDD (однобуквенный язык сбалансированных скобок) допускает однозначную КС-грамматику. Одна стандартная неамбиграмматика:
S→a S b S∣ε. S \to a\,S\,b\,S \mid \varepsilon.
S→aSbS∣ε. Обоснование однозначности: любое ненулевое слово w∈Dw\in Dw∈D начинается с aaa; существует единственная позиция соответствующей закрывающей bbb — первая позиция, где в префиксе число aaa и bbb сравнялось; это даёт единственное разложение w=aubvw=aubvw=aubv с u,v∈Du,v\in Du,v∈D. Правило S→aSbSS\to aSbSS→aSbS как раз кодирует это единственное разбиение, поэтому разбор уникален.
Выводы:
- Грамматика S→aSb∣SS∣εS\to aSb\mid SS\mid\varepsilonS→aSb∣SS∣ε не равна языку {anbn}\{a^n b^n\}{anbn}; она генерирует более широкий язык сбалансированных последовательностей.
- Грамматика неоднозначна.
- Можно заменить её на эквивалентную неамбиграмматику, например S→aSbS∣εS\to aSbS\mid\varepsilonS→aSbS∣ε, которая порождёт тот же язык и будет однозначной.