Ви можете спробувати скористатись автоматичними розгортаннями. Враховуючи автоматичний віджимання для мови оригіналу, ми побудуємо його для циклічного зсуву. Новий автомат працює у два етапи, що відповідає і частині слова (де - мовою оригіналу). На першому етапі, коли автомат хотів би спливати нетермінальний , він може замість цього натиснути нетермінальний ; ідея полягає в тому, що в кінці першого етапу стек міститиме в зворотному порядку символи, які знаходять у стеку після читання оригінальним автоматом. На другій стадії (вимикач недетермінований) замість натискання нетермінальногоx y x x y A A ′ x A A ′ xyxyxxyAA′xA, нам дозволено спливати нетермінальний . Якщо оригінальний автомат справді може генерувати стек при прочитанні , то новий міг би точно викласти весь стек.A′x
Редагувати: Ось ще кілька деталей. Припустимо, нам дають PDA з алфавітом , набором станів , набором станів , нетерміналами , початковим станом та набором допустимих переходів. Кожен допустимий перехід має вигляд , тобто в стані , читаючи (або ; у такому випадку це вільний перехід), якщо вершиною стека є (або , що означає, що стек порожній), тоді PDA може (це недетермінована модель) перейти до стану , замінюючиQ F Γ q 0 ( q , a , A , q ′ , α ) q a ∈ A a = ϵ A ∈ Γ A = ϵ q ′ A α ∈ Γ ∗ΣQFΓq0(q,a,A,q′,α)qa∈Aa=ϵA∈ΓA=ϵq′A з .α∈Γ∗
Новий КПК має новий нетермінальний для кожного . Для кожного двох станів та існують два стани . Вихідні стани (фактичний вихідний стан вибирається серед них не детерміновано через -переходи) . Для кожного переходу є відповідні переходи і . Є й інші переходи.A′A∈Γq,q′∈QA∈Γ∪{ϵ}(q,q′,1),(q,q′,2,A)ϵ(q,q,1)(q,a,A,q′,α)((q,q′′,1),a,A,(q′,q′′,1),α)((q,q′′,2,B),a,A,(q′,q′′,2,B),α)
Для кожного переходу існують переходи , де і . Для кожного остаточного стану є переходи , де .(q,a,A,q′,α)((q,q′′,1),a,B′,(q′,q′′,1),B′A′α)B∈Γ∪{ϵ}ϵ′=ϵq∈F((q,q′′,1),ϵ,A,(q0,q′′,2,ϵ),A)A∈Γ∪{ϵ}
Для кожного переходу існують переходи , де . Для кожного переходу існують переходи , де . Для кожного переходу існують "узагальнені переходи" ; вони реалізуються як послідовність двох переходів через проміжний новий стан. Переходи\ альфа) з(q,a,ϵ,q′,α)((q,q′′,2,A),a,B′,(q′,q′′,2,A),B′α)A∈Γ∪{ϵ}(q,a,ϵ,q′,A)((q,q′′,2,B),a,A′,(q′,q′′,2,A),ϵ)B∈Γ∪{ϵ}(q,a,A,q′,B)((q,q′′,2,C),a,B′A,(q,q′′,2,C),ϵ)(q,a,ϵ,q′,α)|α|≥2обробляються аналогічно. Для кожного переходу існують переходи , де . Переходи обробляються аналогічно. Нарешті, існує єдиний остаточний стан та переходи .(q,a,A,q′,A)((q,q′′,2,A),a,B,(q′,q′′,2,A),B)B∈Γ′∪{ϵ}(q,a,A,q′,Aα)f((q,q,2,A),ϵ,ϵ,f,ϵ)
(Можливо, я пропустив кілька переходів, і деякі деталі, які я опускаю, дещо безладні.)
Нагадаємо, ми намагаємось прийняти слово , де приймається оригінальним КПК. Стан означає, що ми перебуваємо на етапі 1, у стані , а початковий PDA знаходиться у стані після читання . Стан подібний, де відповідає останньому що вискочив. На етапі 1, ми маємо право висунути замість того , щоб плескати . Ми робимо це для кожного нетермінального, який виробляється при обробці , але тільки вискакується під час обробки . На другому етапі нам дозволено попyxxy(q,q′,1)qq′x(q,q′,2,A)AA′A′AxyA′замість того, щоб натискати . Якщо ми це робимо, тоді ми повинні пам’ятати, що топ-запас - це справді ; це застосовується лише тоді, коли на стеку немає «тимчасових» речей, які в модельованому КПК такі самі, як або форми .AAϵB′
Ось простий приклад. Розглянемо автомат для який висуває для кожного , і pops для кожного . Новий автомат приймає слова двох форм: і . Для слів першої форми, 1 -й ступені складається з штовхаючи раз«2 -й ступені складається з вискакують раз , штовхаючи раз , і вискакують раз . Для слів другої форми спочатку натискаємо разxnynAxAyykxnyn−kxkynxn−kkA′kA′n−kAn−kAkA, потім поп раз , натисніть раз , перехід до етапу 2 та pop разів .kAn−kA′n−kA′
Ось більш складний приклад для мови збалансованих дужок різних типів ("()", "[]", "<>"), що безпосередні нащадки кожного типу дужок повинні належати до іншого типу. Наприклад, "([] <>)" добре, але "()" неправильно. Для кожного «(», ми поміщаємо якщо стек топ-ні , для кожного «)», ми вискочити . Аналогічно , пов'язані з "[]" і "<>". Ось як ми приймаємо слово ">) ([()] <". ">)", натискаючи , і переходимо до етапу 2. Ми споживаємо "(", вискакуючиі запам'ятовування верхньої межі стека . Ми споживаємо "[()]", штовхаючи та вискакуючи ; при натисканніA AABCC′A′A′ABAB , ми усвідомлюємо, що "справжня" вершина стека - це , і тому квадратні дужки дозволені (нас би не обдурили ">) (() <"); при натисканні на , оскільки вершина стека - це (що не або форма ), то ми знаємо, що також "справжня" вершина стека, і тому круглі дужки дозволені (незважаючи на те, що тіньова вершина стека - ). Нарешті, ми споживаємо "<" і поп .AABϵX′BAC′