Prueba fácil de que los lenguajes sin contexto se cierren bajo un cambio cíclico

11

El desplazamiento cíclico (también llamado rotación o conjugación ) de un lenguaje se define como . Según Wikipedia (y aquí ), los lenguajes libres de contexto se cierran bajo esta operación, con referencias a documentos de Oshiba y de Maslov. ¿Hay una prueba fácil de este hecho?{ y x x y L }L{yxxyL}

Para los idiomas regulares, el cierre se analiza en este formulario como " Probar que los idiomas regulares están cerrados bajo el operador de ciclo ".

Hendrik Jan
fuente

Respuestas:

5

Puede intentar usar autómatas pushdown. Dado un autómata pushdown para el idioma original, construimos uno para el cambio cíclico. El nuevo autómata opera en dos etapas, correspondientes a la parte y de la palabra (donde está en el idioma original). En la primera etapa, cuando el autómata le gustaría hacer estallar un no terminal , que puede empujar un lugar no terminal ; La idea es que al final de la primera etapa, la pila contendría, en orden inverso, los símbolos que se encuentran en la pila después de leer por el autómata original. En la segunda etapa (el interruptor es no determinista), en lugar de empujar un no-terminalx y x x y A A x A A xyxyxxyAAxA, se nos permite reventar una no terminal . Si el autómata original puede generar la pila al leer , entonces la nueva podría reventar exactamente toda la pila.Ax

Editar: Aquí hay más detalles. Supongamos que tenemos un PDA con alfabeto , conjunto de estados , conjunto de estados de aceptación , no terminales , estado inicial y un conjunto de transiciones permitidas. Cada transición permitida es de la forma , lo que significa que cuando está en el estado , al leer (o , en cuyo caso es una transición libre), si la parte superior de la pila es (o , lo que significa que la pila está vacía), entonces el PDA puede (es un modelo no determinista) moverse al estado , reemplazandoQ F Γ q 0 ( q , a , A , q , α ) q a A a = ϵ A Γ A = ϵ q A α Γ ΣQFΓq0(q,a,A,q,α)qaAa=ϵAΓA=ϵqA con .αΓ

El nuevo PDA tiene una nueva no terminal para cada . Por cada dos estados y , hay dos estados . Los estados iniciales (el estado inicial real se elige de forma no determinista entre ellos mediante -transitions) son . Para cada transición hay transiciones correspondientes y . También hay otras transiciones.AAΓq,qQAΓ{ϵ}(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),α)

Para cada transición , hay transiciones , donde y . Para cada estado final , hay transiciones , donde .(q,a,A,q,α)((q,q,1),a,B,(q,q,1),BAα)BΓ{ϵ}ϵ=ϵqF((q,q,1),ϵ,A,(q0,q,2,ϵ),A)AΓ{ϵ}

Para cada transición , hay transiciones , donde . Para cada transición , hay transiciones , donde . Para cada transición , hay "transiciones generalizadas" ; Estos se implementan como una secuencia de dos transiciones a través de un nuevo estado intermedio. Transiciones\ alpha) con(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,BA,(q,q,2,C),ϵ)(q,a,ϵ,q,α)|α|2se manejan de manera similar. Para cada transición , hay transiciones , donde . Las transiciones se manejan de manera similar. Finalmente, hay un único estado final , y transiciones .(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,ϵ)

(Puede haber algunas transiciones que me perdí, y algunos de los detalles que estoy omitiendo son algo desordenados).

Recuerde que estamos tratando de aceptar una palabra , donde es aceptada por el PDA original. Un estado significa que estamos en la etapa 1, en el estado , y el PDA original está en el estado después de leer . Un estado es similar, donde corresponde a la última que apareció. En la etapa 1, se nos permite empujar en lugar de hacer estallar . Hacemos eso para cada no terminal que se produce al procesar , pero solo aparece al procesar . En la etapa 2, se nos permite reventaryxxy(q,q,1)qqx(q,q,2,A)AAAAxyAen lugar de empujar . Si hacemos esto, entonces debemos recordar que la parte superior del stock es realmente ; esto solo se aplica cuando no hay cosas "temporales" en la pila, que en el PDA simulado es lo mismo que la parte superior de la pila es o de la forma .AAϵB

Aquí hay un ejemplo simple. Considere un autómata para que empuja para cada , y saca para cada . El nuevo autómata acepta palabras de dos formas: y . Para las palabras de la primera forma, etapa 1 consiste en empujar veces'etapa 2 consiste en hacer estallar veces , empujando veces , y haciendo estallar veces . Para palabras de la segunda forma, primero presionamos vecesxnynAxAyykxnynkxkynxnkkAkAnkAnkAkA, luego pop veces , push veces , transición a la etapa 2 y pop veces .kAnkAnkA

