Você pode tentar usar autômatos de empilhamento. Dado um autômato de empilhamento para o idioma original, construímos um para a mudança cíclica. O novo autômato opera em dois estágios, correspondendo à e à parte da palavra y x (onde x y está no idioma original). Na primeira etapa, o autómato sempre que gostaria de aparecer uma não-terminal de A , ela pode em vez empurrar um não-terminal de A ' ; a ideia é que, no final do primeiro estágio, a pilha contenha, em ordem inversa, os símbolos encontrados na pilha após a leitura de xyyxxyxxyAA′xpelo autômato original. Na segunda fase (o interruptor é não-determinístico), em vez de empurrar um não-terminal de AA , que estão autorizados a aparecer uma não-terminal de A 'A′ . Se o autômato original puder realmente gerar a pilha após a leitura de xx , o novo poderá exibir exatamente a pilha inteira.
Edit: Aqui estão mais alguns detalhes. Suponha que recebamos um PDA com alfabeto ΣΣ , conjunto de estados QQ , conjunto de estados aceitantes FF , não terminais ΓΓ , estado inicial q 0q0 e um conjunto de transições permitidas. Cada transição permitida é da forma ( q , a , A , q ′ , α )(q,a,A,q′,α) , o que significa que, quando no estado qq , ao ler a ∈ Aa∈A (ou a = ϵa=ϵ , nesse caso, é uma transição livre), se a parte superior da pilha é A ∈Γ (ou A = ϵ , o que significa que a pilha está vazia), o PDA pode (é um modelo não determinístico) passar para o estado q ′ , substituindo A por α ∈ Γ ∗ .A∈ΓA=ϵq′Aα∈Γ∗
O novo PDA tem um novo não-terminal de A ' para cada um ∈ y . Para cada dois estados q , q ′ ∈ Q e A ∈ Γ ∪ { ϵ } , existem dois estados ( q , q ′ , 1 ) , ( q , q ′ , 2 , A ) . Os estados iniciais (o estado inicial real é escolhido de forma não determinística entre eles via ϵ -transitions) são (A′A∈Γq,q′∈QA∈Γ∪{ϵ}(q,q′,1),(q,q′,2,A)ϵq , q , 1 ) . Para cada transição ( q , a , A , q ′ , α ) existem transições correspondentes ( ( q , q ″ , 1 ) , a , A , ( q ′ , q ″ , 1 ) , α ) e ( ( q , q ″ , 2 , B(q,q,1)(q,a,A,q′,α)((q,q′′,1),a,A,(q′,q′′,1),α)) , a , A , ( q ′ , q ″ , 2 , B ) , α ) . Existem outras transições também.((q,q′′,2,B),a,A,(q′,q′′,2,B),α)
Para cada transição ( q , a , A , q ′ , α ) , há transições ( ( q , q ″ , 1 ) , a , B ′ , ( q ′ , q ″ , 1 ) , B ′ A ′ α ) , onde B ∈ Γ ∪ { ϵ } e ϵ ′ =(q,a,A,q′,α)((q,q′′,1),a,B′,(q′,q′′,1),B′A′α)B∈Γ∪{ϵ}εϵ′=ϵ . Para cada estado final q ∈ Fq∈F , há transições ( ( q , q ″ , 1 ) , ϵ , A , ( q 0 , q ″ , 2 , ϵ ) , A )((q,q′′,1),ϵ,A,(q0,q′′,2,ϵ),A) , onde A ∈ Γ ∪ { ϵ }A∈Γ∪{ϵ} .
Para cada transição ( q , a , ϵ , q ′ , α ) , há transições ( ( q , q ″ , 2 , A ) , a , B ′ , ( q ′ , q ″ , 2 , A ) , B ′ α ) , onde A ∈ Γ ∪ { ϵ } . Para cada transição(q,a,ϵ,q′,α)((q,q′′,2,A),a,B′,(q′,q′′,2,A),B′α)A∈Γ∪{ϵ}( q , a , ϵ , q ′ , A )(q,a,ϵ,q′,A) , existem transições ( ( q , q ″ , 2 , B ) , a , A ′ , ( q ′ , q ″ , 2 , A ) , ϵ )((q,q′′,2,B),a,A′,(q′,q′′,2,A),ϵ) , onde B ∈ Γ ∪ { ϵ }B∈Γ∪{ϵ} . Para cada transição ( q , um, A , q ′ , B ) , existem "transições generalizadas" ( ( q , q ″ , 2 , C ) , a , B ′ A , ( q , q ″ , 2 , C ) , ϵ ) ; estes são implementados como uma sequência de duas transições através de um novo estado intermediário. Transições ( q , a , ϵ , q ′ ,(q,a,A,q′,B)((q,q′′,2,C),a,B′A,(q,q′′,2,C),ϵ)α )(q,a,ϵ,q′,α) com | α | ≥ 2|α|≥2 são tratados da mesma forma. Para cada transição ( q , a , A , q ′ , A )(q,a,A,q′,A) , há transições ( ( q , q ″ , 2 , A ) , a , B , ( q ′ , q ″ , 2 , A ) , B )((q,q′′,2,A),a,B,(q′,q′′,2,A),B) , onde B ∈Γ ′ ∪ { ϵ } . As transições ( q , a , A , q ′ , A α ) são tratadas de maneira semelhante. Finalmente, existe um único estado final f e transições ( ( q , q , 2 , A ) , ϵ , ϵ , f , ϵ ) .B∈Γ′∪{ϵ}(q,a,A,q′,Aα)f((q,q,2,A),ϵ,ϵ,f,ϵ)
(Pode haver algumas transições que eu perdi e alguns dos detalhes que estou omitindo são um pouco confusos.)
Lembre-se de que estamos tentando aceitar uma palavra y x , em que x y é aceito pelo PDA original. Um estado ( q , q ′ , 1 ) significa que estamos no estágio 1, no estado q , e o PDA original está no estado q ' após a leitura de x . Um estado ( q , q ' , 2 , A ) é semelhante, onde A corresponde ao último A ' que foi disparado. No estágio 1, podemos pressionar A ′yxxy(q,q′,1)qq′x( q,q′,2,A)AA′A′em vez de popping A . Fazemos isso para cada não terminal produzido durante o processamento de x , mas apenas aparecido durante o processamento de y . Na fase 2, que estão autorizados a pop Um ' em vez de empurrar A . Se fizermos isso, teremos que lembrar que o estoque superior é realmente A ; isso se aplica somente quando não há itens "temporários" na pilha, que no PDA simulado é o mesmo que o topo da pilha sendo ϵ ou no formato B ′ .AxyA′AAϵB′
Aqui está um exemplo simples. Considere um autômato para x n y n que empurre A para cada x e apareça A para cada y . O novo autômato aceita palavras de duas formas: y k x n y n - k e x k y n x n - k . Para palavras da primeira forma, o estágio 1 consiste em empurrar k vezes A ' , o estágio 2 consiste em estourar k vezes A ' , empurrando nxnynAxAyykxnyn−kxkynxn−kkA′kA′- k vezes A e popping n - k vezes A . Para palavras da segunda forma, primeiro pressionamos k vezes A , depois pop k vezes A , pressionamos n - k vezes A ' , fazemos a transição para o estágio 2 e pop n - k vezes A ' .n−kAn−kAkAkAn−kA′n−kA′
Aqui está um exemplo mais complicado, para o idioma de parênteses balanceados de vários tipos ("()", "[]", "<>"), de modo que os descendentes imediatos de cada tipo de parênteses devam pertencer a um tipo diferente. Por exemplo, "([] <>)" está OK, mas "()" está errado. Para cada "(", eu empurro A se a pilha top-of-não é A , para cada ")", nós pop A . Da mesma forma , B , C estão associados a "[]" e "<>". Aqui está como aceitamos a palavra ">) ([()] <". Nós consumimos ">)", pressionando C ′ A ′ e fazendo a transição para o estágio 2. Nós consumimos "(", popping A ' e lembrando o top-of-stack A . Nós consumimos "[()]", empurrando e estourandoA AABCC′A′A′AB A ; ao pressionar B , sabemos que o topo da pilha "real" é A e, portanto, colchetes são permitidos (não seríamos enganados por ">) (() <"); ao pressionar A , como o topo da pilha é B (que não é ϵ ou tem a forma X ′ ), sabemos que B também é o topo da pilha "real" e, portanto, parênteses arredondados são permitidos ( mesmo que o topo da pilha de sombras seja A ). Finalmente, consumimos "<" e pop C ' .BABAABϵX′BAC′
Considere a forma normal de Greibach . Para construir uma linguagem mudou você só precisa produções de mudança S → α A 1 ... A n a S → A 1 ... A n α e adicionar um novo não-terminal S " que se comporta como S usado para, no caso de alguma parte da produção referenciado S .
fonte
Acabou sendo uma boa idéia checar o antigo clássico de Hopcroft e Ullman, Introdução à Teoria dos Autômatos (1979). O encerramento do ciclo é o Exercício 6.4c e está marcado com S **. As estrelas duplas significam que é um dos problemas mais difíceis (no livro). Felizmente, o S indica que é um dos problemas selecionados com uma solução.
A solução é a seguinte. Tome um CFG na forma normal de Chomsky. Considere qualquer árvore de derivação e basicamente vire-a de cabeça para baixo. Considere um caminho S = X 1 , X 2 , … , X n na árvore original. À esquerda, a árvore tem contribuições x 1 , x 2 , … , x n para a direita y 1 , y 2 , … , y n , significando que a sequência derivada é igual a x 1 x 2 … x ny n … y 2 y 1 . (Na verdade, como a gramática é CNF quando o caminho continua à esquerda, a contribuição será para a direita e os correspondentes x i está vazio, etc)
A árvore de cabeça para baixo tem um caminho S ' , X n , ... X 2 , X 1 com contribuições y n , ... , y 2 y 1 para a esquerda e x n , ... , x 2 x 1 para a direita, portanto, o resultado é uma derivação para y n … y 2 y 1 x 1 x 2 … x n . Como requerido.
Detalhes completos da construção são fornecidos no livro.
Observe como isso lembra a solução (aceita) da Yuval. Os não terminais que são enviados por push em vez de pop-up estão na ordem oposta na pilha. Muito semelhante ao contrário na árvore.
fonte