jflap İle otomata teorisi
DESCRIPTION
Jflap ile otomata teorisiTRANSCRIPT
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.
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.
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.
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.
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.
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.