jflap İle otomata teorisi

87
OTOMATA TEORİSİ Yavuz Adabalı 2009010206002 08.06.2012 JFLAP

Upload: yavuz-adabali

Post on 26-Jun-2015

2.182 views

Category:

Technology


12 download

DESCRIPTION

Jflap ile otomata teorisi

TRANSCRIPT

OTOMATA TEORİSİ

Yavuz Adabalı

2009010206002

08.06.2012

JFLAP

2

Giriş

1.Jflap nedir?

2.Nereden İndirilir?

Ünite1 Sonlu Otomat

1.1. 1.Editör Penceresi

1.1.2.Durumları Oluşturma

1.1.3.Başlangıç ve Uç Durumları Tanımlama

1.1.4.Geçişleri Oluşturma

1.1.5.Durumları ve Geçişleri Silme

1.1.6.Sonlu Otomatın Çoklu Dizgelerle Çalıştırılması

1.1.7.sonlu Bir Non-Deterministik ( NFA ) Otomat Oluşturma

1.1.8.Non-deterministik Durumları önplana çıkarma

1.1.9.Girdilerle Non-Deterministik Sonlu Otomatın Çalıştırılması

1.1.10.İz oluşturma

1.1.11.Konfigürasyonları Silme

1.1.12.Eritme ve dondurma konfigürasyonları

1.1.13.Simülatörü Resetleme

1.2.Geçişlerin Kurgulanması

1.2.1Basit örnek

1.2.2.Geçiş üzerinde komplex durum ve çoklu etiketler

1.3.DFA’ya Tuzak durumu ekleme

1.3.1 Giriş

1.3.2. DFA’ya Tuzak durumu ekleme

1.4.NFA’yı DFA'ya Dönüştürme

1.4.1.Giriş

1.4.2. DFA’ya dönüştürme

1.5.DFA'yı Düzenli Dilbilgisine Çevirme

3

1.5.1.giriş

1.5.2.Düzenli dil bilgisine dönüştürme

1.6.Bir FA’yı düzenli bir ifadeye çevirme

1.6.1.Giriş

1.6.2. düzenli bir ifadeye çevirme

1.7. Otomat Birleştirme

1.7.1 başlangıç

1.7.2. Birleştirme ve Değiştirme

Ünite 2:Mealy Makinesi

2.1.Jflapta Mealy makinesi aşağıdaki değişkenlerle tanımlanmıştır.

2.2.Mealy Makinesi ve Sonlu Otomat arasındaki farklar

2.2.1 Uç durum yoktur

2.2.2.Çıkış Üreten Geçişler

2.2.3.Giriş Etiketinden Çıkış Oluşturma

2.2.4. Non determinizm yoktur

Ünite 3 Moore Makinesi

3.1 Tanım

3.2.Moore Makinesi ve Sonlu Otomat arasındaki farklar

3.2. Uç durum yoktur

3.3. Durumlardan Çıkış Üretme

3.4. Giriş Etiketlerinden Çıkış Üretme

3.5. Non determinizm yoktur

4

Ünite 4 PDA

4.1.1.Tanım

4.1.2. Bir PDA Nasıl Oluşturulur?

4.1.3.Nondeterministik NPDA’lar

4.2.NPDA’yı Bağlamdan Bağımsız Dilbilgisine Çevirme

4.2.1.giriş

4.2.2. Dilbilgisine çevirme

4.2.3 Yayımlanabilir örnek

Ünite 5 Turing Makinesi

5.1.1 Tanım

5.1.2.Turing Makinesi Nasıl Oluşturulur?

5.1.3 Uç Durumdan Geçişler

5.2.Multi-Tape(çok bantlı) Turing makineleri

5.2.1. Giriş

5.2.2 Multi-Tape Turing Makinesi nasıl Oluşturulur?

5.3. Yapı Taşları

Ünite 6 Dilbilgisi

6.1.Dilbilgisi Girme

6.1.1. giriş

6.1.2 dilbilgisi nasıl girilir?

6.2.Dilbilgisi Türünü test etme

6.2.1.giriş

6.2.2.Dilbilgisi türü nasıl test edilir?

6.3.Kaba kuvvet Ayrıştırıcı-düzenli ya da bağlamdan bağımsız dilbilgisi

6.3.1. Tanım

5

6.3.2 . düzenli ya da bağlamdan bağımsız dilbilgisinde kaba kuvvet ayrıştırıcı nasıl

kullanılır?

6.4. Çoklu Girişle Dilbilgisinin Çalıştırılması

6.5. Brute Force Parser(kaba kuvvet ayrıştırıcı)-sınırsız dilbilgisi

6.5.1 Tanım

6.5.2.Sınırsız Dilbilgisi Üzerinde Brute Force Parser Nasıl Çalıştırılır?

6.6.Cyk ayrıştırıcı

6.6.1.Giriş

6.6.2 CYK ayrıştırıcı Nasıl Çalıştırılır?

Ünite 7 Düzenli İfadeler

7.1.Tanım

7.2 Düzenli İfade Oluşturma

7.3.NFAya çevirme

6

Giriş

1.jflap nedir?

Jflap formal dil konularını içeren nondeterministik sonlu otomatlar,non-deterministik push-

down otomatları ,multi tape Turing makinaları,gramerlerin bir çoğunu ve L sistemleri ile

uygulamalar oluşturabileceğiniz bir yazılımdır.

2.Nereden indirilir?

http://www.jflap.org/jflaptmp/ sitesinden JFLAP’ın en güncel versiyonunu indirebilirsiniz.

7

Ünite 1.sonlu Otomat

Jflap’ta sonlu bir otomat 5 değişke ile tanımlanır.

M = (Q, Σ, δ, qs, F)

Q sonlu sayıda durum içeren durumlar kümesi {qi | i negatif olmayan bir tam sayı } Σ giriş alfabesi δ durum geçiş fonksiyonu qs (Q’nun bir elemanı) başlangıç durumu F (Q’nun bir alt kümesi) uç durum

Not: yukarıda yer alan tanımlamalar hem deterministik hem de ileride değinilecek olan non-determistik sonlu otomatları için geçerlidir.

Jflapta farklı tipte otomatlar oluşturma işlemi birbirine çok benzerdir. Şimdi bir dilin deterministik sonlu otomatını olusturalım.

L = {ambn : m ≥ 0, n > 0, n tek ise }.

Not:örnekler JFLAP: An Interactive Formal Languages and Automata Packageby Susan Rodger and Thomas Finley’dan alınmıştır.

1.1. 1.Editör Penceresi

Yeni bir sonlu otomat(FA:Finite Automaton) oluşturmak için menü şeçeneklerinden Finite Automaton sekmesine tıklayınız

8

Editör 2 temel birimden oluşur.

Canvas(Tuval):yeni bir otomat oluşturmanızı sağlar

Toolbar(Araç Çubuğu):Otomatayı oluşturmak için ihtiyacınız olan araçları bulundurur.

Toolbar’ı daha yakından inceleyelim.

Bir aracı seçmek için fare ile seçmek istediğiniz bir simgenin üzerine tıklayınız.Bir araç

seçtiğinizde buton resimdeki öznitelik aracı gibi gölgelenir.

Fare ile kontrolün bir diğer yolu daha vardır.Eğer durum oluşturma modundaysınız,tuval üzerine tıkladığınızda yeni durumlar oluşacaktır.

1.1.2.Durumları Oluşturma

Öncelikle birkaç durum oluşturalım.Bunu yapabilmek için Durum Oluşturma Aracı(State

Creator ) ile toolbar üzerindeki butona tıklamalıyız. Kaç durum oluşturacağımızı bilmediğimiz için rastgele 4 durum oluşturalım.Durumları oluşturduktan sonra editör penceremiz aşağıdaki gibi gözükecektir.

9

Durumları oluşturduktan sonra,şimdi de başlangıç ve uç durumları oluşturalım.

1.1.3.Başlangıç ve Uç Durumları Tanımlama

Keyfi olarak başlangıç durumunu q0 seçelim.q0’ı başlangıç durumu tanımlamamız

için,öncelikle toolbar üzerindeki öznitelik düzenleme(Attribute Editor tool ) aracı seçilmelidir.Şimdi öznitelik düzenleme aracı üzerindeyiz.Farenin sağ tuşu ile q0 durumu üzerine tıkladığınızda karşınıza aşağıdaki gibi bir açılır menü gelecektir.

Açılır menüden Initial’ı işaretleyiniz. Bu işlemden sonra q0 durumu başlangıç durumu olacaktır.

q0 başlangıç durumu olarak tanımlandı

Şimdi de bir uç durum oluşturalım. Keyfi olarak q1 durumunu uç durum olarak belirleyelim.q1 durumu üzerinde fare ile sağ tuşa tıklayıp,açılır menüden Final’ ı işaretlediğinizde q1 durumunun uç durum olduğunu göreceksiniz.

q1 defined as final state

10

Başlangıç ve uç durumlarımızı tanımladıktan sonra şimdi de geçişleri oluşturalım.

1.1.4.Geçişleri Oluşturma

Bir geçiş oluşturmak için öncelikle toolbar’dan Geçiş Oluşturma( Transition Creator tool ) aracı seçilmelidir.Daha sonra tuval üzerindeki q0 durmuna tıklayınız. q0 üzerinde bir textbox belirecektir.

Geçiş oluşturma

Not:Boş bıraktığınız dizelerin yerine “λ” işareti konulur. Ana menü seçeneklerinden(Preferences : Preferences) λ yerine ε seçilirse boş bırakmalarda ε simgesi görülmeye başlar.

Textbox’un içine “a” yazın ve enter’a basın.Textbox seçili değilse,seçmek için Tab tuşuna basınızitextbox içerisin “a ” yazınız ve enter’ a basınız.Bu işlemi yaptığınızda karşınıza çıkan görüntü aşağıdaki gibi olacaktır.

Geçiş oluşturuldu

Şimdi de durumlar arası geçişleri inceleyelim.Başlangıç durumumuz q0’dan uç durumumuz olan q1’e bir geçiş oluşturmak için toolbar üzerinde Geçiş Oluşturma aracının seçili olduğuna emin olalım.Sonra q0 üzerine tıklayın, ve elinizi sol tuştan çekmeden fareyi q1e doğru sürükleyin ve fareyi serbest bırakın. Oluşan textbox içine “b ” yazın. İki durum arasındaki geçiş aşağıdaki gibi olacaktır.

2.geçiş oluşturuldu

Şimdi de q1den q2ye bir b geçişi oluşturalım. Tanımlamaya çalıştığımız sonlu otomatın ambn ve n'in tek olması gerektiğini yukarıda söylenmiştir.

11

Görüldüğü üzere q3 durumunu yukarıda kullanmadık. Durum ve geçiş silme bir sonraki konuda anlatılacaktır.

1.1.5.Durumları ve Geçişleri Silme

Q3 durumunun silinebilmesi için öncelikle toolbardan silme aracı secilmelidir. sonraki adımda ise q3 durumuna tıklanmalıdır.Bu işlem sonunda olusacak görüntü aşağıdaki gibidir.

Geçiş silme işlemi de benzer şekildedir.

1.1.6.Sonlu Otomatın Çoklu Dizgelerle Çalıştırılması

Sonlu otomatımızı tamamlamış bulunmaktayız ve şimdi onu test edebiliriz.Test işlemini başlatmak için önce menü çubuğundan Input : Multiple Run seçeneği seçilmelidir.

12

Sol tarafta otomatı gösteren bir panel ve sağ tarafta giriş değerlerini gösteren bir tablo belirecektir.

Giriş dizgelerini girmek için ilk satırda Input sütununa tıklayınız ve dizgeyi giriniz ve enter’a basınız.Dizgeleri girdikten sonra FA’yı test etmek için Run Inputs’u tıklayınız.Sonuçlar result(sonuç) sütununda Accept(kabul) ya da Reject şeklinde görüntülenecektir.

13

Clear butonuna tıkladığınızda tüm giriş dizgeleri silinir.Enter Lambda butonuna tıkladığınızda yeni bir dizge gireceğiniz satır oluşur.View Trace butonuna tıkladığınızda ise seçili giriş değerlerinin izini gösteren yeni bir pencere açar.

1.1.7.sonlu Bir Non-Deterministik ( NFA ) Otomat Oluşturma

sonlu Bir Non-Deterministik ( NFA ) Otomat Oluşturma işlemi sonlu bir deterministik otomat(DFA) oluşturmaya oldukça benzemektedir.Buna rağmen NFA da birkaç farklı durum bulunmaktadır.İlk olarak eğer FA aynı semboller tarafından okunan aynı durumlara ait 2 geçiş işlemine sahipse FA ,NFA gibi incelenir.

Aşağıda tanımlanan NFA’yı inceleyelim.

1.1.8.Non-deterministik Durumları önplana çıkarma

NFA’da tüm nondeterministik durmları görmek için menü çubuğundan Test : Highlight Nondeterminism’i seçiniz.

Nondeterministik durumları önplana çıkarma

Açılan yeni sekmede nondeterministik durumlar ,resimdeki gölgeli koyu bir renkle görülecektir.

14

Non deterministik durumların önplana çıkarılması

1.1.9.Girdilerle Non-Deterministik Sonlu Otomatın Çalıştırılması

NFA’ya doğrudan girdi değerlerini girmek için menü sekmesinden Input : Step with Closure’u seçiniz.Girdileri gireceğiniz bir dialog box karşınıza çıkacaktır.Size düşen görev ise girdiğiniz girdileri adım adım işletmek olacaktır.Şimdi dialog box’a “aaaabb” geğerini girelim ve enter’a basalım. Ayrıca tek tek dize yazmak yerine girdi dosyasıda yüklenebilir.

Girdi değerlerinin girilmesi

En üstte otomatayı gösteren,altta düzenlemelerin yer aldığı yeni bir pencere açılacaktır.

15

Bu durumu daha da yakından inceleyelim.

Girişin sonra ki değerine gitmesi için “Step” tıklayınız Otomatta mevcut durum gölgeli olarak gözükmektedir ve üzerinde yapılandırma simgesi görünmelidir.

16

Bu makine nondeterministiktir. Çünkü q1 ile “a” geçişi ile hem q2 hemde q9 geçiş söz

konusudur.

aaa işlendi

Not: görüldüğü üzere iki konfigürasyon kırmızıyla işaretlendi ve bu girdilerin reddedildiği ispatlanmış oldu. Bu girdilere baktığınız da sadece aa’ın işlendiğini görürsünüz. Neden?

1.1.10.İz oluşturma

Bir konfigürasyon seçmek için üzerine tıklayın.Seçilme işlemi yapıldığında konfigürasyon kademeli olarak soluk bir renk alacaktır.q11 durumu ile reddedilen konfigürasyonu simgeleyen icona tıklayınız.Açılan yeni pencerede konfigürasyonun “traceback”ı şu şekilde görüntülenecektir.

Traceback her giriş simgesini işledikten sonra konfigürasyonunu göstermektedir. Traceback

17

hakkında şunu söyleyebiliriz konfigürasyon q0’da başladı ve q1’e geçiş yaptı, ardından ilk a’yı işledi.Sonra q11’de yer alan ikinci a işlendi.q11,q1’e bitişik olmasına rağmen,q9’dan λ-geçişi alınarak erişildi. Simülatör q11'den sonra hiçbir geçiş olmadığını görmüş ve konfigürasyonu