Aquí hay un ejemplo más complicado, para el lenguaje de paréntesis equilibrados de varios tipos ("()", "[]", "<>") de modo que los descendientes inmediatos de cada tipo de paréntesis deben pertenecer a un tipo diferente. Por ejemplo, "([] <>)" está bien pero "()" está mal. Para cada uno "(", empujamos si la pila top-of-no es , por cada ")", nos pop . De manera similar , , están asociados con "[]" y "<>". Así es como aceptamos la palabra ">) ([()] <". ">)", presionando , y transición a la etapa 2. "(", haciendo estallary recordando el tope de la pila . Consumimos "[()]", empujando y haciendo estallar ; al empujarA AABCCAAABAB , somos conscientes de que la parte superior "real" de la pila es , por lo que se permiten corchetes (">) (() <") no nos engañaría; al presionar , ya que la parte superior de la pila es (que no es o de la forma ), entonces sabemos que también es la parte superior "real" de la pila, por lo que se permiten paréntesis redondos (aunque la parte superior de la pila de la sombra es ). Finalmente, consumimos "<" y aparece .AABϵXBAC

Yuval Filmus
fuente
Lo siento, tengo problemas para entender, ¿puedes explicar más? ¿Dónde comienza el autómata y cuáles son sus transiciones? ¿Y ocurre el cambio de para cada símbolo de pila? ¡Gracias! AA
usul
Muy interesante sugerencia. Gracias. Voy a masticar esto un poco, para dejar que se hunda.
Hendrik Jan
@usul, tendrás que completar los detalles tú mismo. El interruptor (en la primera etapa) debería ocurrir cuando el autómata "quiere" hacer estallar pero no puede, y en su lugar empuja . Puedes pensarlo como un movimiento no determinista. AAAA
Yuval Filmus
@Yuval: lo siento pero no puedo hacer que esto suceda. Según entiendo su idea, el nuevo autómata comienza simulando la parte , cambiando pops y empujones. Luego genere en la pila, donde el autómata original comienza con cuando lee . ¿Cuál es el comienzo original al presionar? Luego, el autómata nwe debe aparecer en la pila vacía. Todavía creo que su intuición vale la pena, pero parece que se necesita un cuidado adicional. yααy
Hendrik Jan
@Hendrik, lo siento, pero no puedo seguir tu contraejemplo. ¿En qué momento crees que el nuevo autómata necesita salir de la pila vacía?
Yuval Filmus
4

Considere la forma normal de Greibach . Para construir un lenguaje modificado solo necesita cambiar las producciones a y agregar una nueva no terminal que se comporte como solía, en caso de que algunos producción de referencia .SαA1AnSA1AnαSSS

Karolis Juodelė
fuente
Gracias, pero este es el cambio por una sola letra. Estoy interesado en la rotación general, por un número arbitrario de letras.
Hendrik Jan
3
@HendrikJan, Bueno, si está libre de contexto, entonces seguramente también estará libre de contexto. Puedes construir una gramática aplicando el método que sugerí veces. También puedes construir la gramática directamente, al "aplanar" la gramática dada Por ejemplo, si y la gramática tiene producciones y , agregaría una producción y la rotaría. Por supuesto, el tamaño de su gramática podría crecer muy rápidamente.shift1(L)shiftn(L)=shift1(shift1((L))nshiftn(L)n=2SαABAβCSαβCB
Karolis Juodelė
1
Para fijo tienes razón. Pero aquí es fijo ni acotado. Por ejemplo, si entonces obtenemos . nnL={anbnn0}{akbnak+=n}{bkanbk+=n}
Hendrik Jan
@HendrikJan, ya veo. Asumí erróneamente que la pregunta era sobre un cambio finito. Reconsideraré mi respuesta ...
Karolis Juodelė
4

Resultó ser una buena idea revisar el viejo clásico de Hopcroft y Ullman Introducción a la teoría de los autómatas (1979). El cierre bajo el ciclo es el ejercicio 6.4c y está marcado como S **. Las estrellas dobles significan que es uno de los problemas más difíciles (en el libro). Afortunadamente, la S indica que es uno de los problemas seleccionados con una solución.

La solución es la siguiente. Tome un CFG en forma normal de Chomsky. Considere cualquier árbol de derivación y básicamente déle la vuelta. Considere una ruta en el árbol original. A la izquierda, el árbol tiene contribuciones a la derecha , lo que significa que la cadena derivada es igual a . (En realidad, como la gramática es CNF cuando el camino continúa hacia la izquierda, la contribución será hacia la derecha y la correspondiente está vacía, etc.)S=X1,X2,,Xnx1,x2,,xny1,y2,,ynx1x2xnyny2y1xi

El árbol al revés tiene una ruta con contribuciones a la izquierda y a la derecha, por lo que el resultado es una derivación para . Según sea necesario.S,X^n,X^2,X^1yn,,y2y1xn,,x2x1yny2y1x1x2xn

Los detalles completos de la construcción se dan en el libro.

Observe cómo esto recuerda la solución (aceptada) de Yuval. Los no terminales que se empujan en lugar de explotar están en el orden opuesto en la pila. Muy similar a al revés en el árbol.

Hendrik Jan
fuente