Контекстно-свободной грамматики для некурящих палиндром
мне нужен CFG, который будет генерировать строки, отличные от палиндромов. Решение было представлено и приводится ниже.(Введение в теорию вычислений-Sipser)
R -> XRX | S
S -> aTb | bTa
T -> XTX | X | <epsilon>
X -> a | b
Я получаю общее представление о том, как эта грамматика работает. Он требует вставки подстроки, которая имеет соответствующие неравные алфавиты на своей половине, через производство S -> aTb | bTa
, таким образом гарантируя, что палиндром не может быть создан.
Я запишу семантику первые две постановки, как я понял,
-
S
генерирует строки, которые не могут быть палиндромами, потому что их 1-й и последний алфавиты не равны -
R
состоит по крайней мере из одногоS
как подстрока сделать это не палиндром.
Я не совсем понимаю семантику третьей постановки, т. е.
T -> XTX | X | <epsilon>
X -> a | b
как я вижу, T может генерировать любую комбинацию a и b, т. е. {a, b}*. Почему это не было
T -> XT | <epsilon>
X -> a | b
разве аналог? Поскольку последнее более интуитивно, почему оно не используется?
5 ответов
конструкция книга, которую я считаю, показывает некоторую симметрию для лучшего чтения.
Это означает, что он сначала строит что-нибудь, т. Затем есть обертка S, так что она больше не становится палиндромом S, а затем строит все на ней.
последнее может показаться интуитивным. Однако, если вы подумаете об определении или построении палиндрома, вы можете понять, почему писать таким образом имеет смысл.
Если у вас есть палиндром, вы бы построить что-то вроде этого!--1-->
T -> aTa | bTb | a | b / epsilon
и если мы хотим нарушить конструкцию, нам просто нужно убедиться, что один слой выглядит так (я использую T, чтобы быть одним слоем и S К чему-то на один шаг после T)
S - > aTb
и другой слой нам вообще все равно
S -> aTa | aTb | bTa / bTb
Так что образует внутренний слой (T) и внешний слой (R) и слой, который нарушает конструкцию палиндрома(ов). Даже мысль T кажется избыточной, но она образует подобную конструкцию, как R, выражая тем самым намерение конструкции.
определение T
в этом Граммер действительно кажется ненужным усложнением. T
может генерировать любую строку a
s и b
s, поэтому более простое определение было бы так же хорошо.
ОРИГИНАЛЬНЫЙ НЕПРАВИЛЬНЫЙ ОТВЕТ:
они не эквивалентны, потому что X
сама по себе не может быть <epsilon>
и T
не любая комбинация a
и b
. T
может расширяться только до палиндрома (включая пустой палиндром, один символ или палиндром с непарным центральным символом).
если X
может быть пустым, тогда T
может расширяться до чего угодно, но не может.
Примечание
этот ответ основан на предположении, что намерение автора для постановки T -> XTX
это два идентичные не-терминалы в подстановке должны представлять одинаковые строки символов. Поскольку у меня нет текста, чтобы посмотреть, я не знаю, является ли это предположение обоснованным, за исключением того, что оно мотивировано самим вопросом. Это предположение может быть ошибкой автора, если это не относится к другим случаям. Я думаю, что в целом это требование не относится к контекстно-свободным грамматикам.
правильными постановками были бы:
R -> aRa | bRb | S
S -> aTb | bTa
T -> aTa | bTb | a | b | <epsilon>
лучший способ гарантировать, что у вас есть грамматику, которая генерирует только палиндромы заключается в следующем: Определить:
- Pal-язык палиндромов
- {a, b}* - язык, содержащий все строки над алфавитом {a, b}
- Non-Pal-язык всех строк, которые не являются палиндромами (т. е. не в Pal)
наблюдатель, что non-Pal = {a, b}* - Pal
грамматика для PAL это знать, чтобы быть следующий:
- S - > лямбда | a | b | aSa / bSb
грамматика для {a, b}* может быть записана следующим образом:
- S - > лямбда | Sa | Sb
теперь, чтобы построить грамматику non-Pal, соблюдайте следующее:
- Если x является элементом non-Pal, то:
- axa является элементом non-Pal
- bxb является элементом non-Pal
- если y является элементом {a, b}* затем:
- ayb является элементом non-Pal
- bya является элементом non-Pal
объединение всей этой информации грамматика для non-Pal будет:
- S - > aSa | bSb | aAb / bAa
- A - > лямбда | Aa | Ab
Я надеюсь, что это проясняет вещи
Я нашел это определение не-палиндрома довольно интуитивным. Я предполагаю, что автор началось с определения палиндрома
R -> aRa | bRb | a | b | <epsilon>
а теперь спросили, как это определение можно "испортить".
то есть он развернул определение три раза, обменялся одним aRa | bRb
by aRb | bRa
и обобщил остальные производства на (a|b)R(a|b)
.
любой Non палиндром можно разделить вдоль середины , такой, что x (k) != x (k+ n)
n= половина длины x (i) = символ в i-й позиции
имея это в виду, простое решение было бы
R -> aRa | bRb | T
T -> aSb | bSa
S -> aRa | bRb | a | b | T | episoln
Он может генерировать все палиндромы