Формальное определение немного сложно разобрать, но вот что я получил от него:
- Этот язык имеет вид s1 @ s2 @ s3 ... @ sk
- Каждый из si представляет собой строку из 0 и 1
- Существует как минимум одна пара si, sj такая, что si = sj ^ R
Предполагается, что это языкнаша стратегия будет заключаться в том, чтобы сначала выполнить 3-е условие, затем 1-е, а затем 2-е. Для обеспечения 3-го нам потребуется ввести по крайней мере пару строк, которые являются инверсиями друг друга:
S -> 0S0 | 1S1
Это дает нам строки вида wSw ^ R. Теперь мы хотим иметь возможность добавлять другие строки в переднюю, среднюю или заднюю часть, разделенные @:
S -> 0S0 | 1S1
S -> T@S | S@T | @T@ | @
Наконец, нам нужно разрешить T генерировать строки из 0 и 1:
S -> 0S0 | 1S1
S -> T@S | S@T | @T@ | @
T -> 0T | 1T | e
Чтобы сгенерировать любую строку на языке:
- сначала сгенерируйте пару необходимых обратных строк, используя произведения в первой строке.
- добавьте любые другие строкислева с использованием первого произведения во второй строке.
- добавьте все остальные строки справа, используя второе производство во второй строке.
- добавьте все остальные строки в середину, используя третьюи четвертое производство во второй строке.
- заполните другие строки, используя производство в третьей строке.
КПК для этого языка может выполнять следующие действия:
- чтение (0 + 1) * @ в цикле
- недетерминированный переход в состояние, в котором вы предполагаете, что нашли первую из строк, необходимых для 3-го условия
- , когдаты прыгаешь, толкаешьстрока в стеке
- снова прочитать (0 + 1) * @ в цикле
- недетерминированно перейти в состояние, в котором, как вы предполагаете, вы нашли вторую из строк, необходимых для 3-го условия
- когда вы прыгаете, вытолкните строку из стека, чтобы проверить
- снова прочитать (0 + 1) * @ в цикле
Здесь вы делаете два недетерминированных предположения: во-первых, вы угадываете строку, которая будет иметь обратную сторону. Во-вторых, вы думаете, что нашли это. Если оба эти предположения были правильными (и они будут для любой строки в языке, по крайней мере, для одной пары из k (k + 1) / 2 предположений), тогда NPDA принимает.