Дана контекстно-свободная грамматика G: S -> aSa | bSb | a | b | ε. Определите класс языка L(G): регулярный/контекстно-свободный/декурсивный и т.д.; докажите (или опровергните) регулярность языка, предложите автомат или грамматику более низкой сложности, если это возможно, и опишите алгоритм разбора (вид парсера) и сложность разбора строки длины n

7 Ноя в 07:00
5 +5
0
Ответы
1
Кратко: язык L(G)L(G)L(G) — все палиндромы над алфавитом {a,b}\{a,b\}{a,b}:
L(G)={w∈{a,b}∗∣w=wR}. L(G)=\{w\in\{a,b\}^*\mid w=w^R\}.
L(G)={w{a,b}w=wR}.

Класс языка:
- Контекстно-свободный: грамматика задана явно (правила S→aSa∣bSb∣a∣b∣εS\to aSa\mid bSb\mid a\mid b\mid\varepsilonSaSabSbabε).
- Не регулярный. Доказательство (пьз. леммы о накачке для регулярных языков): пусть ppp — длина накачки; выберем
s=apbap∈L. s=a^p b a^p\in L.
s=apbapL.
По лемме s=xyzs=xyzs=xyz, ∣xy∣≤p|xy|\le pxyp, ∣y∣>0|y|>0y>0. Тогда y=aky=a^ky=ak для некоторого k>0k>0k>0. Для i=0i=0i=0 получаем
xz=ap−kbap, x z=a^{p-k} b a^p,
xz=apkbap,
что не палиндром — противоречие. Следовательно LLL не регулярный.
- Рекурсивный (разрешимый) и, разумеется, перечислимый; также язык относится к контекстно-чувствительным языкам.
Автомат/грамматика более низкой сложности:
- Никакой конечный автомат не существует (см. нерегулярность), т.е. язык нельзя описать регулярной грамматикой. Поэтому по сложности класс ниже (регулярный) невозможен.
NPDA (словоописание): ненаблюдаемый магазинный автомат делает либо
1) на входе пушит символы aaa или bbb на стек; в любой момент может переходом по ε\varepsilonε перейти в фазу сравнения, после чего при чтении каждого символа поп-операцией проверяет соответствие верхушки стека и символа и делает pop; принимает, если вход закончился и стек пуст (или содержит только начальный маркер). Это стандартный недетерминированный PDA для палиндромов.
Алгоритм разбора и сложность:
- Общие синтаксические алгоритмы для КС-грамматик: CYK — O(n3) \,O(n^3)\,O(n3) (после приведения в Хомский НФ), Earley/GLR — в худшем случае O(n3) \,O(n^3)\,O(n3).
- Для этого конкретного языка существует простая линейная проверка: сравнивать s[i]s[i]s[i] и s[n−1−i]s[n-1-i]s[n1i] для всех i=0,…,⌊(n−1)/2⌋i=0,\dots,\lfloor(n-1)/2\rfloori=0,,⌊(n1)/2. Это даёт детерминированную проверку за O(n) \,O(n)\,O(n) времени (и O(1) \,O(1)\,O(1) дополнительной памяти при доступе к символам по индексу) или за O(n) \,O(n)\,O(n) времени и O(n) \,O(n)\,O(n) памяти при реализации через стек в двух проходах (сначала узнать nnn, затем пушить первые ⌊n/2⌋\lfloor n/2\rfloorn/2 символов и сравнивать остаток).
- Замечание: общий детерминированный PDA (однопроходный, без возможности обратного чтения) для этого языка не даётся; поэтому в теории язык записывают как НПДА/КС-грамматику, но практическая проверка палиндрома реализуется линейным алгоритмом, описанным выше.
Итого: L(G)L(G)L(G) — контекстно‑свободный, не регулярный, разрешимый; проверка принадлежности может быть выполнена за O(n) \,O(n)\,O(n) времени на практике, общие парсеры для произвольной КС‑грамматики — за O(n3) \,O(n^3)\,O(n3) в худшем случае.
7 Ноя в 07:23
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир