Vous pouvez essayer d'utiliser des automates pushdown. Étant donné un automate de refoulement pour la langue d'origine, nous en construisons un pour le décalage cyclique. Le nouvel automate fonctionne en deux étapes, correspondant à la partie et du mot (où est dans la langue d'origine). Dans la première étape, chaque fois que l'automate souhaite pop un non-terminal A , celle - ci peut pousser un non-terminal A » ; l'idée est qu'à la fin de la première étape, la pile contiendrait, dans l'ordre inverse, les symboles qui se trouvent dans la pile après lecture de x par l'automate d'origine. Dans la deuxième étape (l'interrupteur est non-déterministe), au lieu de pousser un non-terminal Ay x y x x y A A ′ x AyxyxxyAA′xA, Nous sommes autorisés à sauter un non-terminal A ′A′ . Si l'automate d'origine peut en effet générer la pile lors de la lecture de Xx , alors le nouveau pourrait exactement éclater la pile entière.
Edit: Voici quelques détails supplémentaires. Supposons que l'on nous donne un PDA avec l'alphabet , un ensemble d'états , un ensemble d'états accepteurs , des non-terminaux , un état initial et un ensemble de transitions autorisées. Chaque transition autorisée est de la forme , ce qui signifie que lorsqu'elle est dans l'état , à la lecture d' (ou , auquel cas c'est une transition libre), si le haut de la pile est (ou , ce qui signifie que la pile est vide), alors le PDA peut (c'est un modèle non déterministe) passer à l'état , en remplaçantΣ 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 avec .α∈Γ∗
Le nouveau PDA a un nouveau non terminal pour chaque . Pour tous les deux états et , il y a deux états . Les états de départ (l'état de départ réel est choisi de manière non déterministe parmi eux via -transitions) sont . Pour chaque transition il y a des transitions correspondantes et . Il existe également d'autres transitions.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),α)
Pour chaque transition , il y a des transitions , où et . Pour chaque état final , il y a des transitions , où .( 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′A′α)B∈Γ∪{ϵ}ϵ′=ϵq∈Fq ″ , 1 ) , ϵ , A , ( q 0 , q ″ , 2 , ϵ ) , A ) A ∈ Γ ∪ { ϵ }((q,q′′,1),ϵ,A,(q0,q′′,2,ϵ),A)A∈Γ∪{ϵ}
Pour chaque transition , il y a des transitions , où . Pour chaque transition , il y a des transitions , où . Pour chaque transition , il existe des "transitions généralisées" ; ceux-ci sont implémentés comme une séquence de deux transitions à travers un nouvel état intermédiaire. Transitions\ alpha) avec( 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,q′′,2,C),a,B′A,(q,q′′,2,C),ϵ)(q,a,ϵ,q′,α)(q,a,ϵ,q′,α)|α|≥2|α|≥2sont traités de la même manière. Pour chaque transition , il y a des transitions , où . Les transitions sont gérées de la même manière. Enfin, il existe un seul état final , et des transitions .(q,a,A,q′,A)(q,a,A,q′,A)((q,q″,2,A),a,B,(q′,q″,2,A),B)((q,q′′,2,A),a,B,(q′,q′′,2,A),B)B∈Γ′∪{ϵ}B∈Γ′∪{ϵ}(q,a,A,q′,Aα)(q,a,A,q′,Aα)ff((q,q,2,A),ϵ,ϵ,f,ϵ)((q,q,2,A),ϵ,ϵ,f,ϵ)
(Il peut y avoir quelques transitions que j'ai manquées, et certains des détails que j'omets sont quelque peu désordonnés.)
Rappelons que nous essayons d'accepter un mot , où est accepté par le PDA d'origine. Un état signifie que nous sommes à l'étape 1, à l'état , et le PDA d'origine est à l'état après avoir lu . Un état est similaire, où correspond au dernier qui a été sauté. À l' étape 1, nous sommes autorisés à pousser au lieu de sauter . Nous le faisons pour chaque non-terminal qui est produit lors du traitement de , mais uniquement surgi lors du traitement de . À l'étape 2, nous sommes autorisés à faire éclateryxyxxyxy(q,q′,1)(q,q′,1)qqq′q′xx(q,q′,2,A)(q,q′,2,A)AAA′A′A′A′AAxxyyA′A′au lieu de pousser . Si nous faisons cela, alors nous devons nous rappeler que le haut de stock est vraiment ; cela ne s'applique que lorsqu'il n'y a pas de choses "temporaires" sur la pile, ce qui dans le PDA simulé est le même que le haut de la pile étant ou de la forme .AAAAϵϵB′B′
Voici un exemple simple. Considérons un automate pour qui pousse pour chaque et fait apparaître pour chaque . Le nouvel automate accepte les mots de deux formes: et . Pour les mots de la première forme, étape 1 consiste à pousser fois«étape 2 consiste à éclater fois , poussant fois et éclater fois . Pour les mots de la deuxième forme, nous poussons d'abord foisxnynxnynAAxxAAyyykxnyn−kykxnyn−kxkynxn−kxkynxn−kkkA′A′kkA′A′n−kn−kAAn−kn−kAAkkAA, puis pop fois , poussez fois , passez à l'étape 2 et pop fois .kkAAn−kn−kA′A′n−kn−kA′A′
Voici un exemple plus compliqué, pour le langage des parenthèses équilibrées de différents types ("()", "[]", "<>") de sorte que les descendants immédiats de chaque type de parenthèses doivent appartenir à un type différent. Par exemple, "([] <>)" est OK mais "()" est faux. Pour chaque « ( », nous poussons si le haut de la pile n'est pas , pour chaque « ) », nous pop . De même, , sont associés à "[]" et "<>". Voici comment nous acceptons le mot ">) ([()] <". Nous consommons ">)", en poussant et en passant à l'étape 2. Nous consommons "(", poppinget rappelant le haut de la pile . Nous consommons "[()]", poussant et éclatant ; en poussantAA AAAABBCCC′A′C′A′A′A′AABABAB , nous savons que le "vrai" sommet de la pile est , et les crochets sont donc autorisés (nous ne serions pas dupes de ">) (() <"); en poussant , puisque le haut de la pile est (qui n'est pas ou de la forme ), alors nous savons que est aussi le "vrai" haut de la pile, et donc les parenthèses rondes sont autorisées (même si le sommet de la pile de l'ombre est ). Enfin, nous consommons "<" et pop .AABϵX′BAC′