Menghitung kata-kata yang diterima oleh tata bahasa biasa

26

Diberi bahasa reguler (NFA, DFA, grammar, atau regex), bagaimana cara menghitung jumlah kata yang menerima dalam bahasa tertentu? Keduanya "dengan tepat n huruf" dan "dengan paling banyak n huruf" menarik.

Margareta Ackerman memiliki dua makalah tentang masalah terkait penghitungan kata-kata yang diterima oleh NFA, tetapi saya tidak dapat memodifikasinya untuk menghitung secara efisien.

Sepertinya sifat terbatas dari bahasa biasa seharusnya membuat penghitungannya relatif mudah - Saya hampir mengharapkan rumus lebih dari satu algoritma. Sayangnya pencarian saya sejauh ini belum menghasilkan apa-apa, jadi saya harus menggunakan istilah yang salah.

Charles
sumber
Saya kira Anda berarti "jumlah kata yang menerima ukuran ", atau sesuatu seperti itu? selain itu, berapakah jumlah kata yang diterima untukΣ nΣ
Suresh Venkat

Jawaban:

37

Untuk DFA, di mana keadaan awal adalah keadaan , jumlah kata dengan panjang yang berakhir pada keadaan adalah , di mana adalah matriks transfer DFA (matriks di mana angka pada baris dan kolom adalah jumlah simbol input yang berbeda yang menyebabkan transisi dari status ke status ). Jadi, Anda dapat menghitung kata-kata yang menerima panjang persis dengan mudah, bahkan ketika cukup besar, hanya dengan menghitung kekuatan matriks dan menambahkan entri yang sesuai dengan negara penerima.k i A k [ 0 , i ] A i j i j k k0kiAk[0,i]Aijijkk

Hal yang sama berfungsi untuk menerima kata-kata panjang paling banyak , dengan matriks yang sedikit berbeda. Tambahkan baris dan kolom tambahan dari matriks, dengan satu di sel yang ada di baris dan kolom, satu di baris baru dan kolom dari kondisi awal, dan nol di semua sel lainnya. Efek dari perubahan ini ke matriks adalah menambahkan satu jalur lagi ke keadaan awal pada setiap daya.k

Ini tidak berfungsi untuk NFA. Saya menduga hal terbaik untuk dilakukan adalah hanya mengkonversi ke DFA dan kemudian menerapkan algoritma powering matrix.

David Eppstein
sumber
2
Jawaban sempurna: hanya jelas setelah Anda membacanya.
Charles
1
Pendekatan ini memiliki runtime kasus terburuk eksponensial jika Anda memiliki input selain DFA. Apakah ini bukan masalah bagi Anda, @Charles? Anda sepertinya memasukkan ekspresi reguler, NFA, dan tata bahasa dalam pertanyaan Anda, dan juga meminta cara yang efisien.
Raphael
17

Biarkan menjadi otomatisasi terbatas (nondeterministic) dengan keadaan awal , dan .q 1 Q FQ δ Q × Σ × QA=(Q={q1,,qn},Σ,δ,QF)q1QFQδQ×Σ×Q

Misalkan fungsi pembangkit untuk semua kata yang dapat diterima mulai dari , yaitu koefisien ke- dari ekspansi.q i n [ z n ] Q i = | { w | w | = n w  diterima dari  q i } |Qi(z)qin[zn]Qi=|{w|w|=nw accepted from qi}|

Jelas:

Qi(z)=[qiQF]+(qi,a,qj)δxQj(z)

Selesaikan sistem persamaan (linier) yang dihasilkan untuk (menggunakan Mathematica atau alat serupa). Kemudian, adalah jumlah yang diinginkan. [ z n ] Q 1Q1[zn]Q1

Ini kembali ke teknik yang diperkenalkan untuk tata bahasa oleh Chomsky dan Schützenberger (1963); dengan mudah mentransfer ke automata terbatas.

Sunting: Jika Anda ingin memperhitungkan -transisi, tinggalkan saja faktor dalam jumlah untuk transisi yang sesuai. Demikian pula, jika Anda memiliki tepi "terkompresi", yaitu sebagai ganti simbol kata pada transisi, ganti dengan .x a Σ w Σ k x x kεxaΣwΣkxxk

Raphael
sumber
Saya menghargai catatan sejarah!
Charles
1
Eh, ini sebenarnya metode yang bekerja sangat baik (dan sederhana, setelah Anda mendapatkannya) dalam banyak keadaan. Misalnya, Anda dapat melakukan CFG dengan cara yang persis sama.
Raphael
1
Begitu, saya salah paham. Dalam hal ini, jika Anda ingin membaca ini, saya merekomendasikan Kuich (1970) yang saya temukan lebih mudah diakses daripada karya C&S. Dia juga membahas ini dalam sebuah bukunya yang saya tidak ingat.
Raphael
1
Apakah Anda mengatakan bahwa Anda dapat menghitung kata-kata dengan panjang dalam bahasa reguler dalam waktu polinomial dan tanpa membuat DFA? Ditanya tentang kerumitan ini di MO: mathoverflow.net/questions/162186/…n
joro
1
@Joro Dalam hal tata bahasa yang tidak ambigu, saya pikir ini benar, ya.
Raphael
7

Saya pikir ini adalah masalah penghitungan yang sulit, lihat makalah ini: Menghitung ukuran urutan teratur panjang yang diberikan adalah # P-lengkap: S. Kannan, Z. Sweedyk, dan SR Mahaney. Menghitung dan menghasilkan string secara acak dalam bahasa reguler. Dalam ACM-SIAM Simposium tentang Algoritma Diskrit (SODA), halaman 551–557, 1995.

Miklós István
sumber
1
Posting di atas mengasumsikan bahwa panjang yang diberikan tidak sama. Jika alih-alih panjangnya dalam biner, masalahnya adalah PSPACE-hard. Saya mengatakan ini berdasarkan bukti bahwa menentukan kesetaraan dua ekspresi reguler adalah PSPACE-hard. Dalam pengurangan itu, satu reg-dibangun untuk menerima semua string, dan yang lain untuk menerima semua string yang tidak valid menolak sejarah perhitungan mesin PSPACE M pada input w. Menggunakan ekspresi reguler kedua dan panjang sejarah perhitungan M on w sebagai input untuk masalah yang dipermasalahkan membuat masalah lain ini juga PSPACE-hard.
Mikhail Rudoy
3

#NC1

SamiD
sumber