reddetmiştir.

1.1.11.Konfigürasyonları Silme

Traceback’lerde reddedilen konfigürasyonlara bakıldığında, q11 ya da q6 içindeki sonraki

girdi sembolü a olan herhangi bir konfigürasyon rededilir denilebilir. Reddedilen

konfigürasyonları seçmek için dört konfigürasyonun tümü seçilmelidir. Bir kez tıklanmalı ve

Remove seçeneği seçilmelidir.

Bu işlemden sonra simülatör aşağıdaki gibi görüntülenecektir.

Bu işlemlerden sonra simülatör yeniden adım adım çalıştırıldığında hiçbir sorun

çıkmayacaktır.

18

1.1.12.Eritme ve dondurma konfigürasyonları

q10 üzerindeki konfigürasyonu dondurmak için,q10’a bir kez tıklayınız daha sonra Freeze(dondur) butonuna tıklayın.Bir konfigürasyon dondurulduğu zaman koyu mor bir renge dönüşecektir.

Konfigürasyon dondurulmuş ise, q3 üzerindeki konfigürasyon yardımıyla adım adım

işletiildiğinde, dondurulan konfigürasyon aynı kalır. Adım 2 kez tekrarlandığında q3 üzerinde

konfigürasyonun kabul edilmez olduğu açığa çıkacaktır. Simülatörde oluşacak görüntü aşağıdaki gibidir.

19

Dondurulmuş konfigürasyonu ilerletmek için konfigürasyonu seçiniz ve Thaw(erit)’e tıklayınız. Şimdi simülatör de normal şekilde adım adım işleme (step through) yapılabilir.Kabul edilen konfigürasyoları bulmak için birkaç step butonuna tıklayınız.Kabul edilen konfigürasyonlar yeşil renge dönüşecektir.

Kabul edilen konfigürasyonlar bulundu

Eğer Step butonuna tekrar tıklarsak,son konfigürasyonun reddedildiğini göreceğiz.Kabul edilen sadece bir konfigürasyon bulunmaktadır.

1.1.13.Simülatörü Resetleme

Simülasyonun herhangi bir yerinde “Reset” butonuna tıkladığınızda simülasyon sıfırlanacak,üzerinde çalışmakta olduğunuz konfigürasyonlar silinecektir.

20

1.2.Geçişlerin Kurgulanması

1.2.1Basit örnek

Resimdeki gibi İki durumlu ve bir geçişe sahip basit bir otomat tanımlayalım.

Sırayla bu geçişi kurgulamak için, seçili olan geçiş üzerine bir kez tıklayınız.Bu geçiş açık bir

renk alacaktır.

21

Geçiş bir kez seçildiğinde sürükle bırak yöntemiyle dairesel şekilde kurgulanabilir.

Sırayla geçişleri düzenlemek için,geçiş üzerine iki kez tıklayın.

22

1.2.2.Geçiş üzerinde komplex durum ve çoklu etiketler

Aşağıdaki gibi bir geçiş simgesi ile birden fazla geçiş söz konusu ise;

Geçiş düzenleme ile ilgili olarak,tüm etiketler birbirinden bağımsızdır.Kontrol noktasındaki

etikete tıklanarak tüm etiketleri görünür hale getirebiliriniz.

23

1.3.DFA’ya Tuzak durumu ekleme

1.3.1 Giriş

JFLAP ile bir DFA oluşturduğunuzda,özel bir tuzak durumuna ihtiyaç duymazsınız.Giriş olarak verilmiş bir durum üzerinden,çıkış olmayan bir geçiş var ise Jflap bunu tuzak olarak algılar ve bunu son giriş etiketinde ayrıştırır.

1.3.2. DFA’ya Tuzak durumu ekleme

Öncelikle ADD_TRAP.jff dosyasını yükleyiniz.Şmdi DFA’ya tuzak durumu ekleyebiliriz.Menü

24

seceneklerinden Convert → Add Trap State to DFA’ya tıkladıktan sonra karşınıza aşağıdaki gibi bir görüntü çıkacaktır.

,

Şimdi bir tuzak durumu oluşturmaya ihtiyacımız var.Durum ikonuna ve tuzak durumu oluşturacağınız yere tıklayınız.Tuzak durumundan sonra oluşacak görüntü şu şekildedir.

Tuzak durumumuzu oluşturduktan sonra,uygun geçişleri eklemeliyiz.DFA’da okunabilir etiketlerimiz “a” ve “b”dir.Bu yüzden DFA’mızı tamamalayabilmek için, her durum “a” ve “b” giriş etiketlerine giden bir geçişe sahip olmalıdır.Şüphesiz bu durum şu an DFA’mızda mevcut

25

değil.Şimdi q0’dan tuzak durumuna bir geçiş ekleyelim.Alfabemizde q0 durumundan giden bir “a” geçişine sahibiz,ihtiyacımız olan durum üzerinden geçen bir “b” geçişi.geçiş oluşturma ikonuna tıklayınız ve q0’dan q3’e bir geçiş oluşturunuz(tuzak durumu).JFLAP size uç durumu soracak.Eğer adımları doğru şekilde gerçeklştirdiyseniz karşınıza gelecek ekran görüntüsü şu şekilde olacaktır.

Eğer terminale “b” dışında bir geçiş yazarsanız, yanlış geçiş olduğundan Tuzağa düşmüş olursunuz ve aşağıdaki gibi bir uyarıyla karşılaşırsınız.

Eğer terminale doğru olan şekliyle “b yazarsanız,ekran görüntünüz şu şekilde olacaktır.

26

Geçişlerimizi de yaptıktan sonra Do All butonuna basarak DFA’mızı tamamlayabiliriz.

1.4.NFA’yı DFA'ya Dönüştürme

1.4.1.Giriş

Non-deterministik sonlu otomatı, deterministik sonlu otomata çevirmek için menü çubuğundan Convert → Convert to DFA seçeneği seçilmelidir.

27

1.4.2. DFA’ya dönüştürme

Menü seçeneklerinden “Convert → Convert to DFA” ya tıkladığınızda aşağıdaki gibi bir görüntü elde edersiniz.

NFA panelinin solunda yer alır.Olusturacağımız yeni DFA ise panelin sağ tarafında yer alır.Buton açıklamalarını görmek için eliniz fare üzerinde iken toolbar üzerindeki ikinci düğmeye tıklayınız.( Expand Group on (T)erminal).sonra q0 durmu üzerindeyken fareyi

28

serbest bırakın.Fareyi durum üzerinden uzaklaştırın,sonra sağ panelin beyaz bir kısmında serbest bırakın.Terminal istendiğindiği zaman “a”yı giriniz. NFA durumlar kümesi istendiği zaman “0,1,2” değerlerini giriniz.Tamamladığınızda ekran görüntünüz aşağıdaki gibi olacaktır.

Ne yaptığımızı merak ediyorsunuzdur.Basitçe geçişi olan ilk DFA’mızı oluşturduk.NFA’da q0’dan başlamıstık. . NFA' ya karşılık gelen bir yolu olmayan terminal üzerinde bir durumu genişletmek mümkün değildir.

Şimdi de DFA’ya iki ya da daha fazla geçiş ekleyelim.Öncekine benzer şekilde,q1den başlaya genişlemeler ekleyelim.Terminal değerimiz “b” ve terminal durmlarımız “1,3”

Olacak. Şimdi yeni bir q2 durumu oluşturalım ve q2den başlayan bir genişleme ekleyelim.Bu

işlem sonucunda aşağıdaki gibi bir görüntü elde ederiz.

Şimdi başarılı olup olmadığımızı kontrol etmek için “Done” butonuna tıklayalım.karşımıza

çıkan mesaj bize iki veya daha fazla yeni durum ve 7 veya daha fazla geçiş eklememizi

söyleyecektir.Bunları yaptıktan sonra “Complete” butonuna tıklayın.Aşağıdaki gibi bir görüntü

elde edeceksiniz.

29

1.5. DFA'yı Düzenli Dilbilgisine Çevirme

1.5.1.giriş

JFLAP’ı çalıştırın dfaToRegGrammar.jff dosyasını yükleyin ya da aşağıdaki gibi sonlu

nondeterministik bir otomat oluşturun.Bu işlemi tamamladığınız da aşağıdakine benzer

şekilde bir görüntü elde edersiniz.

1.5.2.Düzenli dil bilgisine dönüştürme

Menü seçeneklerinden “Convert → Convert to Grammar”e tıkladığınızda aşağıdaki

görüntüyü elde edersiniz.

30

JFLAP, varsayılan olarak tüm durumlara eşsiz değişken atar.Graftaki tüm geçişler sağ-doğrusal

dil bilgisine karşılık gelir.Örneğin q0 dan q0’a geçişler boyunca elde edilen ürün S → aS

şeklindedir.ürün eklemek için q0 durumu üzerindeki “a” geçişine tıklayınız.”a” geçişi

kırmızıya boyanacak ve ürün sağ panelde görüntülecektir.

Renklendirilmiş geçiş karşılık gelen ürün

Eğer “Hint” butonuna tıklarsak daha önce üretilmeyen bir ürün ortaya çıkar.

İşinizi tamamladığınızda “Export” butonuna tıklayınız.Ekrandaki gibi yeni bir dilbilgisi elde

edeceksiniz.

31

1.6.Bir FA’yı düzenli bir ifadeye çevirme

1.6.1.Giriş

JFLAP’ı çalıştırın dfaToRegExpr.jff, dosyasını yükleyin ya da aşağıdaki gibi sonlu bir otomat

oluşturun.Bu işlemi tamamladığınızda aşağıdakine benzer şekilde bir görüntü elde edersiniz.

1.6.2. düzenli bir ifadeye çevirme

Menü seçeneklerinden “Convert → Convert FA to RE”e tıkladığınızda aşağıdaki görüntüyü

elde edersiniz.

Yukarıda 4 geçişten oluşan basit bir otomat görülmektedir.Eğer bu çoklu uç durumlu

kompleks bir otomat olsaydı,öncelikli işimiz tek bir uç durum oluşturmak ve “λ” geçişleriyle

32

diğer uç durumları bağlamak olcaktı.Eğer 2 durum arasında birden fazla geçiş varsa,çoklu

geçişleri tek bir geçişe dönüştürmek için “Transition (C)ollapser” butonunu kullanabiliriz.

n duruma sahip sonlu bir otomatta,geçişlerin toplam sayısı n2 olmalıdır.Aşağıdaki örnekte 3

durum ve 9 geçiş vardır.Şimdi yukarıdaki otomata 4 geçiş daha eklediğmizde aşağıdaki ekran

görüntüsünü elde ederiz.

Şimdi karşımıza çıkan mesaj değişti ve bize collapse state aracının nasıl kullanılcağını

göstermiş oldu.Bu araca soldan 4. Butonu kullarak erişilir ve ismi “State (C)ollapser”dur.Bu

butonla birlikte q0 ya da q1 durumuna tıklamaya çalısınız.Başlangıç ve uç durumların

silinmediğinden emin olun.Bununla birlikte sadece q2 durumu silinebilir.bu duruma

tıkladığınızda graf içindeki tüm geçiş ve etiketlerin koyu renkle işaretlendiği ve şimdiki

durumun silindiği bir pencere açılacak.Penceredeki satırlara tek tek tıkladığınızda yeni

geçişlerin eski geçişlere karşılık renklendirildiğini görürsünüz.

33

“Transitions” penceresini kapanmadan “Finalize” butonuna tıklayınız. Ardından “Export”

butonuna tıkladığınızda karşınıza çıkacak ekran görüntüsü aşağıdaki gibi olacaktır.

1.7. Otomat Birleştirme

1.7.1 başlangıç

JFLAP’ı çalıştırın combine1.jff ve combine2.jff dosyalarını yükleyin ya da aşağıdaki gibi a*b ve

a(ba)*’yı iki ayrı pencere açın.bunu yaparken JFLAP’ı 2.kez açmayın. “File → New” seçeneğini

kullanarak gerçekleştirin.Bu işlemleri tamamladığınızda aşağıdakine benzer şekilde bir

görüntü elde edersiniz.

34

1.7.2. Birleştirme ve Değiştirme

Şimdi pencerelerin birinde menü seçeneklerinden “Convert → Combine Automata” ya tıklayınız.eğer karşıdaki otomat varsayılan değilse,menü çubuğundan karşı otomatı seçiniz.Elde edeceğiniz görüntü aşağıdaki gibi olacaktır.

Görüldüğü üzere 2 otomatı birleştirdik.örneğin şimdi de 2 dilin nasıl birleştirildiğini gösterelim. (a*b)+(a(ba)*). Aşağıdaki örneği elde edebilmek için combine3.jff dosyasını yükleyiniz.

35

36

Ünite 2 MEALY MAKİNESİ

2.1.Jflapta Mealy makinesi aşağıdaki değişkenlerle tanımlanmıştır.

M = (Q, Σ, Γ, δ, ω, qs)

Q sonlu durum kümesi {qi | i negatif olmayan tamsayı } Σ sonlu giriş alfabesi Γ sonlu çıkış alfabesi δ geçiş fonksiyonu, δ : Q × Σ → Q ω çıkış fonksiyonunu gösterir, ω : Q × Σ → Γ qs (Q’nun elamanı) Başlangıç durumu

Mealy makinesinin Moore makinesinden farkı çıkış fonksiyonudur.Mealy makinesinde çıkış geçişler tarafından oluşturulurken,moore makinesinde ise durumlardan oluşturulur.

Yeni bir Mealy makinesi oluşturmak için ana menü seçeneklerinden Mealy Machine ‘ı seçiniz.

37

2.2.Mealy Makinesi ve Sonlu Otomat arasındaki farklar

Mealy makinesi,Sonlu Otomat ile pek çok benzer yöne sahiptir,ancak birkaç özellikle mealy makinesinden ayrılır.

Uç durumu yoktur

Geçişleri çıkış üretir.

Girişleri kabul ya da reddetmez.Girişlerden çıkış üretir.

Mealy makinesi nondeterministik durumlara sahip olamaz.

2.2.1 Uç durum yoktur

FA’da Attribute Editor ile oluşturduğumuz uç durum seçeneği,Mealy makinesinde yer almaz.

FA’da durum secenekleri Mealy makinesinde durum secenekleri

2.2.2.Çıkış Üreten Geçişler

Mealy makinesi her geçişten çıkış üretir.Mealy makinesinde bir geçiş

olusturduğunuzda 2 boşluk görüntelenir.Bunlardan ilki giriş sembolü ,diğeri çıkış sembolüdür.

Geçiş oluşturma işlemi

Bir geçiş oluşturduğunuzda giriş-çıkış değerleri bir ; ile ayrılır

38

Geçiş oluşturuldu

2.2.3.Giriş Etiketinden Çıkış Oluşturma

Aşagıda yer alan, mealyNOT.jff adresinden indirebileceğimiz basit MEaly makinesi örneğine

bakalım.

Menü seçeneklerinden Input : Step... seçeneğini seçip giriş değerlerinizi girdiğinizde FA’ya

benzer bir mealy makinesi görüntüsü elde edersiniz.

Her adımda çıkış bandı kendini günceller ve Toplam çıkış üretilir.

