Я ищу контекстно-зависимую грамматику, которая описывает следующий язык: .
У меня проблемы с тем, что никакие правила, такие как не разрешены, и поэтому я не могу поместить нетерминал, указывающий «середину» слова. Есть ли уловка в проблеме?
Я ищу контекстно-зависимую грамматику, которая описывает следующий язык: .
У меня проблемы с тем, что никакие правила, такие как не разрешены, и поэтому я не могу поместить нетерминал, указывающий «середину» слова. Есть ли уловка в проблеме?
Ответы:
Действительно, есть простой прием, который позволяет вам добавлять дополнительную информацию в определенную позицию: просто замените букву рядом с позицией и отметьте ее информацией и исходной буквой.
В вашем примере есть нетерминал для середины, но, поскольку он не может быть удален, он также считается нормальной буквой. Таким образом, у нас есть две копии M a и M b для обозначения замененных букв. В конце деривации маркеры должны быть заменены содержимым их букв на простые произведения, такие как M a → a .
В большинстве случаев применение необходимо выполнить в конце процесса деривации. В некоторых конструкциях это не нужно «синхронизировать»: когда M исчезает слишком рано, деривация не может найти правильную позицию, и процесс не будет успешно остановлен. В других случаях нужен некий контроль. Иногда это делается введением нетерминала как сигнала, который движется вдоль букв. Опять же, этот сигнал должен также нести терминал, иначе вы столкнетесь с теми же проблемами.
Перемещение информации вокруг легко в так называемых монотонных грамматик ( ; с | & alpha ; | & le ; & beta ; | ) с использованием правил , как X A → A X , который можно рассматривать как X прыжки через A . Для правильных контекстно-зависимых грамматик нужно разбить это на три этапа: X A → X A X , X A X → A A X , A A X → A X, в каждом производстве одна буква изменяется в соответствующем контексте. Требуется некоторое воображение, чтобы увидеть, что этот процесс не взаимодействует с другими частями деривации. Например, что происходит, когда на последнем шаге впервые участвует в другом шаге деривации?
Это может не работать для очень коротких слов, когда имеется больше информации, чем доступных позиций. Самое простое решение этого - игнорировать короткие строки в вашей конструкции и генерировать их отдельно.
Краткий ответ по умолчанию: придумайте LBA, который принимает язык, и используйте симуляцию, используемую для доказательства того, что контекстно-зависимые грамматики и LBA определяют один и тот же набор языков. Но это, конечно, не то, что вы после.
В этом конкретном случае попытайтесь использовать правую линейную грамматику для дважды, один для левой и один для правой половины. Все, что вам нужно, это убедиться, что обе грамматики выводятся «синхронно».
Это может быть сделано путем обмена токеном управления. То есть левые грамматики выбирают правило, генерируют соответствующий токен управления и передают его правильной грамматике. Правильная грамматика видит токен управления и выполняет правило подбора. Обратите внимание, что вы также можете реализовать двустороннюю связь, но здесь это не обязательно.
Есть одна проблема с контекстно-зависимыми грамматиками: они никогда не могут удалять нетерминалы (кроме если в языке есть пустое слово). Следовательно, мы должны создавать столько нетерминалов, сколько нам нужно; ни один не может быть избыточным.
Один из способов добиться этого - использовать тот же прием, что и для определенных доказательств LBA: сначала сгенерируйте все нетерминалы, которые вам понадобятся , то есть подготовьте «ленту». Позже, "передвигаться" на этой ленте. Только "в конце", замените все нетерминалы на терминалы.
Итак, пусть с Σ = { a , b } (конструкция легко распространяется на большие алфавиты) и N , δ, заданные следующими правилами.
правила для генерации «ленты». Обратите внимание, что шляпа обозначает «положение головы», а индексыl,rобозначают, к какой половине слова относится нетерминал. Короткие слова генерируются таким образом, чтобы сохранить некоторые правила ниже. Теперь нам нужны правила для получения одного символа в левой части:
для всех(α,γ)∈Σ2. Обратите внимание, как мы используем верхний индекс для переноса сгенерированного символа вправо. XaиXbявляются «конечными» нетерминалами, которые будут использоваться только для перемещения токена управления и последующего получения терминалов. Кроме того, обратите внимание, что второе правило (только) используется для последнего символа правой половины. Для перемещения переноса в правую половину мы должны пройти как оставшийсяXl, таки уже сгенерированныйXα:
for all . Note that the first rule is used for the first symbol of the right half, and that the last rule can only be used for the very last symbol, otherwise the derivation never terminates. Now we only need the terminating rules
for all and we are done. These rules, too, can only be applied after everything (to the left) is done, otherwise the derivation will not terminate.
Note that this grammar is ambiguous. Not only can can (safely) be applied anywhere to the left of the left "head" at any time, but there can also be multiple carries underway at the same time. Since they can never overtake each other the correct order is maintained.
One remark has to be made still: above grammar is not context-sensitive as many rules changes both of the symbols on the left-hand side. This is not allowed for context-sensitive grammars. Luckily, we can simulate any rule of the form
by
so we are good and can work with the smaller grammar. Showing that interference between multiple such simulations does not hurt is left as an exercise.
Do you see how to extend this to ? Does it also work for ? Can you use the same construction for any for regular ?
Although I don't know how the context-sensitive grammar will look like, you can circumvent your problem with the symbol as follows.
You know that your concatenated words must be at least of length . Hence, you could simply "encode" those -rules of your grammar by some rules like:
Though, I cannot yet see the overall solution, because to my mind it seems like your left-hand sides of your grammar rules potentially get arbitrarily long, because I think you would try to consider the prefixes of somehow in your rules.