✖

Düzenli Dillerin Birleşimi

İki düzenli dil L1, L2 olsun. Bunların birleşimi olan L = L1 ∪ L2 dilinin de düzenli bir dil olduğunu ispatlayacağız.

Deterministik Otomatla Yöntem

Yöntemin Fikri

İki düzenli dilimiz L1 ve L2 var ve birleşimleri olan L1 ∪ L2 dilinin yine düzenli bir dil olduğunu ispatlamak istiyoruz. L1 ve L2 düzenli diller olduğu için L1 ve L2 dillerini kabul eden sonlu otomatlar A1 ve A2 vardır, yani L(A1) = L1 ve L(A2) = L2 olur. Biz de L1 ∪ L2 dilini kabul eden bir sonlu otomat A kuracağız; böylece L1 ∪ L2 dilinin düzenli olduğunu göstermiş olacağız.

Bunu nasıl yapacağız? Elimizde dilleri ayrı ayrı kabul eden A1 ve A2 sonlu otomatları var. Bir w sözcüğü ancak ve ancak A1 ve A2 otomatlarından en az biri onu kabul ediyorsa L1 ∪ L2 diline aittir.

A otomatı şöyle çalışabilir: w girişi için önce A1 otomatının w girişindeki hesaplamasını benzetir. A1 otomatı w sözcüğünü kabul ederse A otomatı da w sözcüğünü kabul eder. A1 otomatı w sözcüğünü reddederse A otomatı bir de A2 otomatının w girişindeki hesaplamasını benzetmeyi dener. A2 otomatı w sözcüğünü kabul ederse A otomatı da w sözcüğünü kabul eder. Aksi hâlde reddeder.

Geriye, A otomatının başka bir otomatın hesaplamasını “benzetmesinin” ne demek olduğunu biçimselleştirmek kalıyor.

Biçimsel Anlatım

L1 ve L2 düzenli dillerini kabul eden sonlu otomatlar şunlar olsun:

A1=⟨Q1,Σ1,δ1,q1,F1⟩A2=⟨Q2,Σ2,δ2,q2,F2⟩.

L = L1 ∪ L2 dilini kabul eden A = ⟨Q, Σ, δ, q, F⟩ sonlu otomatını kuruyoruz. A1, A2 otomatlarını benzetme fikrinden yararlanacağız. Giriş olarak w = w1w2… wn sözcüğü verildiğini düşünelim; şimdi A1 ve A2 otomatlarının w sözcüğündeki işleyişini aynı anda benzeteceğiz. A1 otomatının başlangıç konfigürasyonu ⟨q1, w1w2… wn⟩, A2 otomatının başlangıç konfigürasyonu ⟨q2, w1w2… wn⟩ olur. Her otomatta şimdi bir hesaplama adımı yaparız; böylece ⟨δ1(q1, w1), w2… wn⟩ ve ⟨δ2(q2, w1), w2… wn⟩ konfigürasyonlarına geliriz.

Bu konfigürasyonların yalnızca ilk bileşenlerinin farklı olduğunu görüyoruz; ikinci bileşen — sözcüğün henüz okunmamış kısmı — her zaman aynıdır. Bu yüzden benzetim sırasında iki otomatın iki konfigürasyonunu tutmamıza gerek yok, ⟨⟨qi, qj⟩, wl… wn⟩ biçiminde tek bir konfigürasyon yeter; burada qi ∈ Q1 ve qj ∈ Q2 olur. Başka bir deyişle, kurduğumuz A otomatının başlangıç konfigürasyonu ⟨⟨q1, q2⟩, w⟩ olacak. ⟨q1, q2⟩ ikilisinin ilk bileşeni A1 otomatının şu anda bulunduğu durumu, ikinci bileşeni A2 otomatının şu anki durumunu gösterir.

Böylece kurduğumuz A otomatının durumlar kümesinin Q = Q1 × Q2 olduğunu yazabiliriz. Bu, önceki iki otomatın durumlarının kartezyen çarpımıdır. Fikir şöyle devam eder: A otomatının başlangıç durumu ⟨q1, q2⟩ olacak ve A1 otomatı w1 sembolüyle qi durumuna, A2 otomatı w1 sembolüyle qj durumuna geçiyorsa, A otomatı w1 sembolüyle ⟨qi, qj⟩ durumuna geçecek.

Geçiş fonksiyonu δ’yı şöyle yazarız (burada artık qi ve qj durumlarında bulunduğumuzu varsayıyoruz):

δ(⟨qi,qj⟩,w)=⟨δ1(qi,w),δ2(qj,w)⟩

Geriye yalnızca birkaç ayrıntı kalıyor. Alfabe için Σ= Σ1 ∪ Σ2 geçerlidir. Başlangıç durumu q = ⟨q1, q2⟩ durumudur. Kabul durumları ise, qi ∈ F1 ya da qj ∈ F2 olacak biçimdeki tüm ⟨qi, qj⟩ ikilileridir.

Yöntemin Örnek Üzerinde Gösterimi

İki otomatımız olsun. Birincisi, sıfırlarla birlerin dönüşümlü olarak geldiği tüm sözcükleri (boş sözcük dahil) kabul eden A1 otomatıdır; yani 01, 0101, 010101, … biçimindeki sözcükleri:

Diğer otomat A2, en az bir sıfır içeren sözcükleri kabul eder:

Bu dillerin birleşimi, ya sıfır içeren ya da 01, 0101, … biçiminde olan sözcüklerdir. Şimdi tam olarak bu birleşim dilini kabul eden A = ⟨Q, Σ, δ, q, F⟩ sonlu otomatını kuralım. Önce, yeni A otomatının durumlarının nasıl görüneceğini gösterelim. Bunlar birinci ve ikinci otomatın durumlarının kartezyen çarpımı olacak:

Q=Q1×Q2={⟨q0,p0⟩,⟨q0,p1⟩,⟨q1,p0⟩,⟨q1,p1⟩,⟨q2,p0⟩,⟨q2,p1⟩}

L(A1) ∪ L(A2) birleşim dilini kabul eden A otomatının altı durumu böyle görünür. Diyagramda şöyle olurlar:

Durumların durum ikililerinden oluşmasına hiç şaşırma — bu yalnızca otomatın içinde ne olup bittiğini daha iyi görmemizi sağlar. Durumlara rahatlıkla klasik biçimde q0, …, q5 de diyebilirdik. Kabul durumları, ya q0 ya da p1 durumunu içeren durumlardır; bunlar özgün otomatların kabul durumlarıdır. Başlangıç durumu ⟨q0, p0⟩ durumudur.

Şimdi tüm geçişleri bulmalıyız. Şöyle bir tablo yazalım:

01⟨q0,p0⟩⟨q0,p1⟩⟨q1,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q2,p1⟩

Tabloyu adım adım dolduracağız. Önce ⟨q0, p0⟩ durumundan 0 girişiyle nereye geçiş olduğunu bulalım. A1 otomatında q0 durumundan 0 girişiyle nereye geçildiğine bakarız: q1 durumuna. A2 otomatında p0 durumundan sıfırla p1 durumuna geçilir. Bu yüzden tabloya ⟨q1, p1⟩ yazarız:

01⟨q0,p0⟩⟨q1,p1⟩⟨q0,p1⟩⟨q1,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q2,p1⟩

1 girişi için A1 otomatında δ1(q0, 1) = q2, A2 otomatında δ2(p0, 1) = p0 olur. Böylece ⟨q2, p0⟩ durumunu elde ederiz.

01⟨q0,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q0,p1⟩⟨q1,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q2,p1⟩

Tablonun geri kalanını dolduralım:

