Seperti yang disarankan dalam komentar untuk pertanyaan, saya akan mencoba memberikan (sayangnya sebagian) jawaban untuk pertanyaan itu, setidaknya sejauh saya telah memahami masalahnya sendiri (ini menyiratkan bahwa Anda mungkin menemukan kesalahan, dan jika Anda menemukan cara untuk menjelaskan secara lebih singkat atau jelas salah satu poin di bawah ini, jangan ragu untuk mengedit jawabannya):
Pertama, kita harus perhatikan bahwa kita tidak benar-benar harus menghitung otomat universal suatu bahasa jika kita ingin menghitung faktorisasi suatu bahasa.
Dari makalah yang disebutkan dalam komentar saya ¹, ada korespondensi 1-1 antara faktor kiri dan kanan bahasa biasa, yaitu, mengingat faktor kiri bahasa, faktor kanan yang sesuai ditentukan secara unik dan sebaliknya. Lebih tepatnya, kami memiliki yang berikut:
Mari menjadi faktorisasi L . Kemudian
Y = ⋂ x ∈ X x - 1 L , X = ⋂ y ∈ Y L y - 1 ,
yaitu, setiap faktor kiri adalah persimpangan dari quotients kanan, dan setiap faktor kanan adalah persimpangan quotients kiri. Sebaliknya, setiap persimpangan quotients kiri L adalah faktor hak L , dan setiap persimpangan quotients kanan L adalah faktor kiri L .(X,Y)L
Y=⋂x∈Xx−1L,X=⋂y∈YLy−1,
LLLL
Perhatikan bahwa untuk bahasa reguler, hanya ada seperangkat terbatas negosiasi kiri dan kanan, dan dengan demikian atau masalah berkurang untuk menghitung negosiasi kiri dan kanan bahasa, dan kemudian menghitung -stable closure mereka, yaitu minimal superset dari quotients yang ditutup di bawah persimpangan. Ini kemudian justru faktor yang tepat dan faktor kiri, dan kemudian biasanya mudah untuk melihat mana pasangan adalah subset dari L .∩L
Contoh
Untuk mengilustrasikan poin-poin di atas, perhatikan contoh pertama dalam pertanyaan (yang menurut saya juga tidak benar di koran):
Biarkan . Sekarang, quotients kiri L adalah set x - 1 L untuk x ∈ Σ * , yaitu, kata-kata u di Σ * yang dapat diawali dengan x , yaitu x u ∈ L . Kapan y - 1 L = x - 1 L untuk perbedaan x , y ? Ini adalah kasus jika dan hanya jika xL=Σ∗abΣ∗Lx−1Lx∈Σ∗uΣ∗xxu∈Ly−1L=x−1Lx,yxdan dapat ditambahkan ke kata-kata dalam L dengan sufiks yang persis sama. Ini berarti, untuk memasukkannya ke dalam istilah yang lebih akrab, mereka adalah Nerode-equivalen, dan sufiks yang diperlukan untuk menambahkan kata-kata dalam kelas Nerode adalah tepatnya quotient kiri masing-masing.yL
Untuk , kita melihat bahwa kelas Nerode-equivalence kamiL
- , himpunan kata-kata tidak mengandung sebuah b sebagai faktor dan berakhir dengan sebuah , N1aba
- , himpunan kata-kata yang berakhir dengan b dan tidak mengandung sebuah b sebagai faktor, dan N2bab
- , set kata-kata yang mengandung sebuah b sebagai faktor, yaitu, N 3 = LN3abN3=L
Mereka dapat ditambah dengan set-set berikut (yaitu, ini adalah negosiasi kiri dari kata-kata di kelas masing-masing):
- untuk x di N 1 terdiri dari semua kata-kata dalam L (kata apapun dapat ditambah dengan kata yang berisi sebuah b sebagai faktor dan dengan demikian menjadi sebuah kata dalam L ) dan b Σ * , yaitu S 1 = L ∪ b Σ ∗S1=x−1LxN1LabLbΣ∗S1=L∪bΣ∗
- untuk x dalam N 2 adalah bahasa itu sendiri, yaitu, S 2 = L danS2=x−1LxN2S2=L
- untuk x dalam N 3 jelas Σ ∗ . Artinya, kami telah menemukan tiga faktor kanan L . Seperti S 2 ⊂ S 1 ⊂ S 3 ,penutupan ∩ - stabil merekaadalah S 1 , S 2 , S 3 , dan itu adalah faktor yang tepat.S3=x−1LxN3Σ∗LS2⊂S1⊂S3∩S1,S2,S3
Hence, our factorization set FL is of the form (P1,S1),(P2,S2),(P3,S3).
Now, for the left factors Pi, we use the equations of the beginning of this answer:
Pi=⋂x∈SiLx−1
.
For P1, this yields L∪Σ∗a, for P2 we get Σ∗ and for 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)