Насосные леммы для КЛЛ
Это не вопрос программирования, но я не знаю ни одного хорошего места в интернете, чтобы задавать вопросы по информатике. Извините, если это слишком не по теме.
Я просматриваю некоторые старые материалы CS, и я застрял на следующем:
Пусть L = { x в {a, b}* | x имеет равное число a и b}
Я знаю, что это язык без контекста, потому что я могу создать для него грамматику (e-Эпсилон):
S - > aX / bY / e
X - > bS / aXX
Y - > aS | bYY
Вы также можете доказать, что он свободен от контекста, используя тот факт, что язык, свободный от контекста, пересекающийся с обычным языком, свободен от контекста.
Поскольку это язык без контекста, согласно лемме накачки для CFL, любая строка, длина которой больше длины накачки p, должна быть способна быть накачана. Однако, если я выберу строку s = a^p b^p a^p b^p, эта строка не может быть перекачана, поэтому язык не должен быть контекстно свободным.
Где я ошибаюсь?
2 ответа:
Конечно, Струну можно накачать. Пусть
u = a^p b^(p-1), v = b, x = e, y = a, z=a^(p-1) b^p
. Теперьuvxyz = s
и для любого iu v^i x y^i z
имеет равное количество as и bs.
Пусть u = a^p, v = b^(p-1), x = ba, y = a^(p-1), z = b^p, так что ваша строка s = uvxyz.
Тогда любая строка вида u v^i x y^i z находится в языке, поэтому выполняются условия леммы накачки CFL.
Длина накачки не является "p" для вашего примера...может быть, именно в этом ты и запутался?
Edit: sepp2k правильно указывает, что мой выбор vxy нарушает условие, что |vxy|