Контекстно-свободной грамматики для некурящих палиндром

мне нужен 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 может генерировать любую строку as и bs, поэтому более простое определение было бы так же хорошо.

ОРИГИНАЛЬНЫЙ НЕПРАВИЛЬНЫЙ ОТВЕТ:

они не эквивалентны, потому что 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

Он может генерировать все палиндромы