Możesz spróbować użyć automatów pushdown. Biorąc pod uwagę automatyczny system przesunięcia dla oryginalnego języka, konstruujemy jeden dla cyklicznego przesunięcia. Nowy automat działa w dwóch etapach, odpowiadających części i słowa (gdzie jest w oryginalnym języku). W pierwszym etapie, ilekroć automat chciałby otworzyć nie-terminal , może zamiast tego naciskać na nie-terminal ; Chodzi o to, że na końcu pierwszego etapu stos będzie zawierał w odwrotnej kolejności symbole, które zostaną znalezione na stosie po odczytaniu przez oryginalny automat. W drugim etapie (przełącznik nie jest deterministyczny), zamiast naciskać nieterminalnyy yx xy x yxx y xyA AA ′A′ x xAA, wolno nam wyskoczyć z terminala . Jeśli oryginalny automat rzeczywiście może wygenerować stos po odczytaniu , nowy byłby w stanie dokładnie zniszczyć cały stos.A ′A′ xx
Edycja: Oto kilka dodatkowych szczegółów. Załóżmy, że otrzymaliśmy PDA z alfabetem , zestawem stanów , zestawem stanów akceptujących , nieterminowymi , stanem początkowym i zestawem dopuszczalnych przejść. Każde dopuszczalne przejście ma postać , co oznacza, że w stanie , po odczytaniu (lub , w którym to przypadku jest to przejście swobodne), jeśli na szczycie stosu znajduje się (lub , co oznacza, że stos jest pusty), wówczas PDA może (to model niedeterministyczny) przejść do stanu , zastępującΣ 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 z .α∈Γ∗
Nowy PDA ma nowy nieterminalny dla każdego . Dla każdego z dwóch stanów i istnieją dwa stany . Stany początkowe (rzeczywisty stan początkowy jest wybierany spośród nich niedeterministycznie za pomocą -transitions) to . Dla każdego przejścia istnieją odpowiednie przejścia i . Istnieją również inne przejścia.A ′ A ∈ Γ q , q ′ ∈ Q A ∈ Γ ∪ { ϵ } ( q , q ′ , 1 ) , ( q , q ′ , 2 , A ) ϵ ( q , q , 1 ) ( q , a , A , q ′ , α ) ( ( q ,A′A∈Γq,q′∈QA∈Γ∪{ϵ}(q,q′,1),(q,q′,2,A)ϵ(q,q,1)(q,a,A,q′,α)q ″ , 1 ) , a , A , ( q ′ , q ″ , 1 ) , α ) ( ( q , q ″ , 2 , B ) , a , A , ( q ′ , q ″ , 2 , B ) , α )((q,q′′,1),a,A,(q′,q′′,1),α)((q,q′′,2,B),a,A,(q′,q′′,2,B),α)
Dla każdego przejścia istnieją przejścia , gdzie i . Dla każdego stanu końcowego istnieją przejścia , gdzie .( q , a , A , q ′ , α ) ( ( q , q ″ , 1 ) , a , B ′ , ( q ′ , q ″ , 1 ) , B ′ A ′ α ) B ∈ Γ ∪ { ϵ } ϵ ′ = ϵ q ∈ F ( ( q ,( q, a , A , q′, α )( ( q, q′ ′, 1 ) , a , B′, ( q′, q′ ′, 1 ) , B′ZA′α )B ∈ Γ ∪ { ϵ }ϵ′= ϵq∈ F.q ″ , 1 ) , ϵ , A , ( q 0 , q ″ , 2 , ϵ ) , A ) A ∈ Γ ∪ { ϵ }( ( q, q′ ′, 1 ) , ϵ , A , ( q0, q′ ′, 2 , ϵ ) , A )A ∈ Γ ∪ { ϵ }
Dla każdego przejścia istnieją przejścia , gdzie . Dla każdego przejścia istnieją przejścia , gdzie . Dla każdego przejścia istnieją „przejścia uogólnione” ; są one realizowane jako sekwencja dwóch przejść przez nowy stan pośredni. Przejścia\ alpha) z( q , a , ϵ , q ′ , α ) ( ( q , q ″ , 2 , A ) , a , B ′ , ( q ′ , q ″ , 2 , A ) , B ′ α ) A ∈ Γ ∪ { ϵ } ( q , a , ϵ , q ′( q,a,ϵ,q′,α)((q,q′′,2,A),a,B′,(q′,q′′,2,A),B′α)A∈Γ∪{ϵ}, A ) ( ( q , q ″ , 2 , B ) , a , A ′ , ( q ′ , q ″ , 2 , A ) , ϵ ) B ∈ Γ ∪ { ϵ } ( q , a , A , q ′ , B ) ( ( q , q ″ , 2(q,a,ϵ,q′,A)((q,q′′,2,B),a,A′,(q′,q′′,2,A),ϵ)B∈Γ∪{ϵ}(q,a,A,q′,B), C ) , a , B ′ A , ( q , q ″ , 2 , C ) , ϵ ) ( q , a , ϵ , q ′ , α ) | α | ≥ 2 ( q , a , A , q ′ , A ) ( ( q , q ″ , 2 ,((q,q′′,2,C),a,B′A,(q,q′′,2,C),ϵ)(q,a,ϵ,q′,α)|α|≥2są traktowane podobnie. Dla każdego przejścia istnieją przejścia , gdzie . Przejścia są obsługiwane podobnie. Wreszcie istnieje jedyny stan końcowy i przejścia .(q,a,A,q′,A)A ) , a , B , ( q ′ , q ″ , 2 , A ) , B ) B ∈ Γ ′ ∪ { ϵ } ( q , a , A , q ′ , A α ) f ( ( q , q , 2 , A ) , ϵ , ϵ , f , ϵ( ( q, q′ ′, 2 , A ) , a , B , ( q′, q′ ′, 2 , A ) , B )B∈Γ′∪{ϵ}(q,a,A,q′,Aα)f)((q,q,2,A),ϵ,ϵ,f,ϵ)
(Może być kilka przejść, które przegapiłem, a niektóre szczegóły, które pomijam, są nieco niechlujne).
Przypomnijmy, że próbujemy zaakceptować słowo , gdzie jest akceptowane przez oryginalny PDA. Stan oznacza, że jesteśmy na etapie 1, w stanie , a oryginalny PDA jest w stanie po odczytaniu . Stan jest podobny, gdzie odpowiada ostatniemu który został przerwany. W etapie 1, wolno nam wcisnąć zamiast popping . Robimy to dla każdego nieterminala, który jest generowany podczas przetwarzania , ale pojawiał się tylko podczas przetwarzania . Na etapie 2 możemy popy x x y ( q , q ′ , 1 ) q q ′ x ( q , q ′ , 2 , A ) A A ′ A ′ A x y A ′ A A ϵ B ′yxxy(q,q′,1)qq′x(q,q′,2,A)AA′A′AxyA′zamiast pchania . Jeśli to zrobimy, musimy pamiętać, że na szczycie jest naprawdę ; dotyczy to tylko sytuacji, gdy na stosie nie ma „tymczasowych” rzeczy, które w symulowanym PDA są takie same, jak na szczycie stosu lub w formie .AAϵB′
Oto prosty przykład. Rozważ automat dla który popycha dla każdego i wyskakuje dla każdego . Nowy automat akceptuje słowa dwóch form: i . Dla słów pierwszej postaci, etap 1 składa się z pchania razy„etap 2 składa się pojawiały razy , spychając razy i popping razy . W przypadku słów drugiej formy najpierw wciskamy razyx n y n A x A y y k x n y n - k x k y n x n - k k A ′ k A ′ n - k A n - k A k A k A n - k A ′ n - k A ′xnynAxAyykxnyn−kxkynxn−kkA′kA′n−kAn−kAkA, następnie pop razy , push razy , przejście do etapu 2 i pop razy .kAn−kA′n−kA′
Oto bardziej skomplikowany przykład dla języka zrównoważonych nawiasów różnych typów („()”, „[]”, „<>”) tak, że bezpośredni potomkowie każdego typu nawiasów muszą należeć do innego typu. Na przykład „([] <>)” jest OK, ale „()” jest błędne. Dla każdego "(" my pchamy jeśli top-of-stos nie jest dla każdego ")", mamy pop . Podobnie , są powiązane z „[]” i „<>”. Oto, w jaki sposób akceptujemy słowo „>) ([()] <”. Używamy „>)”, przesuwając i przechodząc do etapu 2. konsumujemy „(”, otwierająci pamiętając górnej krawędzi stosu . Używamy „[()]”, popychając i popping ; podczas pchaniaA A A B C C ′ A ′ A ′ A B A B A AA AABCC′A′A′ABAB , jesteśmy świadomi, że „prawdziwym” szczytem stosu jest , więc nawiasy kwadratowe są dozwolone (nie dałoby się nam oszukać „>) (() <”); kiedy pchasz , ponieważ górą stosu jest (która nie jest ani formy ), to wiemy, że jest również „prawdziwym” szczytem stosu, więc okrągłe nawiasy są dozwolone (nawet jeśli cień na szczycie stosu to ). Wreszcie konsumujemy „<” i pop .AA B ϵ X ′ B A C ′BϵX′BAC′