✖

Sonlu Otomat

Sonlu otomat (İngilizce finite state machine ya da finite automaton), birkaç durumdan ve birkaç geçişten oluşan, kendisine verilen sözcüğü kabul edebilen ya da reddedebilen ilkel bir bilgisayarın hesaplama modelidir.

Örnek

Sonlu otomatı önce resmî olmayan biçimde, onu betimleyen bir durum diyagramı yardımıyla anlatalım:

Basit bir sonlu otomat örneği

Otomat durumlardan oluşur; şekilde q0, q1 ve q2 olmak üzere üç yuvarlak durum var. Bu durumlar arasında geçişler vardır; bunlar oklardır. Otomatta ayrıca bir başlangıç durumu olmalıdır; burada bu, q0 durumudur. Başlangıç durumu genellikle, hiçbir durumdan çıkmayıp ona yönelen bir okla gösterilir. Otomatta ayrıca genellikle bir kabul durumu bulunur; bunu çift çizgiyle gösteririz, şekilde bu q2 durumudur.

Böyle kurulmuş otomat bazı sözcükleri kabul eder. Otomata sözcükler veririz ve otomat bu sözcükleri kabul etmeyi dener. Kabul ederse otomat EVET, etmezse HAYIR yanıtını verir. Örnek otomatımız “a, b, c” harflerinden oluşan sözcükleri kabul etmeyi dener; o hâlde “abbc” sözcüğünü deneyebiliriz.

Başlangıç durumu q0’da başlarız ve girişte “abbc” sözcüğü vardır. Bundan sonra oklara göre ilerleriz.

Sözcüğü her zamanki gibi soldan sağa okuruz; yani ilk olarak “a” sembolünü alırız. “a” girişi için ok q1 durumuna gider, biz de oraya geçeriz ve “a” sembolünü sözcükten sileriz. Girişte “bbc” sözcüğü kalır:

“b” girişi için ok yine q1 düğümüne geri döner. İlk harfi yine sileriz ve girişte “bc” sözcüğü kalır. Yine q1 durumunda kalırız. Sonunda girişte “c” sözcüğü kalır. q1 durumundan “c” girişi için giden ok bizi q2 durumuna götürür.

Giriş sözcüğündeki tüm harfleri tükettik ve kabul durumu olan q2 durumundayız. Demek ki bu sonlu otomat “abbc” sözcüğünü kabul eder.

Sonunda kabul durumunda olmasaydık, otomat sözcüğü kabul etmezdi. Aynı şekilde, herhangi bir durumda gidecek yer bulamasaydık da otomat sözcüğü kabul etmezdi. Örneğin “ab” girişi için q1 durumuna gelir ve orada kalırdık — otomat böyle bir sözcüğü kabul etmez. “aabbc” sözcüğünü denersek yine şansımız yaver gitmez, çünkü q1 durumundan “a” harfi için giden bir ok yoktur.

Sonlu otomat böylece belirli bir sözcük kümesini tanımaya yarar. Uygulamada otomatı örneğin verilen giriş sözcüğünün geçerli bir e-posta olup olmadığını anlamak için kullanabilirdik.

Sonlu Otomatın Tanımı

Sonlu otomatın ne olduğuna dair önceki sezgisel fikri biçimlendirmemiz gerekir; ancak o zaman otomatlarla daha iyi çalışabiliriz.

Sonlu (deterministik) otomat, şu özelliklere sahip bir ⟨Q, Σ, δ, q0, F⟩ beşlisidir:

  • Q sonlu bir durumlar kümesidir,
  • Σ (büyük sigma) alfabedir (sonlu bir sembol/harf kümesi),
  • δ: Q × Σ ⟶ Q geçiş fonksiyonudur,
  • q0 ∈ Q başlangıç durumudur,
  • F ⊆ Q kabul (son) durumları kümesidir.

Önceki otomata dönersek,

Q durumlar kümesinde üç durum olduğunu söyleyebiliriz: Q = {q0, q1, q2}. Σ alfabesi, otomatın kabul edeceği ya da reddedeceği sözcükleri kurabileceğimiz harfleri içerir. Burada büyük olasılıkla Σ= {a, b, c} alfabesidir, ama herhangi bir üst küme de olabilir. Başlangıç durumu q0, yine q0 durumudur; bu konuda bir değişiklik yok. Bu otomatta kabul durumları kümesinde yalnızca bir durum vardır: F = {q2}.

