Контекстно-зависимая грамматика для языка слов, соединенных между собой


9

Я ищу контекстно-зависимую грамматику, которая описывает следующий язык: .Lзнак равно{весвес|вес{a,б}*,|вес|1}

У меня проблемы с тем, что никакие правила, такие как не разрешены, и поэтому я не могу поместить нетерминал, указывающий «середину» слова. Есть ли уловка в проблеме?Иксε


1
Скучный ответ: сформулируйте LBA и примените имитацию, используемую для доказательства того, что LBA и контекстно-зависимые грамматики одинаково эффективны.
Рафаэль

Ответы:


6

Действительно, есть простой прием, который позволяет вам добавлять дополнительную информацию в определенную позицию: просто замените букву рядом с позицией и отметьте ее информацией и исходной буквой.

В вашем примере есть нетерминал для середины, но, поскольку он не может быть удален, он также считается нормальной буквой. Таким образом, у нас есть две копии M a и M b для обозначения замененных букв. В конце деривации маркеры должны быть заменены содержимым их букв на простые произведения, такие как M aa .MMaMбMaa

В большинстве случаев применение необходимо выполнить в конце процесса деривации. В некоторых конструкциях это не нужно «синхронизировать»: когда M исчезает слишком рано, деривация не может найти правильную позицию, и процесс не будет успешно остановлен. В других случаях нужен некий контроль. Иногда это делается введением нетерминала как сигнала, который движется вдоль букв. Опять же, этот сигнал должен также нести терминал, иначе вы столкнетесь с теми же проблемами.MaaM

Перемещение информации вокруг легко в так называемых монотонных грамматик ( ; с | & alpha ; | & le ; & beta ; | ) с использованием правил , как X A A X , который можно рассматривать как X прыжки через A . Для правильных контекстно-зависимых грамматик нужно разбить это на три этапа: X A X A X , X A XA A X , A A XA Xαβ|α|β|ИксAAИксИксAИксAИксAИкс,ИксAИксAAИкс,AAИксAИкс, в каждом производстве одна буква изменяется в соответствующем контексте. Требуется некоторое воображение, чтобы увидеть, что этот процесс не взаимодействует с другими частями деривации. Например, что происходит, когда на последнем шаге впервые участвует в другом шаге деривации?A

Это может не работать для очень коротких слов, когда имеется больше информации, чем доступных позиций. Самое простое решение этого - игнорировать короткие строки в вашей конструкции и генерировать их отдельно.


Разве это не потребовало бы, чтобы производственный процесс рассматривался в определенном порядке, чтобы Ma → a не использовался до перестановки нетерминалов до конца? Или я что-то упустил?
MrBolton

Я добавил примечание к этому в своем ответе. В некоторых решениях применение такого производства слишком рано приведет к форме предложения, которая не может быть успешно завершена. В других случаях производства должны быть тщательно синхронизированы. Дело здравого смысла и проб и ошибок.
Хендрик Ян

1

Краткий ответ по умолчанию: придумайте LBA, который принимает язык, и используйте симуляцию, используемую для доказательства того, что контекстно-зависимые грамматики и LBA определяют один и тот же набор языков. Но это, конечно, не то, что вы после.

В этом конкретном случае попытайтесь использовать правую линейную грамматику для дважды, один для левой и один для правой половины. Все, что вам нужно, это убедиться, что обе грамматики выводятся «синхронно».Σ*

Это может быть сделано путем обмена токеном управления. То есть левые грамматики выбирают правило, генерируют соответствующий токен управления и передают его правильной грамматике. Правильная грамматика видит токен управления и выполняет правило подбора. Обратите внимание, что вы также можете реализовать двустороннюю связь, но здесь это не обязательно.

Есть одна проблема с контекстно-зависимыми грамматиками: они никогда не могут удалять нетерминалы (кроме если в языке есть пустое слово). Следовательно, мы должны создавать столько нетерминалов, сколько нам нужно; ни один не может быть избыточным.Sε

Один из способов добиться этого - использовать тот же прием, что и для определенных доказательств LBA: сначала сгенерируйте все нетерминалы, которые вам понадобятся , то есть подготовьте «ленту». Позже, "передвигаться" на этой ленте. Только "в конце", замените все нетерминалы на терминалы.

Итак, пусть с Σ = { a , b } (конструкция легко распространяется на большие алфавиты) и N , δ, заданные следующими правилами.гзнак равно(N,Σ,δ,S)Σзнак равно{a,б}Nδ

правила для генерации «ленты». Обратите внимание, что шляпа обозначает «положение головы», а индексыl,rобозначают, к какой половине слова относится нетерминал. Короткие слова генерируются таким образом, чтобы сохранить некоторые правила ниже. Теперь нам нужны правила для получения одного символа в левой части:SX^lSXraaaaababbababbbbaabbεSXlSXrXlX^r

l,r

для всех(α,γ)Σ2. Обратите внимание, как мы используем верхний индекс для переноса сгенерированного символа вправо. XaиXbявляются «конечными» нетерминалами, которые будут использоваться только для перемещения токена управления и последующего получения терминалов. Кроме того, обратите внимание, что второе правило (только) используется для последнего символа правой половины. Для перемещения переноса в правую половину мы должны пройти как оставшийсяXl, таки уже сгенерированныйXα:X^lXlXγX^lγX^lXαXγXαγ

(α,γ)Σ2XaXb

XlXα

X^lγXlX^lXlγX^lγXαX^lXαγXlγXlXlXlγXlγXαXlXαγXαγXβXαXβγ

(α,β,γ)Σ3

XlγX^rXlX^rγXαγX^rXαX^rγX^rγXrXγX^rX^rγXγ

for all (α,γ)Σ2. 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

Xαα

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 Xαα (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 R of the form

ABCD

by

ABAYRAYRXRYRXRYRXRDXRDCD

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 Lk={wkwΣ}? Does it also work for L=i1Lk? Can you use the same construction for any Lk for regular L?


0

Although I don't know how the context-sensitive grammar will look like, you can circumvent your problem with the symbol X as follows.

You know that your concatenated words w must be at least of length |w|1. Hence, you could simply "encode" those ε-rules of your grammar by some rules like:

aXaaa,  aXbab,  bXaba,  bXbbb

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 w somehow in your rules.


However, using @hendrik-jan 's approach saves you two rules.
Rmn
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.