Дан контекст: грамматика G с продукциями S -> S S | "a" порождает язык {a}^+ и является амбигуэзной; продемонстрируйте неоднозначность на конкретном примере строки "aaa", преобразуйте грамматику в эквивалентную без неоднозначности или объясните, почему это невозможно, и при необходимости покажите преобразование в нормальную форму Хомского или Хопкрофта и Ульмана для использования алгоритма CYK
1) Демонстрация неоднозначности для строки "aaa" "aaa" "aaa" в грамматике S→S S∣"a"
S \to S\,S \mid "a" S→SS∣"a"
Две разные разборки (группировки) дают одну и ту же строку: - Разборка слева-ассоциативная ((aa)a)((aa)a)((aa)a): S⇒S S⇒S S S⇒"a" S S⇒"a" "a" S⇒"a" "a" "a".
S \Rightarrow S\,S \Rightarrow S\,S\,S \Rightarrow "a"\,S\,S \Rightarrow "a"\,"a"\,S \Rightarrow "a"\,"a"\,"a". S⇒SS⇒SSS⇒"a"SS⇒"a""a"S⇒"a""a""a". - Разборка справа-ассоциативная (a(aa))(a(aa))(a(aa)): S⇒S S⇒S S S⇒S "a" S⇒"a" "a" "a".
S \Rightarrow S\,S \Rightarrow S\,S\,S \Rightarrow S\,"a"\,S \Rightarrow "a"\,"a"\,"a". S⇒SS⇒SSS⇒S"a"S⇒"a""a""a". Обе дают одну и ту же итоговую строку "aaa" "aaa" "aaa" при разных деревьях разбора ⇒ грамматика амбигуэзна. 2) Эквивалентная без неoднозначности грамматика (порождает {a}+ \{a\}^+ {a}+ и однозначна): S→"a" S∣"a".
S \to "a"\,S \mid "a". S→"a"S∣"a".
Для любой длины nnn строка ana^nan имеет единственный цепной (право-рекурсивный) разбор — однозначность. 3) Преобразование в нормальную форму Хомского (CNF) для использования CYK. Введём нетерминал AAA для терминала aaa: A→"a".
A \to "a". A→"a".
Приведём правила так, чтобы правая часть была либо два нетерминала, либо один терминал: S→A S∣"a",A→"a".
S \to A\,S \mid "a",\qquad A \to "a". S→AS∣"a",A→"a".
Здесь S→A SS\to A\,SS→AS — форма A→BCA\to BCA→BC, а S→"a"S\to "a"S→"a" и A→"a"A\to "a"A→"a" — формы A→aA\to aA→a. Это CNF-подобная форма, пригодная для CYK (при необходимости можно избавиться от дублирующего правила S→"a"S\to "a"S→"a", но для CYK такое представление допустимо). Кратко: исходная грамматика амбигуэзна (пример "aaa" "aaa" "aaa" показан); язык регулярный {a}+ \{a\}^+ {a}+, поэтому существует однозначная грамматика, например S→"a"S∣"a"S\to "a"S\mid "a"S→"a"S∣"a"; для CYK можно использовать приведённую CNF-версию с вводом A→"a"A\to "a"A→"a".
S→S S∣"a" S \to S\,S \mid "a"
S→SS∣"a" Две разные разборки (группировки) дают одну и ту же строку:
- Разборка слева-ассоциативная ((aa)a)((aa)a)((aa)a):
S⇒S S⇒S S S⇒"a" S S⇒"a" "a" S⇒"a" "a" "a". S \Rightarrow S\,S \Rightarrow S\,S\,S \Rightarrow "a"\,S\,S \Rightarrow "a"\,"a"\,S \Rightarrow "a"\,"a"\,"a".
S⇒SS⇒SSS⇒"a"SS⇒"a""a"S⇒"a""a""a".
- Разборка справа-ассоциативная (a(aa))(a(aa))(a(aa)):
S⇒S S⇒S S S⇒S "a" S⇒"a" "a" "a". S \Rightarrow S\,S \Rightarrow S\,S\,S \Rightarrow S\,"a"\,S \Rightarrow "a"\,"a"\,"a".
S⇒SS⇒SSS⇒S"a"S⇒"a""a""a".
Обе дают одну и ту же итоговую строку "aaa" "aaa" "aaa" при разных деревьях разбора ⇒ грамматика амбигуэзна.
2) Эквивалентная без неoднозначности грамматика (порождает {a}+ \{a\}^+ {a}+ и однозначна):
S→"a" S∣"a". S \to "a"\,S \mid "a".
S→"a"S∣"a". Для любой длины nnn строка ana^nan имеет единственный цепной (право-рекурсивный) разбор — однозначность.
3) Преобразование в нормальную форму Хомского (CNF) для использования CYK.
Введём нетерминал AAA для терминала aaa:
A→"a". A \to "a".
A→"a". Приведём правила так, чтобы правая часть была либо два нетерминала, либо один терминал:
S→A S∣"a",A→"a". S \to A\,S \mid "a",\qquad A \to "a".
S→AS∣"a",A→"a". Здесь S→A SS\to A\,SS→AS — форма A→BCA\to BCA→BC, а S→"a"S\to "a"S→"a" и A→"a"A\to "a"A→"a" — формы A→aA\to aA→a. Это CNF-подобная форма, пригодная для CYK (при необходимости можно избавиться от дублирующего правила S→"a"S\to "a"S→"a", но для CYK такое представление допустимо).
Кратко: исходная грамматика амбигуэзна (пример "aaa" "aaa" "aaa" показан); язык регулярный {a}+ \{a\}^+ {a}+, поэтому существует однозначная грамматика, например S→"a"S∣"a"S\to "a"S\mid "a"S→"a"S∣"a"; для CYK можно использовать приведённую CNF-версию с вводом A→"a"A\to "a"A→"a".