Geçiş fonksiyonu ise harfli o üç oktur. δ: Q × Σ ⟶ Q gösterimi kafanı karıştırıyorsa, bunun yalnızca δ fonksiyonunun (fonksiyon, belki daha doğrusu eşleme) iki parametre aldığı anlamına geldiğini bil: Q kümesinden bir durum ve Σ kümesinden bir harf. Fonksiyon çağrıldığında yeni bir durum döndürür. Geçiş fonksiyonumuzu bir tabloyla şöyle tanımlayabiliriz:

QΣ→Qq0aq1q1bq1q1cq2

δ(q1, c) çağrısını yaparsak üçüncü satırı uygularız ve fonksiyon q2 durumunu verir — diyagramdaki gibi. q1 durumundaysak ve girişte “c” harfi varsa q2 durumuna geçeriz. Otomatın bir sözcüğü kabul etmesinin ne demek olduğunu biçimsel olarak tanımlamadan önce bu kavramın sezgisel anlayışından yararlanıp birkaç örnek daha görelim.

Diğer Örnekler

  1. İkili alfabe üzerinde, yani Σ= {0, 1} için çalışan ve yalnızca 1 ile biten sözcükleri kabul eden bir otomat oluştur. Örneğin 1, 01, 000001, 0101011 sözcüklerini kabul etsin.

    Otomatımızın iki durumu var — başlangıç durumu q0 ve kabul durumu q1. Girişte 1 rakamı olduğunda kabul durumu q1’e geçeriz ve orada kalırız. Girişte 0 rakamı olduğunda ise kabul etmeyen q0 durumuna geçeriz ve orada da kalırız.

  2. İkili alfabe üzerinde, yalnızca ilk harfi son harfinden farklı olan sözcükleri kabul eden bir otomat kur.

    Otomat daha ilk adımda iki “alt otomata” ayrılır. Sözcük sıfırla başlıyorsa otomat sol kısma girer ve orada kalır, birle başlıyorsa sağ kısma geçer. Sonrası bildiğimiz gibidir: sol kısımdaysak ve girişte 1 varsa kabul durumuna geçeriz ve orada kalırız. Girişte 0 varsa kabul durumu olmayan q1 durumuna geçeriz.

    Önceki otomatlardan farklı olarak bu otomatın birden çok kabul durumu vardır, yani F = {q3, q4}.

  3. İkili alfabe üzerinde, art arda iki sıfır içermeyen sözcükleri kabul eden bir otomat kur.

    Bu otomat iki nedenle ilginçtir. Birincisi, boş sözcüğü kabul etmesidir. Otomata boş sözcüğü vermeyi deneyebiliriz; başlangıç durumu aynı zamanda kabul durumuysa otomat onu kabul eder, bu otomatta da böyle olmuştur. Boş sözcük art arda iki sıfır içermeyen bir sözcük olduğu için bu doğru sonuçtur. İkinci ilginç nokta, bu otomatın tüm durumlarının kabul durumu olmasıdır. Otomatın bir sözcüğü kabul etmemesinin tek yolu, bulunduğu durumdan uygun bir geçişin çıkmamasıdır. Bu, 0 için geçişi olmayan q1 durumunda olur, çünkü o zaman sözcük art arda iki sıfır içerirdi.

  4. {-,+,.,0,1,…,9} alfabesi üzerinde, bir sayıyı temsil eden sözcükleri kabul eden bir otomat kur. Yani ya 2, 548, 98263 gibi tam sayılar, ya da 5584.48, 3.14 gibi ondalık sayılar (programlama dillerindeki gibi ondalık ayırıcı noktadır); her ikisinin de eksi işaretli negatif biçimleri -2, -548, -3.14 ve açıkça yazılmış artı işaretli biçimleri +2, +548, +3.14. Aynı zamanda 0.123 sayısını başındaki sıfır olmadan yalnızca .123 olarak yazabilmeliyiz, hem de her iki işaretle birlikte. On rakam için on geçiş yazmak yerine N sembolünü kullandığımız yardımcı bir gösterim getirelim.

  5. İkili alfabe üzerinde, 0n1n biçimindeki sözcükleri kabul eden bir otomat kur; yani sözcüklerin başında belirli sayıda sıfır, ardından aynı sayıda bir bulunur. Bu tür sözcüklere örnekler: 0011, 00001111, 01.

    Böyle bir otomat kurulamaz, çünkü sıfırların sayısını hiçbir yerde “aklımızda tutamayız”. İkinci örnekteki gibi birkaç “alt otomat” oluşturmamız gerekirdi, ancak bu “alt otomatların” sayısının sonsuz olması gerekirdi, yani her n değeri için bir tane.

Otomatın Hesaplamasının Biçimlendirilmesi

Sonlu otomatın kendisini biçimsel olarak tanımladık. Şimdi böyle bir otomatın aslında ne yaptığını, yani otomatın hesaplamasını tanımlamamız gerekiyor.

