Este problema se denomina "inclusión" o "subsunción" de expresiones regulares, porque lo que está pidiendo es si el conjunto de palabras con una expresión regular incluye (o subsume) el conjunto de palabras con la otra expresión regular . La igualdad es una pregunta diferente que normalmente significa si dos expresiones regulares coinciden exactamente con las mismas palabras, es decir, que son funcionalmente equivalentes. Por ejemplo, "a *" incluye "aa *", mientras que no son iguales.
Todos los algoritmos conocidos para la inclusión de expresiones regulares son el peor de los casos toma tiempo exponencial en el tamaño de la expresión regular.Sin embargo, el algoritmo estándar es la siguiente:
r1 de entrada y r2 salida Sí si R1 incluye r2
- Crear DFA (r1) y DFA (r2)
- Crear Neg (DFA (r1)) (que coincide exactamente con esas palabras r1 no coinciden)
- Crear Neg (DFA (r1)) x DFA (R2) (que coincide exactamente con esas palabras coincidentes por Neg (DFA (r1)) y DFA (r2))
- Compruebe que el autómata hecho en 3. no coincide con ninguna palabra
Esto funciona, ya que lo que está revisando es que no hay palabras emparejadas por r2 que no coincidan con r1.
@skaffman: Creo que la etiqueta de idioma normal es apropiada, dado que una expresión regular describe un idioma normal, es solo una manera simple de representarlo "en papel". Pero la pregunta w.r.t. la informática tiene más que ver con los lenguajes regulares que las expresiones regulares. –
eh, el título no coincide con la descripción? – maxschlepzig
No estoy seguro si califica como un "algoritmo", pero usar ". *" Coincide con la entrada arbitraria con una expresión regular; Dudo que se pueda minimizar a menos de 1. :-) –