¿Por qué no es simple contar la cantidad de palabras en un idioma normal?

8

Dado un DFA, A, deje que L (A) denote el número de palabras que A acepta. Creo que es fácil calcular L (A): traducir la codificación de A a una expresión regular. Si la estrella de Kleene aparece en algún lugar de la expresión, el lenguaje es infinito. De lo contrario: revisa y cuenta todas las combinaciones de palabras que se pueden hacer usando la expresión (básicamente si hay un operador + en la expresión, multiplica la cantidad de palabras legales por la cantidad de cadenas conectadas por el + ..)

¿Esto esta mal? Gracias por adelantado

usuario67573
fuente
3
ε no es un lenguaje infinito.
David Richerby

Respuestas:

12

Sí, esto está mal, debido a la ambigüedad.

Considere el siguiente idioma: .(una+unauna)+una(una+ϵ)

Con su método, vemos 4 palabras, . ¡Pero tenemos duplicados! Hay varias formas de hacer la misma palabra dentro de la expresión regular dada.una,unauna,unauna,una

Un mejor método es usar programación dinámica en un DFA mínimo para su idioma, sin estados "muertos". Si el DFA mínimo es cíclico, el lenguaje es infinito, por lo que podemos suponer que no hay ciclos. Usar un DFA es clave, porque el determinismo significa que hay exactamente un camino a través del DFA para cada palabra.

Lo que haces es crear una recurrencia para la cantidad de palabras que terminan en un estado dado:

  • 1 palabras termina en el estado inicial:ϵ
  • Para cada estado , el número de palabras que terminan allí es la suma del número de palabras que terminan en cada estado con una transición a .qq

El número total de palabras es entonces la suma del número de palabras que terminan en cada estado final.

jmite
fuente
2
Cabe señalar que estas recurrencias siempre se pueden resolver mediante álgebra computacional, por ejemplo, para las funciones generadoras. Entonces, sí, el lenguaje regular es realmente fácil de contar.
Raphael
9

Complementando la respuesta de jmite, no es demasiado difícil calcular el número de palabras en un idioma normal, utilizando el método de "matriz de transferencia". Esto es lo mismo que la programación dinámica de jmite, pero la técnica tiene otras aplicaciones, como la enumeración asintótica.

Dado un DFA, construya una matriz (donde es el conjunto de estados) en la que es el número de letras que hacen que el DFA se mueva del estado al estado . Sean y los indicadores del estado inicial y de los estados de aceptación, respectivamente. Finalmente, sea.Q×QMETROQMETRO(yo,j)jyo1q0 01Fnorte=El |QEl |

El número de palabras de longitud es . Calcule para . Si , el lenguaje aceptado por el DFA es infinito. De lo contrario, el número de palabras en el idioma es .metroCmetro: =1FMETROmetro1q0 0Cmetro0 0metro<2norteCnorte++C2norte-1>0 0C0 0++Cnorte-1

(Cuando se calculan las potencias de , se debe tener cuidado con respecto a la magnitud de las entradas, que es exponencial en . Dado que su tamaño es solo polinomial, el algoritmo resultante se ejecuta en tiempo polinomial).METROmetro

Yuval Filmus
fuente
2
Me encanta este enfoque. También descubrí que calcular los valores propios deMETROen realidad corresponden a las raíces del denominador en el enfoque de la función generadora, y eso, quizás como era de esperar, estos valores propios son invariables para la minimización de DFA. Sin embargo, no tengo ni idea de cómo interpretar esto correctamente.
Lee
1
Esto no es tan sorprendente, dado que la función generadora es PAGS(z)=norte=0 01FMETROnorte1q0 0znorte, que se simplifica a PAGS(z)=1F(yo-zMETRO)-11q0 0. Puede obtener un resultado aún más explícito rehaciendo este cálculo utilizando la forma de Jordan deMETRO, que presenta los valores propios.
Yuval Filmus
7

En realidad, aún puede derivar fórmulas de conteo para expresiones regulares inequívocas con estrellas de Kleene dentro.

Dada la definición inductiva de una expresión regular como:

miRmi: =XΣmi0 0 mi1mi0 0+mi1mi

Considere la siguiente traducción [[]]:RmiC(z) que toma una expresión regular y la traduce en una función racional de valores complejos:

[[XΣ]]=z[[mi0 0 mi1]]=[[mi0 0]]×[[mi1]][[mi0 0+mi1]]=[[mi0 0]]+[[mi1]][[mi]]=11-[[mi]]

Podemos mostrar que esta traducción devuelve una expresión racional haciendo inducción estructural en miy observando que todas las operaciones utilizadas en el lado derecho conservan la racionalidad.

Supongamos que la expresión regular mi que ponemos es inequívoco, entonces encontraríamos que la función racional denotada por [[mi]]C(z) es en realidad la función generadora para la familia de palabras que son aceptadas por el lenguaje subyacente mi, clasificados por su longitud.

Por ejemplo, considere el idioma (unasi), que define el lenguaje de las ejecuciones de una delimitado por si. Ahora, esta expresión regular no es ambigua, por lo que podemos ejecutar nuestro truco de traducción:

[[(unasi)]]=11-[[unasi]]=11-([[una]]×[[si]])=11-(11-[[una]]×z)=11-z1-z=12+12-4 4z

Como resultado, dada la función generadora anterior, su coeficiente de extracción será

[znorte][[(unasi)]]=2norte-1+δ(norte)2
dónde
δ(norte)={1Si norte=0 00 0de otra manera

De hecho, desde nuestra traducción [[]] genera funciones racionales, podemos usar una descomposición de fracción parcial para crear una fórmula de enumeración para cualquier expresión regular inequívoca.

Supongamos que tiene una función racional irreducible

r(z)+pags(z)q(z)
dónde r,pags,q son polinomios, entonces puedes descomponer esto en
r(z)+C0 0z-q0 0++Cnortez-qnorte
dónde qk son las raíces de q(z). Hay algunos casos técnicos de esquina (como multiplicidad de raíces, etc.), pero es relativamente fácil hacer la extracción de coeficientes en la expresión anterior:
[znorte]Cz-q=C×q-norte

De hecho, la descomposición de fracción parcial se generaliza a funciones racionales multivariadas, por lo que en realidad puede construir fórmulas de conteo para consultas tales como "¿Cuántas palabras hay donde hay norte as y metro bs? "

Desafortunadamente, la medida en que este método será útil termina cuando tiene una expresión ambigua.

Sotavento
fuente