01⟨q0,p0⟩⟨q1,p1⟩⟨q2,p0⟩⟨q0,p1⟩⟨q1,p1⟩⟨q2,p1⟩⟨q1,p0⟩⟨q2,p1⟩⟨q0,p0⟩⟨q1,p1⟩⟨q2,p1⟩⟨q0,p1⟩⟨q2,p0⟩⟨q2,p1⟩⟨q2,p0⟩⟨q2,p1⟩⟨q2,p1⟩⟨q2,p1⟩

Bu tabloya göre diyagramın geri kalanını da çizebiliriz.

Otomatın istediğimiz gibi çalışıp çalışmadığını deneyebiliriz. 0100 sözcüğünü kabul ettirmeyi deneyelim. Otomat sırayla şu durumlardan geçer:

⟨q0,p0⟩,⟨q1,p1⟩,⟨q0,p1⟩,⟨q1,p1⟩,⟨q2,p1⟩

⟨q2, p1⟩ durumu bir kabul durumu olduğu için A otomatı 0100 sözcüğünü kabul eder. Peki 0100 sözcüğünü A1 ve A2 otomatlarıyla kabul ettirmeyi denesek ne olurdu? A1 otomatı sırayla şu durumlardan geçerdi:

q0,q1,q0,q1,q2

Otomat, kabul durumu olmayan q2 durumunda bitti; yani A1 otomatı bu sözcüğü kabul etmezdi. A2 otomatı ne yapar?

p0,p1,p1,p1,p1

p1 bir kabul durumudur, yani A2 otomatı 0100 sözcüğünü kabul ederdi. A1 ve A2 otomatlarının q2 ve p1 durumlarında bitmesinin, A otomatının ⟨q2, p1⟩ durumunda bitmesiyle uyumlu olduğuna dikkat et.

Deterministik Olmayan Otomatla Yöntem

Örnek

Düzenli diller kümesinin birleşim altında kapalı olduğunu, çok daha basit bir deterministik olmayan otomat kurarak da ispatlayabiliriz.

İki düzenli dilimiz L1, L2 var ve birleşimleri olan L = L1 ∪ L2 dilinin de düzenli bir dil olduğunu ispatlamak istiyoruz. L1, L2 düzenli diller olduğundan bu dilleri kabul eden A1, A2 otomatları vardır; yani L(A1) = L1 ve L(A2) = L2. Bu otomatları kullanarak L dilini kabul eden, yani L(A) = L olan bir A otomatı kuracağız.

A1 ve A2 sonlu otomatlarının şöyle göründüğünü varsayalım:

ve

İki dilin birleşimini kabul eden otomatı şöyle kurarız: yeni bir başlangıç durumu oluştururuz ve bu durumdan özgün başlangıç durumlarına iki ε-geçişi çizeriz. Hepsi bu kadar. Otomat şöyle görünür:

Biçimsel Anlatım

A1 = ⟨Q1, Σ, δ1, q1, F1⟩ ve A2 = ⟨Q2, Σ, δ2, q2, F2⟩ otomatları olsun. Önceki otomatların kabul ettiği dillerin birleşimini kabul eden A = ⟨Q, Σ, δ, q0, F⟩ otomatını kuruyoruz; yani L(A) = L(A1) ∪ L(A2). Şunlar geçerlidir:

  • Q = Q1 ∪ Q2 ∪ {q0}
  • F = F1 ∪ F2

Geçiş fonksiyonu δ’yı şöyle tanımlarız:

δ(q,a)={δ1(q,a)eğerq∈Q1δ2(q,a)eğerq∈Q2{q1,q2}eğerq=q0∧a=ε∅eğerq=q0∧a≠ε

Kaynaklar

Bölümler: Düzenli Dillerin Kapalılığı, Düzenli Dillerin Birleşimi, Düzenli Dillerin Kesişimi, Düzenli Dillerin Farkı, Düzenli Dilin Tümleyeni, Düzenli Dillerin Birleştirilmesi, Düzenli Dilin Kleene Kapanışı