Deterministik Olmayan Otomatın Benzetimi
Elimizde deterministik olmayan bir otomat varsa ve verilen sözcüğü kabul edip etmediğini öğrenmek istiyorsak otomatı deterministik otomata dönüştürebiliriz, bir şekilde deneyebiliriz ya da NSO’nun çalışmasını benzetecek bir algoritma kullanabiliriz.
Algoritmanın İlkesi
İlkeyi uygun bir örnek üzerinde gösterelim. Şu otomatı ele alalım:
Bu, bir dili kabul eden deterministik olmayan sonlu otomattır. Hangi dili kabul ettiği şu an hiç önemli değil. Böyle bir otomatın 11001 giriş sözcüğü için hesaplamasının nasıl görünebileceğini göstereceğiz. Mantık şöyle: sözcükten bir sembol işleriz ve aynı sembol için birden fazla geçiş olduğundan nerelere gidebileceğimize bakarız. Bu durumların hepsini aklımızda tutarız; sonraki adımda artık “bu durumların hepsinde aynı anda” olduğumuzu varsayarız ve bu durumlardan başka nerelere gidebileceğimizle ilgileniriz.
Böylece bulunabileceğimiz durumlar kümesini ve sözcüğün okunmamış kısmını aklımızda tutacağız. Başlangıçta elimizde ⟨{q0}, 11001⟩ ikilisi var. q0 durumunda (başlangıç durumu) başlarız ve girişte 11001 sözcüğü vardır. Otomat şöyle görünür; içinde bulunduğumuz durum kırmızı ve kalın olarak vurgulanmıştır:
İlk sembol 1’dir; q0 durumundan 1 sembolü için yalnızca bir geçiş vardır, dolayısıyla q1 durumuna geçeriz. ⟨{q1}, 1001⟩ ikilisini aklımızda tutarız. Otomat şöyle görünür:
Devam edelim. Sözcüğün okunmamış kısmı 1001 olduğundan yine 1 için geçişleri ararız. Bu kez iki geçiş var — geri q0 durumuna ve ayrıca q3 durumuna. Şimdi iki duruma aynı anda gideriz. Böylece ⟨{q0, q3}, 001⟩ ikilisini aklımızda tutarız.
Bunun mantığı ne? Başlangıç durumundan 11 sözcüğüyle hem q3 durumuna hem q0 durumuna ulaşan bir yol olduğunu biliyoruz. Hangi dalın işimize yarayacağını henüz bilmiyoruz, o halde ikisini de aklımızda tutarız. Devam edelim. Girişte 0 sembolü var. Şimdi hem q0 durumundan hem de q3 durumundan çıkan geçişlere bakmalıyız. q0 durumundan q1 ve q2 durumlarına geçişler çıkıyor, q3 durumundan ise geri q1 durumuna bir geçiş çıkıyor. Bu durumların hepsini hesaba katarız ve ⟨{q1, q2}, 01⟩ ikilisini elde ederiz:
Ama bu adımı henüz bitirmedik. q2 durumundan q4 durumuna bir ε-geçişi çıktığını görüyoruz. ε-geçişi üzerinden “istediğimiz zaman gidebileceğimizi”, yani bunun için sonraki karakteri okumamız gerekmediğini biliyoruz. Başka bir deyişle, giriş sözcüğünden bir sonraki sembolü okumadan q4 durumuna da geçebiliriz. Bu yüzden q4 durumunu da bulunabileceğimiz durumlara ekleriz: ⟨{q1, q2, q4}, 01⟩. Otomatı şöyle renklendiririz:
Sonra girişte 0 var. Bulunduğumuz bu üç durumdan nereye geçebileceğimize bakarız. q1 durumundan hiçbir yere geçemeyiz, çünkü 0 için geçiş yok. Bu daldaki hesaplama biter. q4 durumundan da hiçbir yere gidemeyiz. q2 durumundan yine q2 durumuna geçebiliriz. Ama q2 durumundan yine q4 durumuna bir ε-geçişi çıktığı için q4 durumuna da gidebiliriz. Böylece {q1, q2, q4} durumlar kümesinden 0 sembolü için {q2, q4} durumlar kümesine gidebiliriz ve ⟨{q2, q4}, 1⟩ ikilisini elde ederiz:
Son olarak girişte 1 sembolü var. q2 durumundan hiçbir yere gidemeyiz, bu daldaki hesaplama biter. Ama q4 durumundan q3 ve q5 durumlarına gidebiliriz. ⟨{q3, q5}, ε⟩ ikilisini elde ederiz:
Otomat artık sözcüğün tamamını okudu ve iki durumda “bulunuyor”: q3, q5. Bunlardan en az biri kabul durumu olduğu için otomat 11001 sözcüğünü kabul eder.
Algoritma
İlk olarak, parametre olarak bir durumlar kümesi alan ve ε-geçişleriyle ayrıca hangi durumlara gidebileceğimizi hesaplayan bir fonksiyona ihtiyacımız var. Girdi, ⟨Q, Σ, δ, q0, F⟩ otomatı ile States durumlar kümesidir; çıktı ise bu durumların, ε-geçişleriyle ulaşılabilen durumları da içeren üst kümesidir. Bu işleme States kümesinin ε-kapanışı diyeceğiz.
Bu fonksiyonu, deterministik olmayan otomatın çalışmasını benzetecek fonksiyonda kullanacağız. Girdiler otomat, w = w1w2… wn giriş sözcüğü ve otomatın o anda bulunduğu durumlar kümesidir. Çıktı, otomatın verilen sözcüğü kabul edip etmemesine göre Evet ya da Hayır yanıtıdır.
Otomatın w sözcüğünü kabul edip etmediğini denetlemek istiyorsak fonksiyonu şöyle çağırırız: ComputeNFA(⟨Q, Σ, δ, q0, F⟩, w, EpsilonClosure(⟨Q, Σ, δ, q0, F⟩, {q0})).
Kaynaklar
Bölümler: Sonlu Otomat, Tam Otomat, Deterministik Olmayan Sonlu Otomat, Deterministik Olmayan Otomatın Benzetimi, NSO’dan DSO’ya Dönüştürme