Mengapa tidak mudah untuk menghitung jumlah kata dalam bahasa biasa?

8

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

pengguna67573
sumber
3
εbukan bahasa tak terbatas.
David Richerby

Jawaban:

12

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:

  • 1 kata berakhir pada status awal: ϵ
  • Untuk setiap negara bagian q, jumlah kata yang berakhir di sana adalah jumlah dari jumlah kata yang berakhir di setiap negara bagian dengan transisi ke q.

Jumlah total kata adalah jumlah dari jumlah kata yang berakhir pada setiap kondisi akhir.

Ya ampun
sumber
2
Perlu dicatat bahwa rekurensi ini selalu dapat diselesaikan dengan aljabar komputer, misalnya untuk fungsi pembangkit. Jadi ya, bahasa biasa yang sebenarnya mudah untuk menghitung.
Raphael
9

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 a Q×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 1Fmenjadi indikator untuk masing-masing negara bagian dan negara penerima. Akhirnya, biarkann=|Q|.

Jumlah kata-kata panjang m adalah cm:=1FMm1q0. Menghitungcm untuk 0m<2n. Jikacn++c2n1>0maka bahasa yang diterima oleh DFA tidak terbatas. Kalau tidak, jumlah kata dalam bahasa adalahc0++cn1.

(Ketika kekuatan komputasi M, harus diperhatikan tentang besarnya entri, yang bersifat eksponensial dalam m. Karena ukurannya hanya polinomial, algoritma yang dihasilkan berjalan dalam waktu polinomial.)

Yuval Filmus
sumber
2
Saya suka pendekatan ini. Saya juga menemukan bahwa menghitung nilai eigen dariMsebenarnya sesuai dengan akar penyebut dalam pendekatan fungsi pembangkit, dan bahwa, mungkin tidak mengejutkan, nilai-nilai eigen ini tidak berubah dari minimalisasi DFA. Namun, saya sama sekali tidak tahu bagaimana menafsirkan ini dengan benar.
Lee
1
Ini tidak begitu mengejutkan, mengingat bahwa fungsi pembangkitnya adalah P(z)=n=01FMn1q0zn, yang disederhanakan menjadi P(z)=1F(IzM)11q0. Anda bisa mendapatkan hasil yang lebih eksplisit dengan mengulangi perhitungan ini menggunakan bentuk Jordan dariM, yang menampilkan nilai eigen.
Yuval Filmus
7

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:

eRe:=xΣe0 e1e0+e1e

Pertimbangkan terjemahan berikut [[]]:ReC(z) yang mengambil ekspresi reguler dan menerjemahkannya ke dalam fungsi rasional bernilai kompleks:

[[xΣ]]=z[[e0 e1]]=[[e0]]×[[e1]][[e0+e1]]=[[e0]]+[[e1]][[e]]=11[[e]]

Kami dapat menunjukkan bahwa terjemahan ini mengembalikan ekspresi rasional dengan melakukan induksi struktural e, dan mencatat bahwa semua operasi yang digunakan di sisi kanan menjaga rasionalitas.

Misalkan kalimat biasa e 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 (ab), yang mendefinisikan bahasa run dari a dibatasi oleh b. Sekarang, ekspresi reguler ini tidak ambigu, sehingga kami dapat menjalankan trik terjemahan kami:

[[(ab)]]=11[[ab]]=11([[a]]×[[b]])=11(11[[a]]×z)=11z1z=12+124z

Ternyata, mengingat fungsi pembangkit di atas, ekstraksi koefisiennya akan menjadi

[zn][[(ab)]]=2n1+δ(n)2
dimana
δ(n)={1if n=00otherwise

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

r(z)+p(z)q(z)
dimana r,p,q adalah polinomial, maka Anda dapat menguraikannya menjadi
r(z)+C0zq0++Cnzqn
dimana qk adalah akar dari q(z). Ada sedikit kasus sudut teknis (seperti banyaknya akar, dll), tetapi relatif mudah dilakukan ekstraksi koefisien pada ungkapan di atas:
[zn]Czq=C×qn

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 ada n adan m bs? "

Sayangnya, sejauh mana metode ini akan berguna berakhir ketika Anda memiliki ekspresi ambigu.

Lee
sumber