Esto está algo relacionado con otra pregunta que hice , pero siento que es lo suficientemente diferente como para justificar su propia pregunta.
Estoy investigando donde estoy tratando de encontrar la estructura de los complementos de una determinada clase de lenguajes finitos. Es fácil para mí obtener los DFA mínimos que aceptan estos lenguajes, pero me gustaría examinar qué tipo de estructura tienen los NFA que aceptan estos idiomas, particularmente cómo el no determinismo ayuda con el tamaño del estado de los autómatas (los DFA son exponencialmente grandes).
El problema es que la técnica principal de reducción de NFA usa equivalencias, que no producirán ninguna reducción si comienzo con un DFA mínimo (ya que básicamente está usando la misma técnica). Si empiezo con un DFA no mínimo, solo escupe el DFA mínimo.
Lo que me pregunto es, ¿hay algoritmos que puedan comenzar con un DFA y reducirlo a un NFA más pequeño al introducir el no determinismo? ¿Existen "técnicas estándar" para hacer esto?
He encontrado reducciones de preorden , que parecen prometedoras pero difíciles de implementar. Estoy abierto a muchas sugerencias.
Respuestas:
Para una heurística eficiente, sugeriría buscar en la literatura CAD sobre el problema de codificación de estado (asignar identificadores binarios a estados de un DFA para minimizar la cantidad de lógica para la función de transición de estado). Devadas y Newton, "Descomposición y factorización de finito secuencial máquinas de estado ", IEEE TCAD , 8 (11): 1206-1217, 1989 señala que existe una estrecha relación entre la codificación de estado y la descomposición de la máquina de estado.
Si para un DFA conN declara que asigna un único M Identificador de estado de bit a cada estado (lg2N<M≤N ), esencialmente ha descompuesto el DFA en una red de M máquinas interactivas de dos estados. Equivalente: has definido un conjuntoS con M elementos, y se les asignó un subconjunto único de S a cada estado en su DFA original. Esto también es lo que hace el algoritmo de construcción de conjuntos de potencia Rabin-Scott . Entonces, al hacer una codificación de estado en el DFA, estamos tratando de aplicar ingeniería inversa al conjunto desde el que comenzó el algoritmo de construcción del conjunto de potencia.
En el problema de codificación de estado tradicional, todas las codificaciones son legales, y hay alguna función objetiva (relacionada con la cantidad de lógica en la función de transición de estado) que está intentando minimizar. Para generar un NFA, debe resolver una versión restringida del problema de detección donde:
Para que puedas enumerar todos losM codificaciones de bits para todos lg2N<M≤N , y verifique si cada uno satisface la restricción. (Tenga en cuenta que paraM=N la codificación trivial "one-hot" siempre satisface las restricciones y le da el DFA.) Sin embargo, la enumeración es ridículamente grande (el libro de texto de Di Micheli lo da como algo así como 2M!(2M−N)!M! .) La razón por la que sugiero la literatura CAD es que existen técnicas para hacer esta búsqueda implícitamente en lugar de enumerar (por ejemplo, mediante el uso de BDD, ver Lin, Touati y Newton, "No importa la minimización de la secuencial de varios niveles redes lógicas, " Int'l Conf Comp-Aided Dsgn ICCAD-90: 414-417, 1990 .
Ejemplo
Tome el siguiente DFA, (con una codificación de estado que obtuve por engaño (generé el DFA a partir de un NFA usando Rabin-Scott, y la codificación representa los subconjuntos elegidos por Rabin-Scott))
Si llamamos a los bits en la asignación de estado ABCD, cuando el símbolo de entrada es 1, la función de transición es A = A, B = A, C = B, D = C. Cuando el símbolo de entrada es 0, la función de transición es A = A, C = B, D = C. Esta es una función de transición puramente disyuntiva sin conjunción ni negación, por lo que esta codificación de estado nos da un NFA. Los estados en el NFA corresponden uno a uno con los bits en la codificación, y la función de transición es la siguiente:
Formulación como problema de satisfacción booleana
La descripción informal anterior conduce directamente a una codificación como un problema de satisfacción booleana. Hay un conjunto de variables que describe las transiciones en el NFA, y un conjunto de variables para la codificación del estado de DFA que se derivarían de Rabin-Scott para el NFA elegido. Las transiciones del DFA específico que está tratando de descomponer se usan para colocar restricciones en las transiciones NFA.
Supongamos que se nos da un DFA conN estados para un idioma con S símbolos, y nos gustaría obtener un M NFA estatal, con lg2N<M≤N . Utilizaremos las variablesysft para representar las posibles transiciones en la NFA. ysft será cierto si hay una transición en el NFA de estado NFAf a estado NFAt en símbolo s . En el ejemplo anterior NFA, el alfabeto es de tamaño 2 y hay 4 estados NFA, por lo que haySM2=32 y variables y y0AA,y1AA y y1AB son todas verdaderas mientras y1DA Es falso.
Utilizaremos las variablesxdn para indicar si el algoritmo Rabin-Scott debe incluir o no el estado NFA n en el conjunto de estados que etiquetan el estado de DFA d . En el ejemplo anterior tenemosN=8 DFA declara y M=4 NFA dice que hay 32 x variables En el ejemplo anterior, suponga que el estado más bajo (el etiquetado "1011") es el estadok , entonces xkA , xkC y xkD son ciertas mientras xkB Es falso.
Ahora las limitaciones. En primer lugar, Rabin-Scott debe encontrar una codificación diferente para cada estado de DFA, por lo que para los estados de DFAi<j y todos los estados de la NFA {A,B,⋯,D} :
A continuación, debe darse el caso de que si Rabin-Scott encuentra una transición del estado de DFAi al estado de DFA j en símbolo s entonces para cada estado NFA k incluido en la codificación de j debe haber un estado NFA l de la codificación del estado DFA j tal que la NFA original tuvo una transición de l a k . En el ejemplo anterior, en el símbolo "1" hay una transición de DFA del estado de DFA "1000" al estado de DFA "1100", por lo que debe haber una transición de NFA del estado de NFA A a los estados de NFA A y B y no transición de NFA de NFA estado A al estado NFA C o D. Entonces, para cada uno de loso(SN2) bordes en el DFA tenemos las restricciones:
Finalmente tenemos que lidiar con el inicio y aceptar los estados. El estado de inicio de DFA se codifica con la unión de los estados de inicio de NFA, por lo que es mejor que el estado de inicio de DFA no se codifique con el conjunto vacío.x0A+x0B+⋯+x0D . Y finalmente necesitamos un conjunto de variablesfn para indicar si cada estado NFA es un estado de aceptación NFA. Debe darse el caso de que la codificación de cada estado de aceptación de DFA contenga al menos un estado de aceptación de NFA y que la codificación de cada estado de no aceptación de DFA no contenga ningún estado de aceptación de NFA, por lo que:xiAfA+xiBfB+⋯+xiDfD para DFA aceptar estados i y ¬(xjAfA+xjBfB+⋯+xjDfD) para los estados no aceptados de DFA j .
fuente
Minimizar los NFA es difícil, de hecho es tan difícil que incluso la aproximación es difícil; ver Minimizar NFA y expresiones regulares de Gramlich y Schnitger (2005). Este artículo también parece tener algunas referencias útiles, por ejemplo, Algoritmos de reducción de NFA por medio de desigualdades regulares de Champarnaud y Coulon (2002) que contiene técnicas de minimización.
fuente
Existen algunas nociones de FSA canónicas que no son necesariamente deterministas, por lo tanto, pueden ser más pequeñas que el DFA mínimo. Un ejemplo son las FSA "residuales", para las cuales se pueden calcular las FSA canónicas residuales de forma bastante directa, ver F. Denis, A. Lemay y A. Terlutte. "Autómatas de estado finito residual", Fundamenta Informaticae 51 (4): 339-368, 2002 . Existen varias alternativas.
fuente