✖

Simulasi otomaton nondeterministik

Jika kita memiliki otomaton nondeterministik dan ingin mengetahui apakah otomaton tersebut menerima suatu string, kita dapat mengonversinya menjadi otomaton deterministik, mencobanya dengan cara tertentu, atau menggunakan algoritma yang menyimulasikan kerja NFA.

Prinsip algoritma

Prinsipnya akan kita tunjukkan dengan contoh yang sesuai. Misalkan ada otomaton berikut:

Ini adalah otomaton hingga nondeterministik yang menerima suatu bahasa. Bahasa apa, sama sekali tidak penting sekarang. Kita akan melihat seperti apa komputasi otomaton ini untuk string input 11001. Idenya begini: kita memproses satu simbol dari string dan melihat ke mana saja kita dapat pergi berkat adanya beberapa transisi untuk simbol yang sama. Semua state tersebut kita ingat, dan pada langkah berikutnya kita anggap bahwa kita berada “di semua state itu sekaligus”, lalu kita cari ke mana saja kita dapat melanjutkan dari state-state tersebut.

Jadi, kita mengingat himpunan state tempat kita mungkin berada dan bagian string yang belum dibaca. Pada awalnya, kita memiliki pasangan ⟨{q0}, 11001⟩. Kita mulai dari state q0 (state awal), dan inputnya adalah string 11001. Otomatonnya terlihat seperti ini; state tempat kita berada ditandai dengan warna merah dan cetak tebal:

Simbol pertama adalah 1. Dari state q0 hanya ada satu transisi untuk simbol 1, sehingga kita sampai di state q1. Kita ingat pasangan ⟨{q1}, 1001⟩. Otomatonnya terlihat seperti ini:

Kita lanjutkan. Bagian string yang belum dibaca berbentuk 1001, jadi kita kembali mencari transisi untuk 1. Kali ini ada dua — kembali ke state q0 dan ke state q3. Sekarang kita pergi ke kedua state sekaligus. Jadi, kita ingat pasangan ⟨{q0, q3}, 001⟩.

Apa logikanya? Kita tahu bahwa ada jalur dari state awal dengan string 11 ke state q3 maupun ke state q0. Kita belum tahu cabang mana yang akan berguna, jadi kita ingat saja keduanya. Kita lanjutkan. Inputnya adalah simbol 0. Sekarang kita harus memperhatikan transisi dari q0 maupun transisi dari q3. Dari state q0 ada transisi ke state q1 dan q2, sedangkan dari state q3 ada transisi kembali ke q1. Semua state ini kita masukkan, sehingga diperoleh pasangan ⟨{q1, q2}, 01⟩:

Namun, langkah ini belum selesai. Terlihat bahwa dari state q2 ada transisi epsilon ke state q4. Kita tahu bahwa transisi epsilon dapat “diambil kapan saja” tanpa membaca karakter berikutnya. Dengan kata lain, tanpa membaca simbol berikutnya dari string input, kita masih dapat berpindah ke state q4. Jadi, state q4 kita tambahkan ke state-state tempat kita mungkin berada: ⟨{q1, q2, q4}, 01⟩. Otomatonnya kita warnai seperti ini:

Input berikutnya adalah 0. Kita lihat ke mana kita dapat berpindah dari ketiga state tempat kita berada. Dari q1 kita tidak dapat berpindah ke mana pun karena tidak ada transisi untuk 0. Komputasi pada cabang ini berakhir. Dari state q4 kita juga tidak dapat ke mana-mana. Dari state q2 kita kembali ke state q2. Namun, karena dari state q2 ada transisi epsilon ke state q4, kita juga dapat sampai di state q4. Jadi, dari himpunan state {q1, q2, q4} untuk simbol 0 kita dapat sampai di himpunan state {q2, q4}, dan diperoleh pasangan ⟨{q2, q4}, 1⟩:

Terakhir, inputnya adalah simbol 1. Dari state q2 kita tidak dapat ke mana pun, sehingga komputasi pada cabang ini berakhir. Namun, dari state q4 kita dapat sampai di state q3 dan q5. Diperoleh pasangan ⟨{q3, q5}, ε⟩:

Sekarang otomaton sudah membaca seluruh string dan “berada” di dua state: q3, q5. Karena setidaknya salah satunya adalah state akhir, otomaton menerima string 11001.

Algoritma

Pertama, kita memerlukan fungsi yang menerima himpunan state sebagai parameter dan menghitung state mana saja yang masih dapat dicapai melalui transisi epsilon. Jadi, inputnya adalah otomaton ⟨Q, Σ, δ, q0, F⟩ dan himpunan state States, sedangkan outputnya adalah superhimpunan dari state-state tersebut, berisi state yang dapat dicapai melalui transisi epsilon. Operasi ini disebut penutup epsilon dari himpunan States.

FunctionEpsilonClosure(⟨Q,Σ,δ,q0,F⟩,States)NextStates←∅ForEachq∈StatesDoNextStates←NextStates∪{q}∪δ(q,ε)EndForIfNextStates∖States=∅DoReturnStatesElseReturnEpsilonClosure(⟨Q,Σ,δ,q0,F⟩,NextStates)EndIfEndFunction

Fungsi ini kita gunakan dalam fungsi yang menyimulasikan kerja otomaton nondeterministik. Inputnya adalah otomaton, string input w = w1w2… wn, dan himpunan state tempat otomaton saat ini berada. Outputnya adalah jawaban Ya atau Tidak, bergantung pada apakah otomaton menerima string tersebut atau tidak.

FunctionComputeNFA(⟨Q,Σ,δ,q0,F⟩,w,States)Ifw=ϵDoIfStates∩F≠∅DoReturnYESElseReturnNOEndIfEndIfNextStates←∅ForEachq∈StatesDoNextStates←NextStates∪δ(q,w1)EndForNextStates←EpsilonClosure(⟨Q,Σ,δ,q0,F⟩,NextStates)ReturnComputeNFA(⟨Q,Σ,δ,q0,F⟩,w2w3…wn,NextStates)EndFunction

Jika ingin memeriksa apakah otomaton menerima string w, kita panggil fungsinya seperti ini: ComputeNFA(⟨Q, Σ, δ, q0, F⟩, w, EpsilonClosure(⟨Q, Σ, δ, q0, F⟩, {q0})).

Sumber

Daftar isi: Otomaton hingga, Otomaton lengkap, Otomaton hingga nondeterministik, Simulasi otomaton nondeterministik, Konversi NFA ke DFA