Dado un lenguaje regular (NFA, DFA, gramática o expresión regular), ¿cómo se puede contar el número de palabras aceptadas en un idioma determinado? Tanto "con exactamente n letras" como "con como máximo n letras" son de interés.
Margareta Ackerman tiene dos documentos sobre el tema relacionado de enumerar palabras aceptadas por una NFA, pero no pude modificarlas para contar de manera eficiente.
Parece que la naturaleza restringida de los lenguajes regulares debería hacer que contarlos sea relativamente fácil: casi espero una fórmula más que un algoritmo Desafortunadamente, mis búsquedas hasta ahora no han encontrado nada, por lo que debo estar usando los términos incorrectos.
Respuestas:
Para un DFA, en el que el estado inicial es el estado , el número de palabras de longitud k que terminan en el estado i es A k [ 0 , i ] , donde A es la matriz de transferencia del DFA (una matriz en la que número en la fila i y columna j es el número de símbolos de entrada diferentes que causan una transición del estado i al estado j ) Entonces puede contar aceptando palabras de longitud exactamente k fácilmente, incluso cuando k0 k i Ak[0,i] A i j i j k k es moderadamente grande, simplemente calculando una potencia de matriz y agregando las entradas correspondientes a los estados de aceptación.
Lo mismo funciona para aceptar palabras de longitud como máximo , con una matriz ligeramente diferente. Agregue una fila y columna adicionales de la matriz, con una en la celda que esté tanto en la fila como en la columna, una en la nueva fila y la columna del estado inicial, y un cero en todas las demás celdas. El efecto de este cambio en la matriz es agregar una ruta más al estado inicial en cada potencia.k
Esto no funciona para los NFA. Sospecho que lo mejor que puede hacer es convertirlo a un DFA y luego aplicar el algoritmo de alimentación de matriz.
fuente
Claramente:
Esto se remonta a una técnica introducida para gramáticas por Chomsky y Schützenberger (1963); se transfiere fácilmente a autómatas finitos.
fuente
Creo que este es un problema difícil de contar, vea este artículo: contar el tamaño de las secuencias regulares de longitud dada es # P-completo: S. Kannan, Z. Sweedyk y SR Mahaney. Recuento y generación aleatoria de cadenas en idiomas regulares. En el Simposio ACM-SIAM sobre Algoritmos discretos (SODA), páginas 551–557, 1995.
fuente
fuente