Trik pertama di sini adalah menganggap tabel perkalian sebagai tabel transisi dari automaton dengan setiap negara bagian mewakili huruf dalam tabel perkalian Anda, tetapi belum mengkhawatirkan penerimaan. Jadi huruf-huruf di sebelah kiri dan di badan tabel sebenarnya menyatakan - akan lebih akurat untuk menuliskannya sebagai , tapi aku tidak mau. Huruf-huruf di atas adalah input.q a , q b , q cAqa,qb,qc
Kemudian buat otomat (" " untuk transpos) untuk perkalian terbalik dengan mentransposisi : T AATTA
SEBUAHTSebuahbcSebuahSebuahSebuahcbcSebuahbcbcSebuah
Jadi membawa Anda ke status , dan juga pindah ke keadaan dari , seperti yang Anda perhatikan.c A T ( c b a ) a A TA ( a b c )cSEBUAHT( C b a )SebuahSEBUAHT
Namun, mengasumsikan Anda akan kanan-ke-kiri, dan kami masih ingin ke kiri-ke-kanan. Jadi trik kedua adalah membalikkan otomat (bukan perkalian, yang hanya akan membuat kita kembali begitu kita mulai), dengan membalikkan semua panah, yang mengarah ke otomat non-deterministik diberikan oleh tabel transisi di bawah ini, dengan himpunan bagian ditunjukkan dengan huruf gabungan untuk menjaga ayam menggaruk, jadi benar-benar . (Kuharap aku baik-baik saja - sepertinya berhasil).A T R a c { a , c }SEBUAHTATRac{a,c}
ATRabcabbcacabc∅aab∅cabcabcabc∅bbcabcacababc∅ccabacabcbcabc∅
Anda dapat menafsirkan ini sebagai otomat non-deterministik dengan hanya tiga baris di atas garis atau versi yang ditentukan dengan semua 8 baris.
Akhirnya, mesin untuk menyelesaikan masalah adalah otomat lintas-produk dari dan , yaitu untuk melakukan perilaku persimpangan dua automata (kita tidak perlu apa pun lebih). memiliki status yang berpasangan seperti . Fungsi transisi menjalankan dan secara independen. Status awal tunggal masuk ke bawah input , ke bawah input , dll. A T R A × A T R A T A × A T R ⟨ a , a c ⟩ A A T R ⟨ 1 , 1 ⟩ ⟨ sebuah , sebuah ⟩ sebuah ⟨ b , b ⟩ bAATRA×ATRATA×ATR⟨a,ac⟩AATR⟨1,1⟩⟨a,a⟩a⟨b,b⟩b
Status penerima dalam versi non-deterministik adalah dll. Dalam versi deterministik, state penerima adalah pasangan di mana komponen pertama dari set komponen kedua, seperti atau .∈ ⟨ sebuah , sebuah ⟩ ⟨ b , b c ⟩⟨a,a⟩∈⟨a,a⟩⟨b,bc⟩
25 = 3 ⋅ 8 + 1 10 = 3 ⋅ 3 + 1A×ATR ditambah dan ditentukan seperti yang ditunjukkan memiliki menyatakan, jadi maafkan saya jika saya tidak menuliskannya secara rinci. Tetapi versi non-deterministik hanya memiliki status.25=3⋅8+110=3⋅3+1
L L R L(∗) Jika adalah bahasa biasa, maka , bahasa yang terdiri dari kebalikan dari semua kata dalam , juga teratur. Anggap ini sebagai latihan.L LR L
Bagaimana ini membantu kami memecahkan masalah? Biarkan menjadi bahasa yang terdiri dari semua string yang mengevaluasi ke ketika mengevaluasi dari kiri ke kanan. Bahasa yang Anda minati adalah Ini menunjukkan bahwa jika Anda tahu cara membuktikan , maka Anda dapat membuat NFA untuk bahasa yang dimaksud. a , b , c ( L a ∩ L R a ) ∪ ( L b ∩ L R b ) ∪ ( L c ∩ L R c c ) . ( ∗ )La,Lb,Lc a,b,c
Bahkan, jika Anda menggunakan ide pembuktian , maka Anda mungkin bisa langsung saja membangun automaton. Jadi mari kita pertimbangkan ini. Secara khusus, mari kita coba membangun NFA untuk , bahasa semua string yang dievaluasi ketika dievaluasi dari kanan ke kiri.L R a a(∗) LRa a
Idenya adalah ini. Misalkan huruf pertama yang Anda lihat adalah . Maka sisa string harus dievaluasi menjadi (karena menyiratkan ). Alasan yang sama berlaku ketika huruf pertama adalah . Namun, ketika huruf pertama adalah , sisanya dapat mengevaluasi ke atau , atau menjadi nol. Dengan NFA, kita bisa menebak (dan nanti memverifikasi tebakan kita).b b x = a x = b c a ab b bx=a x=b c a a b
Petunjuk ini harus memberi Anda cukup untuk dipikirkan, dan mudah-mudahan menyelesaikan masalah.
sumber
Imut.
Pertama, buat otomat yang menghitung produk dari kiri ke kanan. Mudah! Letakkan transisi setiap kali . Ada tiga status mewakili tiga produk yang mungkin. Mulai dalam keadaan keempat dengan untuk semua . Keadaan akhir adalah jika dan hanya jika produk dari kata input dari kiri ke kanan adalah .x→−→yz→ x⋅y=z {a→,b→,c→} 1→ 1→−→−xx→ x x→ x
Sekarang mari kita membangun otomat yang menghitung produk dari kanan ke kiri. Ini akan menjadi non-deterministik. Bagaimana kita melakukannya? Sederhana ... Untuk menuju ke arah lain, balikkan semuanya : panah dan arah produk.
Tambahkan simpul terputus demi kata kosong. Semua node adalah inisial.1←
Sekarang kita perlu menghitung kedua jalur secara bersamaan, jadi kita mengambil produk dari kedua automata: iff dan . Biarkan empat status menjadi awal, dan empat status menjadi final. Sebuah kata dikenali oleh robot non-deterministik ini jika produknya dari kiri ke kanan dan produknya dari kanan ke kiri adalah sama .(x1→,x2←)−→y(z1→,z2←) x1→−→yz1→ x2←−→yz2← (1→,x←) (x→,x←) x
sumber
Tampaknya masalah utama Anda adalah memanfaatkan nondeterminisme, jadi izinkan saya menjelaskannya.
Biarkan kami mempertimbangkan contoh kecil Anda dan ide konstruksi Gilles. Otomat "menghitung" produk kanan-ke-kiri menebak hasilnya di awal dan memverifikasinya . Jadi ada tiga kemungkinan:abc
Seperti yang Anda lihat, NFA dapat menebak dan memeriksa setiap kemungkinan perhitungan dari bawah ke atas . Karena bahasa yang diterima didefinisikan sebagai set string yang diterima oleh setidaknya satu kali dijalankan , semua berjalan yang tidak menerima pada input diabaikan; NFA "selalu menebak dengan benar".
Sekarang mudah bagi NFA ini untuk mengingat pilihan pertamanya hingga akhir. Jika menerimanya, ia dapat membandingkan simbol yang diingat dengan produk-lr (secara deterministik) yang diperoleh secara paralel (bagaimana persimpangan bahasa berhubungan dengan NFA pasti tercakup dalam Ullman / Hopcroft, dan buku teks dasar lainnya).
sumber