✖

Simulasi automaton tak berketentuan

Jika kita mempunyai automaton tak berketentuan dan mahu menentukan sama ada automaton itu menerima suatu rentetan, kita boleh menukarkannya kepada automaton berketentuan, kita boleh mencubanya dengan apa-apa cara, atau kita boleh menggunakan algoritma yang menyimulasikan kerja NFA.

Prinsip algoritma

Mari kita lihat prinsipnya melalui contoh yang sesuai. Katakan kita mempunyai automaton berikut:

Automaton ini ialah automaton terhingga tak berketentuan yang menerima suatu bahasa. Bahasa yang mana tidak penting buat masa ini. Kita akan melihat rupa pengiraan automaton ini bagi rentetan input 11001. Ideanya begini: kita memproses satu simbol daripada rentetan dan melihat semua keadaan yang boleh dicapai disebabkan peralihan berganda bagi simbol yang sama. Kita ingat semua keadaan itu, dan pada langkah seterusnya kita menganggap bahawa kita berada “dalam semua keadaan itu serentak”. Kemudian kita melihat ke mana kita boleh pergi dari keadaan-keadaan itu.

Jadi, kita mengingat set keadaan tempat kita mungkin berada serta bahagian rentetan yang belum dibaca. Pada mulanya kita mempunyai pasangan ⟨{q0}, 11001⟩. Kita bermula pada keadaan q0 (keadaan awal) dan input ialah rentetan 11001. Automaton kelihatan seperti berikut; keadaan tempat kita berada ditonjolkan dengan warna merah dan huruf tebal:

Simbol pertama ialah 1. Dari keadaan q0 hanya ada satu peralihan bagi simbol 1, jadi kita sampai ke keadaan q1. Kita ingat pasangan ⟨{q1}, 1001⟩. Automaton kelihatan seperti berikut:

Kita teruskan. Bahagian rentetan yang belum dibaca ialah 1001, jadi sekali lagi kita mencari peralihan bagi 1. Kali ini ada dua — kembali ke keadaan q0 dan ke keadaan q3. Sekarang kita pergi ke kedua-dua keadaan serentak. Kita ingat pasangan ⟨{q0, q3}, 001⟩.

Apakah logiknya? Kita tahu bahawa terdapat laluan dari keadaan awal dengan rentetan 11 ke keadaan q3 dan juga ke keadaan q0. Kita belum tahu cabang mana yang akan berguna, jadi kita ingat kedua-duanya. Kita teruskan. Input ialah simbol 0. Sekarang kita perlu melihat peralihan dari q0 dan juga dari q3. Dari keadaan q0 terdapat peralihan ke keadaan q1 dan q2, dan dari keadaan q3 terdapat peralihan kembali ke q1. Kita ambil kira semua keadaan ini dan memperoleh pasangan ⟨{q1, q2}, 01⟩:

Namun, langkah ini belum selesai. Kita lihat bahawa dari keadaan q2 terdapat peralihan epsilon ke keadaan q4. Kita tahu bahawa peralihan epsilon boleh diikuti “pada bila-bila masa” tanpa membaca aksara seterusnya. Dengan kata lain, tanpa membaca simbol seterusnya daripada rentetan input, kita masih boleh beralih ke keadaan q4. Oleh itu, kita menambahkan keadaan q4 kepada keadaan tempat kita mungkin berada: ⟨{q1, q2, q4}, 01⟩. Automaton diwarnakan seperti berikut:

Input seterusnya ialah 0. Kita lihat ke mana kita boleh beralih dari tiga keadaan tempat kita berada. Dari q1 kita tidak boleh beralih ke mana-mana kerana tiada peralihan bagi 0. Pengiraan dalam cabang ini berakhir. Dari keadaan q4 kita juga tidak dapat pergi ke mana-mana. Dari keadaan q2 kita kembali ke keadaan q2. Namun, oleh sebab terdapat peralihan epsilon dari keadaan q2 ke keadaan q4, kita juga boleh sampai ke keadaan q4. Jadi, dari set keadaan {q1, q2, q4}, bagi simbol 0 kita boleh sampai ke set keadaan {q2, q4}, dan kita memperoleh pasangan ⟨{q2, q4}, 1⟩:

Akhirnya input ialah simbol 1. Dari keadaan q2 kita tidak dapat pergi ke mana-mana, jadi pengiraan dalam cabang ini berakhir. Namun, dari keadaan q4 kita sampai ke keadaan q3 dan q5. Kita memperoleh pasangan ⟨{q3, q5}, ε⟩:

Kini automaton telah membaca keseluruhan rentetan dan “berada” dalam dua keadaan: q3, q5. Oleh sebab sekurang-kurangnya satu daripadanya ialah keadaan akhir, automaton menerima rentetan 11001.

Algoritma

Pertama sekali, kita memerlukan fungsi yang menerima set keadaan sebagai parameter dan mengira keadaan lain yang masih boleh dicapai melalui peralihan epsilon. Inputnya ialah automaton ⟨Q, Σ, δ, q0, F⟩ dan set keadaan States, manakala outputnya ialah superset bagi keadaan-keadaan ini yang mengandungi semua keadaan yang boleh dicapai melalui peralihan epsilon. Operasi ini dipanggil tutupan epsilon bagi set States.

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

Fungsi ini digunakan dalam fungsi yang menyimulasikan kerja automaton tak berketentuan. Inputnya ialah automaton, rentetan input w = w1w2… wn dan set keadaan tempat automaton sedang berada. Outputnya ialah jawapan YES (ya) atau NO (tidak), bergantung pada sama ada automaton menerima rentetan itu 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

Untuk menyemak sama ada automaton menerima rentetan w, kita memanggil fungsi seperti berikut: ComputeNFA(⟨Q, Σ, δ, q0, F⟩, w, EpsilonClosure(⟨Q, Σ, δ, q0, F⟩, {q0})).

Sumber

Kandungan: Automaton terhingga, Automaton lengkap, Automaton terhingga tak berketentuan, Simulasi automaton tak berketentuan, Penukaran NFA kepada DFA