Контекстная грамматика для этого языка - PullRequest
1 голос
/ 24 февраля 2011

Я работаю над некоторыми материалами для подготовки к тестам и застрял в этой проблеме.

Показать контекстную грамматику для L = {we {a, b} *: w = wR и каждого aсразу за ним следует ab}.

wR - обратное.Итак, на английском языке, за палиндромом, за которым за каждым «a» следует буква «b», используя любое количество a и b.

Пока что я получил это для обратной части, но не могувыясните, как включить каждую a, за которой следует часть ab, при этом свойство палиндрома будет по-прежнему сохраняться.

S -> bSb | b | [the empty string]

Любая помощь очень ценится!

1 Ответ

2 голосов
/ 24 февраля 2011

Поскольку за каждым «а» должна следовать буква «b», а результирующее слово должно быть палиндромом (то же самое при чтении с конца до начала), это означает, что каждое «а» также должно быть предшествует "b".

Мы начинаем строить слово с середины, растя в обоих направлениях. Правило состоит в том, что когда средняя часть заканчивается (и, следовательно, начинается) буквой «а» (это нетерминал А), за ней должна следовать (и предшествует) буква «b». С другой стороны, когда средняя секция окружена буквой "b" (это нетерминал B), она может расширяться с помощью одной буквы "a" (предыдущий случай) или любого числа цифр "b". Особый случай с равномерно пронумерованными буквами "b" в середине также обрабатывается. Начальный символ S допускает только слова, ограниченные "b" s, поэтому все правила совпадают.

S -> B | [empty]
B -> bAb | bBb | bb | b
A -> aBa | a

Редактировать: мое предыдущее решение было неверным, я надеюсь, что это работает сейчас.

...