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 ′ xyxyxxyAA′xA, 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.A′x
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′,α)qa∈Aa=ϵA∈ΓA=ϵq′A 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.A′A∈Γq,q′∈QA∈Γ∪{ϵ}(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),B′A′α)B∈Γ∪{ϵ}ϵ′=ϵq∈F((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,B′A,(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)qq′x(q,q′,2,A)AA′A′AxyA′en 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 vecesxnynAxAyykxnyn−kxkynxn−kkA′kA′n−kAn−kAkA, luego pop veces , push veces , transición a la etapa 2 y pop veces .kAn−kA′n−kA′
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 AABCC′A′A′ABAB , 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ϵX′BAC′
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→αA1…An S→A1…Anα S′ S S
fuente
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,…,Xn x1,x2,…,xn y1,y2,…,yn x1x2…xnyn…y2y1 xi
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^1 yn,…,y2y1 xn,…,x2x1 yn…y2y1x1x2…xn
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.
fuente