Başlangıç adım1 adım2 ………. Sonuç

Menü seçeneklerinden Input : Fast Run... seçeneğini de benzer şekilde işler.

39

Benzer şekilde Input : Multiple Run seçeneğini seçtiğinizde çıkış sonuç sütununda aşağıdaki

gibi görüntülenir.

2.2.4. Non determinizm yoktur

Mealy makinesinin haritası,her bir giriş için yalnızca tek bir çıkış vardır, nondeterminizm bu

yüzden mealy makinesinde yer alamaz.Nondeterminizm içeren Mealy makinesi

oluşturmamıza rağmen,ona uygun giriş değerleri ile çalıştıramayız.

Aşağıdaki gibi bir Mealy makinesi oluşturalım.

40

Nondeterminizme sahip bir mealy makinesi

Menüdeki tüm seçeneklerle oluşturduğumuz makineyi çalıstırmaya çalışalım. Input :

Step..., Input : Fast Run..., or Input : Multiple Run..., her seferinde aşağıdaki gibi bir hata

mesajı ile karşılasırız.

Nondeterministik durumları görüntelemek için Test : Highlight Nondeterminism seçeneğini

kullanabilirsiniz.Sıralı şekilde nondeterministik durumları silerek Mealy makinesini

çalıştırabilirsiniz.

41

ÜNİTE 3. Moore Makinesi

3.1 Tanım

Jflapta bir moore makinesi aşsağıdaki gibi tanımlanır.

M = (Q, Σ, Γ, δ, ω, qs)

Q Sonlu durumlar kümesi {qi | i is a nonnegative integer}

Σ sonlu giriş alfabesi

Γ sonlu çıkış alfabesi

δ geçiş fonksiyonu; δ : Q × Σ → Q

ω çıkış fonksiyonunu gösterir, ω : Q → Γ

qs (Q’nun bir elemanı) başlangıç durumu

Mealy makinesinin Moore makinesinden farkı çıkış fonksiyonudur.Moore makinesinde çıkış durumlar tarafından oluşturulurken,Mealy makinesinde ise geçişler oluşturulur.

Yeni bir Moore Makinesi oluşturmak için ana menüden Moore Machine seçeneğini seçiniz.

42

3.2.Moore Makinesi ve Sonlu Otomat arasındaki farklar

Moore makinesi,Sonlu Otomat ile pek çok benzer yöne sahiptir,ancak birkaç özellikle moore makinesinden ayrılır.

Uç durumu yoktur

Durumları çıkış üretir.

Girişleri kabul ya da reddetmez.Girişlerden çıkış üretir.

Moore makinesi nondeterministik durumlara sahip olamaz.

3.2. Uç durum yoktur

FA’da Attribute Editor ile oluşturduğumuz uç durum seçeneği,Moore makinesinde yer almaz.

FA’da durum secenekleri Moore makinesinde durum secenekleri

3.3. Durumlardan Çıkış Üretme

Moore makinesi bir duruma sahip olduğunda çıkış üretir.Moore makinesi oluşturma işlemi,aykırı durumlu oluşturma işlemine benzemektedir.Bir durum olusturduğunuz da pop-up dialog kutusu karşınıza çıkacaktır.

Çıkış durumlarının oluşturulması

Dialog kutusuna çıkış durumlarını girdikten sonra OK butonuna tıklayın.Oluşturduğunuz durum aşağıdaki gibi görüntülenir.

43

3.4. Giriş Etiketlerinden Çıkış Üretme

Aşagıda yer alan mooreNOT.jff adresinden, indirebileceğimiz basit Moore makinesi örneğine

bakalım.

Basit bir Moore makinesi örneği

Menü seçeneklerinden Input : Step... seçeneğini seçip giriş değerlerinizi girdiğinizde FA’ya

benzer bir mealy makinesi görüntüsü elde edersiniz.

Her adımda çıkış bandı kendini günceller ve Toplam çıkış üretilir.

44

Başlangıç adım1 adım2 ………. Sonuç

Menü seçeneklerinden Input : Fast Run... seçeneğini de benzer şekilde işler.

Benzer şekilde Input : Multiple Run seçeneğini seçtiğinizde çıkış sonuç sütununda aşağıdaki

gibi görüntülenir.

45

3.5. Non determinizm yoktur

Moore makinesinin haritası,her bir giriş için yalnızca tek bir çıkış vardır, nondeterminizm bu

yüzden mealy makinesinde yer alamaz.Nondeterminizm içeren Moore makinesi

oluşturmamıza rağmen,ona uygun giriş değerleri ile çalıştıramayız.

Aşağıdaki gibi bir Moore makinesi oluşturalım.

Nondeterminizme sahip bir moore makinesi

Menüdeki tüm seçeneklerle oluşturduğumuz makineyi çalıstırmaya çalışalım. Input :

Step..., Input : Fast Run..., or Input : Multiple Run..., her seferinde aşağıdaki gibi bir hata

mesajı ile karşılasırız.

Nondeterministik durumları görüntelemek için Test : Highlight Nondeterminism seçeneğini

kullanabilirsiniz.Sıralı şekilde nondeterministik durumları silerek Moore makinesini

çalıştırabilirsiniz

46

ÜNİTE 4. İLK PUSH DOWN OTOMATIN OLUŞTURULMASI

4.1.1.Tanım

Jflap’la nondeterministik bir push otomat aşagıdaki şekilde ifade edilebilir.

M = (Q, Σ, Γ, δ, qs, Z, F)

Q sonlu durumlar kümesi{qi | i negatif olmayan değer} Σ sonlu giriş alfabesi

Γ sonlu yığın alfabesi δ geçiş fonksiyonu δ : Q × Σ* × Γ* → Q × Γ* nin altkümesidir qs (Q’nun elemanı) başlangıç durumu

Z yığın başlangıç sembolü (must be a capital Z) F (Q’nun alt kümesi) uç durumlar kümesi

4.1.2. Bir PDA Nasıl Oluşturulur?

L = {anbn : n > 0} dilini kullanarak bir NPDA oluşturmaya başlayabiliriz.Yeni bir NPDA oluşturmak için,aşağıda gösterildiği gibi menü seceneklerinden Pushdown Automaton’ı seçiniz

Ardından pek çok menünün,butonun ve özelliğin yer aldığı baş bir ekranla karşılacaksınız.

47

Bir dil için 4 durum yeterlidir L = {anbn : n > 0}.Ekrana 4 durum yerleştiriniz,başlangıç durumunu q0 ve uç durumu q3 olarak belirledikten sora aşağıdakine benzer bir görüntü elde ederiz.

Şimdi geçişleri ekleyebiliriz. q0 ve q1 durumları arasına bir geçiş ekleyelim.Ne var ki bu

geçişler oluşturulan sonlu otomatla karşılaştırıldığında birkaç farklı özelliğe

sahiptir.Bunlardan ilki,PDA tekli değil,3’lü girişe sahiptir.

48

İlk kutu işlenilecek girişleri gösterir,2.kutu: stack’in en üstünde yer alan şu anki değeri

gösterir,son kutu ise stack’e itilen(push) yeni değeri gösterir.hiçbir kutuda veri ekleme sınırı

yoktur.

Şimdi giriş değerlerini ekleyelim. Varsayılan geçişi değitirmek için ilk kutunun üzerine 2 kez

tıklayalım.ilk kutuya “a”,yığındaki ilk sembol olarak ”Z”,makine q0 durumundan sonra “z”ye

gitsin ve ”aZ”yi yığının en üstüne iteklesin(push).

Şimdi geçişleri bitirelim.q1 ile q1 arasına an e giden bir geçiş (a, a; aa) ekleyelim.q1 ve q2

