Una expresión regular especifica una máquina de estados finitos que puede reconocer un conjunto de cadenas potencialmente infinito. El conjunto de cadenas puede ser infinito, pero el número de estados debe ser finito, por lo que puede examinar los estados uno a uno.
Tomando su segundo ejemplo: en la primera expresión, para pasar del estado 0 al estado 1, la cadena debe comenzar con un dígito. En la segunda expresión, para pasar del estado 0 al estado 1, la cadena debe comenzar con una letra. Entonces sabes que no hay ninguna cadena que te lleve del estado 0 al estado 1 en AMBAS expresiones. Usted tiene la respuesta.
Tomando el primer ejemplo: Usted sabe que si la cadena comienza con un dígito, puede pasar del estado 0 al estado 1 con cualquier expresión regular.Así que ahora puede eliminar el estado 0 para cada uno, y simplemente responder la pregunta para cada una de las dos (ahora un estado más pequeño) máquinas de estados finitos.
Esto se parece mucho al conocido "problema de detención" que, como saben, no puede resolverse en el caso general de una máquina de Turing o equivalente. Pero, de hecho, el problema de detención ES solucionable para una máquina de estado finito, simplemente porque hay un número finito de estados.
Creo que podría resolver esto con un FSM no determinista. Si tu expresión regular tuvo solo una transición de cada estado al siguiente, un FSM determinista podría resolverlo. Pero una expresión regular significa que, por ejemplo, si estás en el estado 2, entonces si el caracter es un dígito, vas al estado 3, de lo contrario, si el personaje es una letra, vas al estado 4.
Así que esto es lo que haría hacer:
solucionarlo para el subconjunto de EFM de que sólo tienen una transición de un estado a otro. Por ejemplo, una expresión regular que coincida con "Bob" y "bob", y una segunda expresión regular que coincida solo con "bob" y "boB".
Vea si puede implementar la solución en una máquina de estados finitos. Creo que esto debería ser posible. La entrada a un estado es un par que representa una transición para un FSM y una transición para el segundo. Por ejemplo: Estado 0: Si (r1, r2) es (("B" o "b"), "b") entonces Estado 1. Estado 1: Si (r1, r2) es (("o"), ("o")) luego state 2. etc.
Ahora, para el caso más general, donde por ejemplo el estado dos vuelve al estado dos o un estado anterior; por ejemplo, regex 1 solo reconoce "meet" pero regex 2 reconoce "meeeet" con un número ilimitado de e. Tendría que reducirlos a regex 1 reconociendo "t" y regex 2 reconociendo "t". Creo que esto puede ser solucionado por un FSM no determinista.
Esa es mi intuición de todos modos.
No creo que sea NP-completo, solo porque mi intuición me dice que debería ser capaz de acortar cada regex en un estado en cada paso.
Hm ... la mayoría de expresiones regulares (regex o verdadero) son equivalentes a los autómatas finitos. Me pregunto si, dados dos de esos autómatas sobre el mismo alfabeto, uno puede decir si hay alguna cadena en el lenguaje que sea aceptada por ambos. Personalmente, no veo una forma general sin forzar de forma brutal todas las cadenas de longitud 1, 2, 3, 4, 5 ... en general, esto puede tomar "para siempre" para verificar. –
Estoy bastante seguro de que tienes que forzar esto brutalmente. – rfusca
@rfusca: el uso de fuerza bruta sobre una lista infinita de posibles entradas es trivialmente indecidible. Si no hay intersección, un algoritmo de fuerza bruta nunca terminaría. – sepp2k