Prova fácil de fechamento de idiomas sem contexto sob mudança cíclica


11

O deslocamento cíclico (também chamado de rotação ou conjugação ) de uma linguagem é definido como . De acordo com a wikipedia (e aqui ), as linguagens sem contexto são fechadas nesta operação, com referências a artigos de Oshiba e Maslov. Existe uma prova fácil desse fato?L L{ y x x y L }{yxxyL}

Para idiomas regulares, o fechamento é discutido neste formulário como " Prove que os idiomas regulares estão fechados no operador de ciclo ".

Respostas:


5

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 xyyxxyxxyAAxpelo 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 AaA (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=ϵqAαΓ

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 (AAΓq,qQAΓ{ϵ}(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),BAα)BΓ{ϵ}εϵ=ϵ . Para cada estado final q FqF , 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,BA,(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)qqx( q,q,2,A)AAAem 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 .AxyAAAϵ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 nxnynAxAyykxnynkxkynxnkkAkA- 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 ' .nkAnkAkAkAnkAnkA

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 AABCCAAAB 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ϵXBAC


Desculpe, estou tendo problemas para entender. Você pode explicar melhor? Onde o autômato começa e quais são suas transições? E o interruptor A A acontece para cada símbolo de pilha? Obrigado! AA
usul

Sugestão muito interessante. Obrigado. Vou mastigá-lo um pouco, para deixá-lo afundar.
Hendrik

@usul, você deverá preencher os detalhes por conta própria. O interruptor A A ' (no primeiro estágio) deve ocorrer quando o autômato "deseja" acionar A, mas não pode, e, em vez disso, pressiona A ' . Você pode pensar nisso como um movimento não determinístico. AAAA
Yuval Filmus

@Yuval: desculpe, mas não posso fazer isso acontecer. Pelo que entendi, o novo autômato começa simulando a parte y , mudando pops e toques. Em seguida, gere α na pilha, onde o autômato original começa com α ao ler y . O que o original começa pressionando? Então o novo autômato precisa sair da pilha vazia. Ainda acho que sua intuição vale a pena, mas parece necessário um cuidado extra. yααy
Hendrik Jan

@ Hendrik, desculpe, mas não posso seguir o seu contra-exemplo. Em que momento você acha que o novo autômato precisa sair da pilha vazia?
Yuval Filmus

4

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 .


Obrigado, mas isso é mudança por uma única letra. Estou interessado na rotação geral, por um número arbitrário de letras.
Hendrik Jan

3
@HendrikJan: Bem, se o turno 1 ( L ) é livre de contexto, então o turno n ( L ) = turno 1 ( turno 1 ( ( L ) ... ) certamente também será livre de contexto. Você pode criar uma gramática para isso, aplicando o método que sugeri n vezes.Você também pode construir a gramática shift n ( L ) diretamente, "nivelando" a gramática especificada.Por exemplo, se n = 2 e a gramática tiver produções Sα A B e A β C , você adicionaria uma produção S α β C B e giraria isso. Obviamente, o tamanho da sua gramática pode crescer muito rapidamente.
usar o seguinte código

1
Para n fixo, você está certo. Mas aqui n é fixo nem limitado. Por exemplo, se L = { um n b n | n 0 } em seguida, obtém-se { um k b n um | k + = N } { b k um n b | k + = N } .
Hendrik Jan

@HendrikJan, entendo. Eu assumi erroneamente que a pergunta era sobre uma mudança finita. Eu vou reconsiderar a minha resposta ...
Karolis Juodelė

4

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 2x ny ny 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 ny 2 y 1 x 1 x 2x 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.