arasında(b, a; λ) geçişi,q2 ve q2 arasında bn geçişini,son olarak ise q2 ile q3 arasında girişi izin

veren (λ , Z; Z) şeklinde bir geçiş oluşturduktan sonra aşağıdakine benzer bir görüntü elde

ederiz.

Yukarıdaki işlemleri kolay bir şekilde yapmak istiyorsanız pdaexample.jff dosyasını

indirebilirsiniz.Şimdi “input” menüsüne tıklayalım ve “Step with Closure.” Seçeneğini seçelim.

“aaaabbbb” (a4b4) değerini girdikten sonra “ok” tusuna bastığınızda aşağıdaki gibi bir

görüntü elde ederisiniz.

49

Yukarıdaki işlemler FA ekranı elde etme işlemiyle benzer işlemlerdir. Tek fark 2.kutu sola

doğru daha ağır işlemektedir.

İlk adımdan sonra anden sonra ilk b değerinden sonra bitiş

4.1.3.Nondeterministik NPDA’lar

Nondeterministik NPDAs elde etme işlemleri de aynı şekildedir.Aşağıdaki örneğe bu adresten

ulaşabilirsiniz.

50

Bir sonraki adımda “Input → Step by Closure” seçeneğine tıklayarak “aabb” değerini giriniz.

başlangıç adım 1 adım 2

otomatı nondeterministik yapmanın birkaç yolu vardır.Son adımlar,programda yer alabilecek

tüm permütasyonları içeren,sonuca götüren bir yol içerir.

Adım 3

Adım 4

Sonuçlar

4.2.NPDA’yı Bağlamdan Bağımsız Dilbilgisine Çevirme

4.2.1.giriş

NPDA’yı CFG(context-free grammar)’ye çevirmek için menü seçeneklerinden “Convert →

Convert to Grammar” i seçiniz.Ardından npdaToCfg.jff, dosyasını yükleyin ya da aşağıdakine

benzer bir NPDA oluşturunuz.

51

4.2.2. Dilbilgisine çevirme

Şimdi NPDA’yı CFG’ye çevirebiliriz. Menü seçeneklerinde“Convert → Convert to

Grammar”’e tıkladığınızda aşağıdaki bir görüntü karşınıza çıkacaktır.

JFLAP dönüşüm algoritması için sırayla, tüm geçişler yığından 1 sembolü pop gerektirir veya üstüne 2 veya 0 sembolleri push işlemi için pop gerekir. Ayrıca uç durum için Z pop gerekli olduğu unutulmamalıdır.

Menü seçeneklerinde “Convert → Convert to Grammar” seçtiğinizde bir hata mesajı ile karşılaşırsınız. Geçişin olmadığı durumlarda da bu mesaj ile karşılaşabilirsiniz. Aşağıdaki örnek için böyle bir durum söz konusu değildir. Bu nedenle bu örnekle devam edebiliriz.

Bu örnekle devam edebilmemiz için,otomat üzerindeki geçişlere tıklamamız ve sağ tarafta

52

oluşturulan gramer kurallarını göz önünde bulundurmaktır. Yığına pop ile veri gönderen bir geçiş oluşturalım.Sondaki 4 geçişe tıkladığınızda sağdaki kuralları aşağıdaki gibi görüntüleyebilirsiniz.

Ardından 2 geçiş daha ekleyelim.İlk geçiş q0dan q1’e olacak şekildedir.Ardından aşağıdaki gibi uzunca bir kural listesi karşımıza çıkacaktır.

Araç çubuğu üzerindeki butonların ne işe yaradığını merak edebilirsiniz. “Hint” butonuyla bir geçişe kural eklenebilir. “Show All” butonuyla diğer geçişlere kurallar eklenebilir. “What's Left” butonu şeçilmeyen geçişleri açığa çıkarır. “Export” butonu sağ tarafta listelenen yeni bir bağlamdan bağımsız dil kuralları oluşturacaktır.Jflap’ın mevcut versiyonunda bu örnek için export butonu kullandığınızda,buton çalışmayacaktır. Çünkü bu örnek çok fazla değişken oluşturmaktadır.ve aşağıdaki gibi bir mesajla karşılasacaksınız.

4.2.3 Yayımlanabilir örnek

npdaToCfg2.jff dosyasını indiriniz ya da aşağıdakine benzer bir NPDA modeli oluşturunuz.

53

Örnek Otomat Girişi (Input → Multiple Run) Kurallar Listesi

Dosyayı yayımladıktan sonra ürünlerin olduğu listeyi elde edebilirsiniz.

54

55

ÜNİTE 5 TURİNG MAKİNESİ

5.1.1 Tanım

JFLAPta bir Turing makinesi aşağıdaki değerlerle tanımlanır.

M = (Q, Σ, Γ, δ, qs, □, F)

Q Sonlu durumlar kümesi {qi | i negatif olmayan tamsayı}

Σ giriş alfabesi

Γ bant alfabesindeki sembollerin sonlu kümesi

δ geçiş fonksiyonu

S Q * Γn → Q * Γn * {L, S, R}n nin alt kümesi

□ boş sembol.

qs (Q’nun elemanı) başlangıç durumu

F (Q’nun alt kümesi) uç durumlar kümesi

5.1.2.Turing Makinesi Nasıl Oluşturulur?

Başlamadan önce menüdeki “Preferences” butonuna tıkladığınızda bir liste

belirecektir.Listeden “Enable Transitions from Turing Machine Final States”i işaretleyiniz.

L = {anbncn} diliyle tanımlanan bir Turing makinesi oluşturalım.Jflapta yeni bir Turing makinesi

oluşturmak için aşağıdaki gibi menü seçeneklerinde Turing Machine’i seçiniz.

Ardından pek çok menü,buton ve özelliğin olduğu boş bir ekran ile karşılacaksınız.

56

Şimdi de pek çok durum ekleyerek L = {anbncn} ile tanımlanan Turing makinesini olusturalım.

7 durum ekledikten sonra q0’ı başlangıç q6’yı uç durum olarak ayarlayadığımızda aşağıdakine

bnzer bir ekran görüntüsü elde ederiz.

Şimdi de geçişleri ekleyelim.q0 ile q1 arasına bir geçiş eklemeye çalışalım.Bu durum için sonlu

otomat için uygulanan geçişlere göre birkaç farklı özellik vardır.Bunlardan ilki burada tek

değil 3 giriş değeri vardır.

İlk kutudaki değer Turing makinesinin kafasının altındaki mevcut değeri gösterir. İkinci

değer,ilk değer ile yinelenen bant üzerindeki işlenmiş değerdir.Bu iki kutuda

kullanabileceğimiz karakter sayısı 1 ile sınırlandırılmıstır.3. değer ise işlem adımından sonra

kafanın nereye konumlanacağını gösterir. Üç değerden biri aşağdakiler gibi olabilir. 'R'(bir

kare sağa ilerle), 'L'(bir kare sola ilerle), S(bekle ve kafayı hareket ettirme).

57

Şimdi de giriş değerlerimizi ekleyelim. Varsayılan geçişi değiştirmek için il kutunun üzerine

tıklayalım.İlk kutu için “a”,2.kutu için “x”,üçüncü kutu için “R” değerlerini girelim.Tab tuşuna

basın ya da fareyi iki kutu arasında hareket ettirin,ardından enter’a basın ya da fareye

tıkladığınızda ekran karşınıza gelecektir.Bir geçiş eklediğinizde de aşağıdaki gibi bir görüntü

elde edeceksiniz.

Geçişleri tamamlayalım ve aşağıdaki gibi bir Turing makinesi elde edelim. Geçişleri

oluşturmakla uğraşmak istemiyorsanız turingAnBnCn.jff dosyasını indirerek işinizi

kolaylaştırabilirsiniz.

