Построить КПК для дополнения

16

Мне интересно, возможно ли это вообще, так как . Поэтому КПК, который может отличить слово от остальной части вполне может принять его , что звучит противоречиво для меня. w { a n b n c nn 0 } { a b c }{anbncnn0}CFLw{anbncnn0}{abc}

Думаю, мне нужно воспользоваться недетерминированным характером КПК, но у меня нет идей. Если бы вы могли дать совет, я был бы очень признателен.

hauptbenutzer
источник
Интересный момент об этом кажется противоречивым. Действительно, контекстно-свободные языки не закрываются при принятии дополнения ... поэтому существует множество примеров неконтекстно-свободных языков, которые могут быть "приняты" в том смысле, в котором вы намекаете. Я не теоретик и, как таковая, не могу с этим смириться, но, может быть, кто-то другой может понять, почему это не то, о чем беспокоиться?
Patrick87
Обратите внимание, что это обобщает: дополнение является CFG. {aNбNсNdNеN}
sdcvvc
Похожий вопрос .
Рафаэль

Ответы:

15

Нет, это не зависит от контекста. Чтобы принять , вам нужно убедиться, что три числа равны. Чтобы принять a b c a n b n c n , вам просто нужно убедиться, что вы находитесь в одном из следующих трех случаев:aNбNсNa*б*с*aNбNсN

  1. Число s отличается от числа b s; илиaб
  2. Число s отличается от числа c s; илиaс
  3. Число s отличается от числа c s.бс

Запишите КПК для каждого из этих случаев, затем объедините их, недетерминированно перейдя к каждому из начального состояния.

Patrick87
источник
Я хорошо записал эти случаи, но мне не хватало идеи соединить их. Спасибо!
hauptbenutzer
4
На самом деле вам нужны только любые два случая.
sdcvvc
@sdcvvc Хороший вопрос. :)
Patrick87
Для различного числа символов, это может быть источником вдохновения: . Она должна быть простой , чтобы клей либо + на левой это или с + на правой и превратить это в КПК. Для сложного случая (который вам не нужен) S a S c | A | С ; A a B |SxSy|X|Y;Xx|xX;Yy|yYa+c+ . SaSc|A|C;AaB|aA;CBc|Cc;Bε|bB
Йонас Кёлкер