Otomatın konfigürasyonu: ⟨q, w⟩ ∈ Q × Σ∗ ikilisine otomatın konfigürasyonu diyelim; burada q otomatın o anda bulunduğu durum, w ise sözcüğün henüz okunmamış kısmıdır. Σ∗, Σ alfabesinin Kleene kapanışını, yani Σ alfabesinin harflerinden kurulabilecek tüm sözcüklerin kümesini gösterir. Kapanışa boş sözcük de dâhildir ve onu ε ile gösteririz.

⟨Q, Σ, δ, q0, F⟩ otomatı verilmişse ve w sözcüğünü kabul etmeye çalışıyorsak, otomat ⟨q0, w⟩ başlangıç konfigürasyonundadır. Şu otomata dönersek

ve w = abbc sözcüğünü kabul etmek istersek, başlangıç konfigürasyonu ⟨q0, abbc⟩ olur.

Hesaplama adımını, otomatın konfigürasyonları arasında, yani (Q × Σ∗) × (Q × Σ∗) kümeleri arasında bir ↦ bağıntısı olarak tanımlarız. w = w0w1… wn, w sözcüğünün henüz okunmamış kısmı olsun. O zaman ⟨q1, w0w1… wn⟩ ve ⟨q2, w1… wn⟩ ikililerinin ↦ bağıntısında olduğunu söyleriz ve bunu şöyle yazarız:

⟨q1,w0w1…wn⟩↦⟨q2,w1…wn⟩,

ancak ve ancak δ(q1, w0) = q2 ise. Örneğimize dönersek başlangıç konfigürasyonu ⟨q0, abbc⟩’dir. Diyagramdan “a” girişi için q1 durumuna ilerleyebileceğimizi görüyoruz. O hâlde şunu yazabiliriz:

⟨q0,abbc⟩↦⟨q1,bbc⟩,

çünkü δ(q0, a) = q1 geçerlidir. Böylece bir hesaplama adımı yapmış olduk — verilen giriş için (= sözcüğün henüz okunmamış kısmının ilk harfi) hangi duruma gitmemiz gerektiğine baktık, oraya geçtik ve okunmamış kısımdan ilk harfi sildik. Böylece yeni bir konfigürasyon elde ettik.

Hesaplama adımı bağıntısının yansımalı ve geçişli kapanışını ↦ ∗ ile gösteririz. K1 ↦ ∗ K2 yazarsak, burada K1, K2 otomatın konfigürasyonlarıdır, bu K1 konfigürasyonundan birkaç hesaplama adımıyla K2 konfigürasyonuna ulaşabileceğimiz anlamına gelir; yani şöyle sonlu bir konfigürasyon dizisi vardır:

K1↦K11↦K12↦K13↦⋯↦K2

Örneğin bizim otomatımızda ⟨q0, abbc⟩ ↦ ∗ ⟨q1,bc⟩ geçerlidir, çünkü iki hesaplama adımı yaparsak elimizde “bc” sözcüğü kalır ve q1 durumunda kalırız. Yani şu konfigürasyon dizisi vardır:

⟨q0,abbc⟩↦⟨q1,bbc⟩↦⟨q1,bc⟩

Otomat w sözcüğünü kabul eder, ancak ve ancak ⟨q0,w⟩↦∗⟨qf,ε⟩ olacak biçimde bir qf ∈ F varsa. Bu, otomatın w sözcüğünü ancak ve ancak şöyle bir hesaplama adımları dizisi varsa kabul ettiği anlamına gelir: bu dizinin sonunda sözcüğün tamamını okumuş olmalıyız ve otomatın kabul durumunda bulunmalıyız. Sözcüğün tamamının okunmuş olması, konfigürasyonda sözcüğün yerinde boş sözcük olan ε bulunmasıyla ifade edilir. Otomatımız abbc sözcüğünü kabul eder, çünkü şu konfigürasyon dizisi vardır:

⟨q0,abbc⟩↦⟨q1,bbc⟩↦⟨q1,bc⟩↦⟨q1,c⟩↦⟨q2,ε⟩

ve q2 durumu kabul durumudur, q2 ∈ F.

Otomat tarafından kabul edilen dil, otomatın kabul ettiği tüm sözcüklerin kümesidir. A otomatının dilini L(A) ile gösteririz. Böylece L(A) ⊆ Σ∗ geçerlidir ve

L(A)={w∈Σ∗∣A otomatı w sözcüğünü kabul eder}

Düzenli dil, herhangi bir sonlu otomat tarafından kabul edilen dildir.

Aynı dili kabul eden iki sonlu otomat denktir. Yani A1 ve A2 otomatları, L(A1) = L(A2) ise denktir.

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