Menüdeki “İnput” butonuna ardından da “Fast Run”” seçeneğine tıklayarak makinemizi

çalıştıralım.giriş değerlerimizi girmeye başlayalım,”aabbcc” yani a2b2c2 ” değerini girdikten

sonra karşımıza aşağıdaki gibi bir görüntü çıkacaktır.

58

Bir kez aşağı kaydırdığımızda bandı,şu an ki durumu ve kafanın adım adım hareketini

gözlemleyebiliriz.

“Keep looking” butonu uygulayabileceğimiz,deterministik olmayan diğer olası yolları

bulmamızı sağlar.Makinemizi tamamladıktan sonra “I'm done.” Butonuna tıklayabiliriz.

5.1.3 Uç Durumdan Geçişler

“Enable Transitions from Turing Machine Final States”i aktifleştirdinizde.Aşağıdaki gibi iki uç

durumlu bir Turing makinesi elde edebiliriz.

59

Seçenek aktifleştirilmediğinde aşağıdaki gbi bir hata mesajı alınır.

5.2.Multi-Tape(çok bantlı) Turing makineleri

5.2.1. Giriş

Jflapta 2 ile 5 arasında değişen Turing makineleri ile Multi-tape Turing makinesi

oluşturulabilir.Örnekteki gibi L = {anbncn} ile bir 3 bantlı Turing makinesi oluşturalım.

60

5.2.2 Multi-Tape Turing Makinesi nasıl Oluşturulur?

Aşağıda gösterildiği gibi menü seçeneklerinden “Multi-Tape Turing Machine”ı seçiniz.

Ardından kaç tane bant uygulayacağınızı soran açılır bir pencere ile karşılacaksınız.Varsayılan

değer ikidir ancak istersek 2 ile 5 arasıda bir değer seçebiliriz.Anlaşılması kolay olması

bakımından biz bu örnekte 3 bantlı olarak seçtik.

Boş ekrana aşağıdaki gibi 5 durum ekleyelim.

Şimdi de geçişlerimizi ekleyelim. q0 ile q1 arasında bir geçiş ekleyelim ve ilk banta (b; b,

R) ,ikinci banta (□; □, S),üçüncü banta( □; b, R) değerlerini ekleyelim.

61

3 bant ilk geçiş

Geçişlerimizi bitirdiğimizde aşağıakine benzer bir ekran görüntüsü elde ederiz. Geçişleri oluşturmakla uğraşmak istemiyorsanız turingAnBnCnMulti.jff. dosyasını indirebilirsiniz.

Şimdi de Multi-tape Turing makinemizi çalıştırmaya çalışalım.önce “input” ardından step

butonuna tıklayınız.3 bantta değerler kaymaya başladığında ilk banta “aabbcc” etiketini

girip.2. banta hiçbir değer girmediğimizde aşağıdaki gibi bir görüntü elde edilir.

62

Soldaki yavaş kutu Sonlu otomat’ın seçenekleri arasında yer alan “Step with Closure”

butonundan farklıdır.Bu alıştırmada tüm bantlar gösterilmiştir ve kırmızı ile renklendirilen

alanlar bantın kafasının mevcut durumunu göstermektedir.

Step butonuna tekrarlı olarak bastığımız da simülasyonun çalışması aşağıdaki gibidir.

5.3. Yapı Taşları

Yapı Taşları (Building Blocks ) küçük turing makineleridir.Başlangıç için "Move Left Until a",

"Move Right Until a", "Move Left Until Not a", "Move Right Until Not a", b’nin ve boşlukların

benzeri. Yapı taşlarına aşağıdaki gibi "Move Left Until a" dahildir.

63

Jflapta yapıtaşı oluşturmak için Building Block Tool seçilmeli (ya da b tuşuna basılmalı).editör

paneline tıklayınız ve yapı taşı olarak kullanacağınız dosyayı seçiniz.Aşağıdaki Turing makinesi

yapı taşlarından yapılmıştır.

Dosyaya block eklemek için,aşağıda resimde koyu renkle gösterilen “Building Block Creator”

aracı seçilmelidir.

Editörün boş bir bölümüne tıklayınız.Blok ekleyeceğiniz dosyayı seçmeniz gereken bir

pencere belirecektir.

64

65

6.ünite Dilbilgisi

6.1.Dilbilgisi Girme

6.1.1. giriş

Jflap bağlamdan bağımsız gramer ve sınırsız gramer ayrıştırmasına olanak sağlar.

6.1.2 dilbilgisi nasıl girilir?

Bağlamdan bağımsız bir dilbilgisi oluşturmakla başlayalım. Aşağıda gösterildiği gibi menü

seçeneklerinden “Grammar” e tıklayınız.

Ardından aşağıdaki gibi bir görüntü elde edeceksiniz.Değişkenleri ve ürünlerini ilk satıra

girebilirsiniz. Değişkenler sol sütun,ürünler ise sağ sütunda yer almaktadır. Orta sütunda ise

değişkenden ürüne giden bir ok bulunmaktadır. Aşağıdaki gibi bir dil bilgisi girebilir ya da

contextfreeGrammar.jff dosyasını yükleyebilirsiniz.

Girişleri tamamladığınızda gramer editör pencereniz aşağıdaki gibi olacaktır.

66

Bu dilbilgisi anbmcp şeklinde bir dil oluşturur. m=n+p, n>0, p>0

6.2.Dilbilgisi Türünü test etme

6.2.1.giriş

Jflap kullanıcılar oluşturdukları dilin türünü tespit etmesine olanak verir.

6.2.2.Dilbilgisi türü nasıl test edilir?

Düzenli bir dilbilgisi girin ya da regGrammarToNFA.jff. dosyasını yükleyin.

67

Şimdi dilbigisi türünü test edebiliriz. Önce Test ardından Test for Grammar Type butonuna

tıklayınız.Jflap size dilbilgisi türünü açıklayacaktır.

Şimdi de farklı bir dilbilgisi giriniz ya da contextfreeGrammar.jff. dosyasını yükleyiniz.

68

Aynı butonlara tekrar tıkladığınızda aşağıdaki gibi bir ekranla karşılasırsınız.

69

6.3.Kaba kuvvet Ayrıştırıcı-düzenli ya da bağlamdan bağımsız dilbilgisi

6.3.1. Tanım

Jflap’ta bağlamdan bağımsız bir dil aşağıdaki gibi tanımlanır. G = (V, T, S, P)

V değişkenler kümesi (S başlangıç değişkenlerini gösterir).

T terminaller kümesi

P ürünler kümesi

A yalın değişken ve x sıfırın bir etiketiyse ürünler A->x formundadır.

6.3.2 . düzenli ya da bağlamdan bağımsız dilbilgisinde kaba kuvvet ayrıştırıcı nasıl

kullanılır?

Bir dilbilgisi giriniz ya da contextfreeGrammar.jff dosyasını yükleyiniz.Ardından Input ve

Brute Force Parse butonlarına tıklayınız.

Brute Force Parse butonuna tıkladıktan sonra aşağıdaki gibi bir görüntü elde edersiniz.

70

Ardından text boşluğuna “aabbbbbccc” (a2b5c3) etiketini giriniz. Start butonuna tıklayınız ya

da enter tuşuna basınız

Brute Force Parser girdiğiniz etiketleri kabul edecektir.Şimdi de Step butonuna tıklayalım ve

ürünlerin nasıl oluştuğunu görelim.Step butonuna 2 kez bastığınızda aşağıdaki gibi bir

görüntü ile karşılacaksınız.

71

Pencerenin en altında “Derived bBc from B” şeklinde bir mesaj görüntülenecektir. Bu mesaj

son ürünün de eklendiğini belirtmektedir.Bir dilin nasıl türetildiğini Derivation Table

