Я ищу контекстно-зависимую грамматику, которая описывает следующий язык: .
У меня проблемы с тем, что никакие правила, такие как не разрешены, и поэтому я не могу поместить нетерминал, указывающий «середину» слова. Есть ли уловка в проблеме?
Я ищу контекстно-зависимую грамматику, которая описывает следующий язык: .
У меня проблемы с тем, что никакие правила, такие как не разрешены, и поэтому я не могу поместить нетерминал, указывающий «середину» слова. Есть ли уловка в проблеме?
Ответы:
Действительно, есть простой прием, который позволяет вам добавлять дополнительную информацию в определенную позицию: просто замените букву рядом с позицией и отметьте ее информацией и исходной буквой.
В вашем примере есть нетерминал для середины, но, поскольку он не может быть удален, он также считается нормальной буквой. Таким образом, у нас есть две копии M a и M b для обозначения замененных букв. В конце деривации маркеры должны быть заменены содержимым их букв на простые произведения, такие как M a → a .M Ma Mб Ma→ а
В большинстве случаев применение необходимо выполнить в конце процесса деривации. В некоторых конструкциях это не нужно «синхронизировать»: когда M исчезает слишком рано, деривация не может найти правильную позицию, и процесс не будет успешно остановлен. В других случаях нужен некий контроль. Иногда это делается введением нетерминала как сигнала, который движется вдоль букв. Опять же, этот сигнал должен также нести терминал, иначе вы столкнетесь с теми же проблемами.Ma→ а 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α → β | α | ≤β| ИксA → A X Икс A ИксA → XAИкс, XAИкс→ A AИкс, A AИкс→ A X , в каждом производстве одна буква изменяется в соответствующем контексте. Требуется некоторое воображение, чтобы увидеть, что этот процесс не взаимодействует с другими частями деривации. Например, что происходит, когда на последнем шаге впервые участвует в другом шаге деривации?A
Это может не работать для очень коротких слов, когда имеется больше информации, чем доступных позиций. Самое простое решение этого - игнорировать короткие строки в вашей конструкции и генерировать их отдельно.
источник
Краткий ответ по умолчанию: придумайте LBA, который принимает язык, и используйте симуляцию, используемую для доказательства того, что контекстно-зависимые грамматики и LBA определяют один и тот же набор языков. Но это, конечно, не то, что вы после.
В этом конкретном случае попытайтесь использовать правую линейную грамматику для дважды, один для левой и один для правой половины. Все, что вам нужно, это убедиться, что обе грамматики выводятся «синхронно».Σ*
Это может быть сделано путем обмена токеном управления. То есть левые грамматики выбирают правило, генерируют соответствующий токен управления и передают его правильной грамматике. Правильная грамматика видит токен управления и выполняет правило подбора. Обратите внимание, что вы также можете реализовать двустороннюю связь, но здесь это не обязательно.
Есть одна проблема с контекстно-зависимыми грамматиками: они никогда не могут удалять нетерминалы (кроме если в языке есть пустое слово). Следовательно, мы должны создавать столько нетерминалов, сколько нам нужно; ни один не может быть избыточным.S→ ε
Один из способов добиться этого - использовать тот же прием, что и для определенных доказательств LBA: сначала сгенерируйте все нетерминалы, которые вам понадобятся , то есть подготовьте «ленту». Позже, "передвигаться" на этой ленте. Только "в конце", замените все нетерминалы на терминалы.
Do you see how to extend this toLk={wk∣w∈Σ∗} ? Does it also work for L=⋃i≥1Lk ? Can you use the same construction for any Lk for regular L ?
источник
Although I don't know how the context-sensitive grammar will look like, you can circumvent your problem with the symbolX as follows.
You know that your concatenated wordsw must be at least of length |w|≥1 .
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 ofw somehow in your rules.
источник