Diberi DFA, A, misalkan L (A) menunjukkan jumlah kata yang diterima A. Saya pikir mudah untuk menghitung L (A): Terjemahkan pengkodean A ke dalam ekspresi reguler. Jika bintang Kleene muncul di mana saja dalam ekspresi - bahasanya tidak terbatas. Lain: Periksa dan hitung semua kombinasi kata yang memungkinkan untuk dibuat menggunakan ekspresi (pada dasarnya jika ada operator + pada ekspresi, kalikan jumlah kata hukum dengan jumlah string yang dihubungkan oleh + ..)
Apakah ini salah? Terima kasih sebelumnya
regular-languages
automata
regular-expressions
pengguna67573
sumber
sumber
Jawaban:
Yap, ini salah, karena ambiguitas.
Pertimbangkan bahasa berikut:(a+aa)+a(a+ϵ) .
Dengan metode Anda, kami melihat 4 kata,a,aa,aa,a . Tapi kami punya duplikat! Ada beberapa cara untuk membuat kata yang sama dalam ekspresi reguler yang diberikan.
Metode yang lebih baik adalah dengan menggunakan pemrograman dinamis pada DFA minimal untuk bahasa Anda, tanpa status "mati". Jika DFA minimal adalah siklik, bahasanya tidak sempurna, jadi kita dapat mengasumsikan tidak ada siklus. Menggunakan DFA adalah kuncinya, karena determinisme berarti hanya ada satu jalur melalui DFA untuk setiap kata.
Apa yang Anda lakukan adalah membangun pengulangan untuk jumlah kata yang berakhir pada kondisi tertentu:
Jumlah total kata adalah jumlah dari jumlah kata yang berakhir pada setiap kondisi akhir.
sumber
Melengkapi jawaban jmite, tidak terlalu sulit untuk menghitung jumlah kata dalam bahasa reguler, menggunakan metode "transfer matrix". Ini sama dengan pemrograman dinamis jmite, tetapi teknik ini memiliki aplikasi lebih lanjut seperti enumerasi asimptotik.
Diberi DFA, buat aQ×Q matriks M (dimana Q adalah himpunan negara) di mana M(i,j) adalah jumlah huruf yang menyebabkan DFA pindah dari negara j untuk menyatakan i . Membiarkan1q0 dan 1F menjadi indikator untuk masing-masing negara bagian dan negara penerima. Akhirnya, biarkann=|Q| .
Jumlah kata-kata panjangm adalah cm:=1FMm1q0 . Menghitungcm untuk 0≤m<2n . Jikacn+⋯+c2n−1>0 maka bahasa yang diterima oleh DFA tidak terbatas. Kalau tidak, jumlah kata dalam bahasa adalahc0+⋯+cn−1 .
(Ketika kekuatan komputasiM , harus diperhatikan tentang besarnya entri, yang bersifat eksponensial dalam m . Karena ukurannya hanya polinomial, algoritma yang dihasilkan berjalan dalam waktu polinomial.)
sumber
Sebenarnya, Anda masih dapat memperoleh rumus penghitungan untuk ekspresi reguler yang tidak ambigu dengan bintang-bintang Kleene di dalamnya.
Diberi definisi induktif dari ekspresi reguler sebagai:
Pertimbangkan terjemahan berikut[[⋅]]:Re→C(z) yang mengambil ekspresi reguler dan menerjemahkannya ke dalam fungsi rasional bernilai kompleks:
Kami dapat menunjukkan bahwa terjemahan ini mengembalikan ekspresi rasional dengan melakukan induksi strukturale , dan mencatat bahwa semua operasi yang digunakan di sisi kanan menjaga rasionalitas.
Misalkan kalimat biasae yang kita masukkan tidak ambigu, maka kita akan menemukan bahwa fungsi rasional dilambangkan dengan [[e]]∈C(z) sebenarnya adalah fungsi pembangkit untuk keluarga kata-kata yang diterima oleh bahasa yang mendasarinya e , diurutkan berdasarkan panjangnya.
Misalnya, pertimbangkan bahasanya(a∗b)∗ , yang mendefinisikan bahasa run dari a dibatasi oleh b . Sekarang, ekspresi reguler ini tidak ambigu, sehingga kami dapat menjalankan trik terjemahan kami:
Ternyata, mengingat fungsi pembangkit di atas, ekstraksi koefisiennya akan menjadi
Bahkan, sejak terjemahan kami[[⋅]] menghasilkan fungsi rasional, kita dapat menggunakan dekomposisi fraksi parsial untuk membuat rumus enumerasi untuk setiap ekspresi reguler yang tidak ambigu.
Misalkan Anda memiliki fungsi rasional yang tidak dapat direduksi
Bahkan, dekomposisi fraksi parsial menggeneralisasi ke fungsi rasional multivariat, sehingga Anda benar-benar dapat membuat rumus penghitungan untuk kueri seperti "Berapa banyak kata yang ada di mana adan m
a
danb
s? "Sayangnya, sejauh mana metode ini akan berguna berakhir ketika Anda memiliki ekspresi ambigu.
sumber