butonuyla görüntüleyebiliriz.

Derivation Table kipini değiştirmek için, Noninverted Tree’ye tıklayınız ve Derivation Table’ı

seçiniz. Brute Force Parse penceresi aşağıdaki gibi değişecektir.

72

Türetme tablosu(derivation table) ürünlerin nasıl oluşturulduğunu gösterir. Brute Force

Parse(kaba kuvvet ayrıştırma) işlemi bittiğinde Derivation Table ve Noninverted Tree

aşağıdaki gibi görüntülencektir.

73

6.4. Çoklu Girişle Dilbilgisinin Çalıştırılması

Aşağıdaki gibi bir dil bilgisi oluşturun ya da multirun_grammar.jff . dosyasını

yükleyin.Dilbilgisini birden fazla etiketle kontrol etmek için Input menüsünden Multiple

BruteForce Parse seçeneğini seçiniz.Sağda yer alan tablo giriş ve sonuç sütünlarını

barındırır.Test etiketi eklemek için giriş sütununa bir kez tıklayınız,etiketi giriniz ve enter’a

basınız.

74

Şimdi dosyadan etiket ekleme işlemini gerçekleştirelim. Load Inputs’a tıklayınız ve

muti_run_inputs.txt. dosyasını yükleyiniz.Çalıştırdığınızda aşağıdaki gibi bir ekranla

karşılaşırsınız.

Bu işlemin ardından dizgesel ağaç oluşturmak için ayrıştırma yapamak isterseniz,satır

üzerindeki etiketi seçiniz ve solda yer alan Start butonuna basınız.

75

Eğer etiket kabul edilirse Step’e basabilir ve dizgesel ağacı görebilirsiniz.

6.5. Brute Force Parser(kaba kuvvet ayrıştırıcı)-sınırsız dilbilgisi

6.5.1 Tanım

Sınırsız dilgisi bağlamdan bağımsız dilbilgisi(CFG) ile çok benzerdir,ürünlerin sol yanında boş

lmayan terminal etiketleri ve değişkenler yer alabilir.

6.5.2 Sınırsız Dilbilgisi Üzerinde Brute Force Parser Nasıl Çalıştırılır?

anbncn, n>0 dili için sınırsız bir dilbilgisi yükleyerek başlayabiliriz. unrestrictedGrammar.jff

dosyasını yükleyiniz.Ardından dilbilgisi editörünüz aşağıdaki gibi görüntülenecektir.

76

Input’a tıkladıktan sonra Brute Force Parse seçeneğini seçtiğinizde aşağıdakine benzer bir

görüntü elde edersiniz.

Text alanına “aabbcc” (a2b2c2) etiketiniz giriniz.Ardından start butonuna tıklayınız.

77

Step butonuna ilk 3 tıklayışınız da Brute Force Parser bağlamdan bağımsız dilbilgisi gibi

çalışacaktır.Step butonuna 4. Kez tıkladığınızda Brute Force Parser’ın “B” değişkenlerini

birleştirdiğini terminal “b”nin mavi oval şekil aldığını ve bunların 2 düğümü kullanarak “Bb-

>bB”yi ürettiğini fark edecek ve asağıdakine benzer bir görüntü elde edeceksiniz

78

Step butonuna birkaç kez tıkladığınızda Brute Force Parser iki komşu değişkeni ya da

terminali birleştirir ve onların yerine sağ tarafa ürünlerini yazar.Aşağıda en son elde edilen

sonuçların Non-inverted Tree ve Derivation Table’ı aşağıdaki gibidir.

79

6.6.Cyk ayrıştırıcı

6.6.1.Giriş

Cyk ayrıştırıcı verilen dilbigisini CNF forma dönüştürür ve CYK parsing algoritmasıyla gramere

ait etiketleri kontrol ederek performansı artırır.

6.6.2 CYK ayrıştırıcı Nasıl Çalıştırılır?

Aşağıda gösterildiği gibi bir dil bilgisi oluşturun ya da grammarForCYK.jff. dosyasını yükleyin.

80

Sırasıyla Input ve CYK Parse butonlarına tıklayınız. CYK Parse’a tıkladıktan sonra Brute Force

Parse penceresine benzer bir pencere elde edeceksiniz.

Şimdi dilbilgine ait etiketleri girebiliriz. “aabbb” etiketini girelim.

81

Etiket dilbilgisi tarafından kabul edildikten sonra Step butonuna tıkladığımızda aşağıdakine

benzer bir görüntü elde ederiz.

82

CYK Parse alışılagelen Brute Force Parse butonuna göre çok daha hızlı çalışır.

83

7.Ünite Düzenli İfadeler

7.1.Tanım

Düzenli ifadeler,düzenli dilbilgilerinin farklı bir gösterim şeklidir ve bir alfabe üzerinden

tanımlanır(Σ).En basit düzenli ifade sembolleri λ, ∅, ve Σ’dır.Jflap’ta düzenli ifadeler aşağıdaki

gibi tanımlanır:

( , ) sıralı işlemleri tanımlada yardımcı olarak kullanılır

* Kleene star

+ Birleşim operatörü

! boş etiketleri göstermek için kullanılır.

Operatörlerle ilgili bazı özellikler aşağıdaki gibidir.

7.2 Düzenli İfade Oluşturma

Yeni bir düzenli ifade oluşturmak için aşağıdaki gibi menü seçenklerinden Regular

Expression ‘a tıklayınız.

Ardından aşağıdaki gibi boş bir ekranla karşılacaksınız.

84

Şimdi istediğiniz bir ifadeyi giriniz ya da regExprToNfa.jff. dosyasını yükleyiniz.

7.3.NFAya çevirme

Düzenli bir ifade girdikten sonra menü seçenklerinden menü çubuğundan “Convert →

Convert to NFA” ‘ya tıkladığınızda aşağıdakine benzer bir görüntü elde edeceksiniz.

85

Şimdi de “(D)e-expressionify Transition” botonuna tıklayalım.Ardından q1 ile q2 arasında bir

geçiş oluşturduğumuzda simülatör aşağıdaki gibi olacaktır.

86

Soldan 2.sırada yer alan “(T)ransition Creator” butonuna tıklayarak devam edelim.İlk

geçişimiz oluşturuldu.q0 dan q2 bir geçiş daha oluşturalım.Bu geçiş “λ”geçişi

olacaktır.Ardından q0 dan q4e bir geçiş oluşturalım.Bu geçişin geçersiz olduğunu fark

edeceksiniz.Çünkü birleştirme işlemi, “a*” ve “b” alt ifadeleri ile görevlidir,her “b” NFA’nın

bir parçası olan “a*”’ı işlemelidir.Son olarak q3 ile q4 arasında bir geçiş oluşturduğunuzda

kabul görecektir.

q7 den q6 son geçişi oluşturalım ve q7 den uç durum q1’e bir “λ”geçişi ekleyelim.Tüm bu

işlemlerin ardından aşağıdaki gibi bir görüntü elde edeceksiniz.

Şimdi de , “a*” ifadesini ayrıştıralım.q8 ve q9 durumlarını ve q2” den“q8”e, “q9” dan“q3”e,

“q2” den“q3”e, ve “q3” den “q2”ye geçişler ekleyelim.q0 dan q3e bir geçiş

ekleyemeyeceğimizi fark edeceksiniz. “a*”ifadesinden dolayı geçiş doğrudan q2ye

olacaktır.Eğer sıkıldıysanız,bir sonraki adımda yer alan ayrıştırma işlemini yapmak için “Do

Step” butonuna tıklayabilirsiniz.Basitçe NFA’mızı tamamaladıktan sonra “Do All” butonuna

basalım. Ardından aşağıdaki gibi bir ekranla karşılacağız.

87