Como se sugiere en los comentarios a la pregunta, intentaré dar una respuesta (lamentablemente parcial) a la pregunta, al menos en la medida en que haya entendido el problema por mí mismo (esto implica que es posible que encuentre errores, y si encuentra una manera de explicar de manera más breve o clara uno de los siguientes puntos, siéntase libre de editar la respuesta en consecuencia):
Primero, uno debe notar que en realidad no tenemos que calcular el autómata universal de un idioma si queremos calcular las factorizaciones de un idioma.
Del artículo mencionado en mi comentario ¹, hay una correspondencia 1-1 entre los factores izquierdo y derecho de un idioma regular, es decir, dado un factor izquierdo del idioma, el factor derecho correspondiente se determina de manera única y viceversa. Más precisamente, tenemos lo siguiente:
Deje que ser una factorización de L . Entonces
Y = ⋂ x ∈ X x - 1 L , X = ⋂ y ∈ Y L y - 1 ,
es decir, cualquier factor izquierdo es una intersección de los cocientes derechos, y cualquier factor derecho es una intersección de los cocientes izquierdos. A la inversa, cualquier intersección de los cocientes izquierdos de L es un factor derecha de L , y cualquier intersección de cocientes adecuados de L es un factor izquierda de L .(X,Y)L
Y=⋂x∈Xx−1L,X=⋂y∈YLy−1,
LLLL
Tenga en cuenta que para un lenguaje normal, solo hay un conjunto finito de cocientes izquierdo y derecho y, por lo tanto, el problema se reduce a calcular los cocientes izquierdo y derecho de un idioma, y luego calcular su cierre estable , es decir, un mínimo superconjunto de los cocientes que se cierra bajo intersección. Estos son, precisamente, a continuación, los factores de la derecha y la izquierda factores, y luego por lo general es fácil ver por qué pares son subconjuntos de L .∩L
Ejemplo
Para ilustrar los puntos anteriores, considere el primer ejemplo en la pregunta (de la cual también creo que es incorrecto en el documento):
Deje . Ahora, los cocientes izquierdos de L son los conjuntos x - 1 L para x ∈ Σ * , es decir, esas palabras u en Σ * que puede ser prefijado con x , es decir, x u ∈ L . ¿Cuándo es y - 1 L = x - 1 L para distintas x , y ? Este es el caso si y solo si xL=Σ∗abΣ∗Lx−1Lx∈Σ∗uΣ∗xxu∈Ly−1L=x−1Lx,yxy puede ser aumentada a las palabras en L con exactamente los mismos sufijos. Esto significa que, para ponerlo en términos más familiares, son equivalentes a Nerode, y los sufijos necesarios para agregar palabras a una clase de Nerode son precisamente los cocientes izquierdos respectivos.yL
Para , vemos que nuestras clases de equivalencia de Nerode sonL
- , el conjunto de palabras que no contiene una b como factor y que termina con a , N1aba
- , el conjunto de palabras que termina con b y no contiene una b como factor, y N2bab
- , el conjunto de palabras que contiene una b como factor, es decir, N 3 = LN3abN3=L
Se pueden aumentar con los siguientes conjuntos (es decir, estos son los cocientes izquierdos de las palabras en las clases respectivas):
- para x en N 1 consta de todas las palabras en L (cualquier palabra se puede aumentar con una palabra que contenga a b como factor y, por lo tanto, se convierte en una palabra en L ) y b Σ ∗ , es decir S 1 = L ∪ b Σ ∗S1=x−1LxN1LabLbΣ∗S1=L∪bΣ∗
- para x en N 2 es el lenguaje en sí, es decir, S 2 = L yS2=x−1LxN2S2=L
- para x en N 3 es obviamente Σ ∗ . Es decir, hemos encontrado tres factores de la derecha de L . Como S 2 ⊂ S 1 ⊂ S 3 , sucierre estable ∩ es trivial S 1 , S 2 , S 3 , y esos son precisamente los factores correctos.S3=x−1LxN3Σ∗LS2⊂S1⊂S3∩S1,S2,S3
FL(P1,S1),(P2,S2),(P3,S3).
Ahora, para los factores izquierdos Pi, we use the equations of the beginning of this answer:
Pi=⋂x∈SiLx−1
.
P1L∪Σ∗aP2Σ∗P3, we obtain L. You can see this by inspection (the most popular excuse for being too lazy to state a formal proof) or by explicitly computing the right quotients (which is fairly analogous, although not completely, to computing the left quotients).
Our factorizations are thus given by FL=u,v,w where
- u=(P1,S1)=(Σ∗abΣ∗∪Σ∗a,Σ∗abΣ∗∪bΣ∗)
- v=(P2,S2)=(Σ∗,Σ∗abΣ∗) and
- w=(P3,S3)=(Σ∗abΣ∗,Σ∗)
Summary
To summarize (as you were asking for a simple procedure):
- For computing the factorizations of a language L, first compute the left quotients of L.
- You can do so, in the language of the paper, by constructing a minimal DFA A for L and then for each state q in A (corresponding, as a Nerode-equivalence class, to a left quotient) compute the future of q in A, thus obtaining one left quotient of the language for each state.
- The collection of left quotients obtained in this way yields, in general, a subset SR of the right factors.
- Compute then the ∩-stable closure of SR, which can be done in practice by forming the intersection of any subset of SR and adding any subset obtained in this way to SR.
- The set SR together with all the intersections from the previous step is then the set of right factors of L.
- In order to obtain the left factors, we can compute the right quotients of L.
- These are sets of the form Ly−1, for y∈Σ∗. Now, these are again only finitely many, and for x≠y, we have Ly−1=Lx−1 if and only if for all u∈Σ∗, ux∈L⇔uy∈L, that is they can be prefixed to words in the language with precisely the same set of strings.
- To compute Lx−1, consider those states q in A such that x is contained in the future of q. The union of the pasts of those states constitute one right quotient. Find all these quotients.
- You know you are done when you have found as many left factors as you have right factors.
- Find those pairs of left and right factors X,Y such that X⋅Y⊆L. This is FL.
- The Universal Automaton by Lombardy and Sakarovitch (in Texts in Logic and Games, Vol 2: Logic and Automata: History and Perspectives, 2007)