NFA kullanmadan normal ifadeden DFA nasıl oluşturulur?


12

Amaç, normal bir ifadeden DFA oluşturmak ve "Normal exp> NFA> DFA dönüşümü" kullanmak bir seçenek değildir. Kişi bunu nasıl yapmalı?

Bu soruyu profesörümüze sordum ama sezgiyi kullanabileceğimizi ve herhangi bir açıklama yapmayı reddettiğimizi söyledi. Bu yüzden size sormak istedim.

"Normal exp> NFA> DFA dönüşümü" bir seçenek değildir, çünkü böyle bir dönüşüm oldukça karmaşık bir normal ifadeyi dönüştürmek için çok zaman alır. Örneğin, belirli bir normal ifade için "normal ifade> NFA> DFA" bir insan için 1 saat sürer. Regex'i 30 dakikadan daha az bir sürede DFA'ya dönüştürmem gerekiyor.


2
Daha fazla bağlam sağlamanız gerekiyor. Şu anda düzenli ifadeleri çevirmek için hangi (resmi olmayan) algoritmayı kullanıyorsunuz? Sürecinizi bunun gibi bir örnekle açıklamak yararlı olabilir a(a|ab|ac)*a+. Bunu doğrudan bir DFA'ya indirdiğiniz bir NDFA'ya çevirebilir veya hemen bir DFA ile eşleşen bir şeye normalleştirebilirsiniz.
amon

Ne olursa olsun belirli örnekler üzerinde yapmak zorunda mısınız, ya da bir bilgisayar tarafından uygulanabilmesi için genel bir prosedür sağlamak zorunda mısınız?
babou

Yanıtlar:


18

"Regex'i DFA'ya 30 dakikadan daha az bir sürede dönüştürmek" istediğiniz için, nispeten küçük örnekler üzerinde elinizle çalıştığınızı düşünüyorum.

Bu durumda , doğrudan bir dilin Nerode otomasyonunu (minimum belirleyici otomasyonuna eşit olduğu bilinen) hesaplayan Brzozowski algoritmasını kullanabilirsiniz . Türevlerin doğrudan hesaplanmasına dayanır ve aynı zamanda kesişim ve tamamlamaya izin veren genişletilmiş düzenli ifadeler için çalışır. Bu algoritmanın dezavantajı, yol boyunca hesaplanan ifadelerin denkliğini, pahalı bir süreç kontrol etmesini gerektirmesidir. Ancak pratikte ve küçük örnekler için çok etkilidir.[1]

Sol bölümler . Let bir dil olmak ve izin bir kelime. Daha sonra dil denen sol bölüm (ya da türevi sol ) ve .A u u - 1 L = { v A u v L } u - 1 L LLAu

u1L={vAuvL}
u1LL

Nerode otomatı . Nerode otomat ve olan belirleyici otomat burada , ve geçiş işlevi, her her formülüyle tanımlanır. Bu oldukça soyut tanıma dikkat edin. Her durumu, kelimesinin soldaki bir kelimesidir ve dolayısıyla nin bir dilidir . İlk durum dilidir ve son durumlar kümesi, soldaki tüm bölümlerin kümesidir.A ( L ) = ( Q , A , , L , F ) Q = { u - 1 L u A } F = { u - 1 L u L } a A ( u - 1 L ) a = a - 1 ( u - LLA(L)=(Q,A,,L,F)Q={u1LuA}F={u1LuL}aA

(u1L)a=a1(u1L)=(ua)1L
ALALL bir kelime ile .L

Brzozowski'nin algoritması . Let harften. Aşağıdaki formülleri kullanarak sol bölümleri hesaplayabilirsiniz: a,b

bir-11=0bir-1b={1Eğer bir=b0Eğer birbbir-1(L1L2)=bir-1L1u-1L2,bir-1(L1L2)=bir-1L1u-1L2,bir-1(L1L2)=bir-1L1u-1L2,bir-1L*=(bir-1L)L*
bir-1(L1L2)={(bir-1L1)L2si 1L1,(bir-1L1)L2bir-1L2si 1L1

Örnek . İçin , gittikçe olsun: , aşağıdaki minimum otomasyonu verir. L=(bir(birb)*)*(bbir)*

1-1L=L=L1bir-1L1=(birb)*(bir(birb)*)*=L2b-1L1=bir(bbir)*=L3bir-1L2=b(birb)*(bir(birb)*)*(birb)*(bir(birb)*)*=bL2L2=L4b-1L2=bir-1L3=(bbir)*=L5b-1L3=bir-1L4=bir-1(bL2L2)=bir-1L2=L4b-1L4=b-1(bL2L2)=L2b-1L2=L2bir-1L5=b-1L5=bir(bbir)*=L3
Minimum otomat

[1] J. Brzozowski, Normal İfadelerin Türevleri, J.ACM 11 (4), 481–494, 1964.

Düzenle . (5 Nisan 2015) Benzer bir soruyu daha yeni keşfettim: Belirli bir normal ifade ile tanımlanan dili tanıyan bir DFA'nın oluşturulması için hangi algoritmalar var? diye sordu. Cevap kısmen karmaşıklık sorunlarını ele alıyor.


Bu algoritmanın karmaşıklığı hakkında daha fazla şey söyleyebilir misiniz?
babou

@babou RE'yi bir DFA'ya dönüştürmek PSPACE zordur, bu yüzden kesinlikle üsteldir.
15:15, jmite

Bu muhtemelen cevabın içine girmelidir. OP, "NFA üzerinden standart yapılar çok yavaş" ile başlıyor ve cevabın bir kısmı "kötü şans, gerçekten hızlı bir çözüm yok" gibi görünüyor. Burada bunun standart yapıdan daha iyi olup olmadığını tartışmaya devam ediyor. (cc @jmite)
Raphael

@jmite Evet bunu bekliyordum. Sorumun nedeni, DFA'nın bu şekilde oluşturulmasının neden daha kolay düşünülmesi gerektiğidir. (not: Sistem @ jmite cevabını bana bildirmek için tam bir gün aldı).
babou

2

J.-E. Pin, formalite ve bütünlük açısından daha iyi bir cevap sağlar, ancak bence profesörünüzün ima ettiği “sezgi” için söylenecek bir şey var.

Bu vakaların çoğunda, yapılacak en kolay şey, düzenli bir ifadeye bakmak, hangi dili kabul ettiğini anlamak, daha sonra bu dili kabul eden bir DFA oluşturmak için yaratıcılığınızı / akıllılığınızı kullanmaktır.

Bunu yapmanın, başkalarının verdiği algoritmalar dışında basit bir yolu yoktur, ancak işte faydalı olabilecek bazı yönergeler.

  1. Kendinize sorun, yalnızca RE veya çok küçük tamsayı değişkenlerini kullanarak bu RE'yi kabul eden bir program yazabilir miyim? Ardından bu programı yazın ve her değer kombinasyonu için bir durumun bulunduğu bir DFA'ya dönüştürün.

  2. Düzenli ifadenin deterministik olarak kabul edebileceğinizi bildiğiniz bölümlere bakın, burada "Bunu görürsem RE'nin bu bölümü ile eşleşmeliyim." Bunların her zaman tonlarca olmayacak, ancak bu parçaların tanımlanması DFA yapmak kolay olacak parçaları gösterebilir, böylece determinizm gerektirmeyen parçalar için daha fazla zaman harcayabilirsiniz.

  3. NFA-> DFA için alt küme yapısı aslında bir algoritma kadar karmaşık değildir. Dolayısıyla, bu bir sınav sorusu değil bir ödevse, yalnızca bir uygulamayı kodlamak ve programınızın NFA'yı DFA'ya dönüştürmesine izin vermek daha hızlı olabilir. Kendi kodunuzu kullandıysanız, herhangi bir plagarizm sorunu olmamalıdır.

Ne yaparsanız yapın, herhangi bir tekniğin en kötü durumda katlanarak patlayacağını unutmayın (bunun için bir polinom algoritması bulamazsanız, bu durumda tebrikler, kanıtladınız ve şimdi bir milyonersiniz) .)P=N-P=PSPbirCE

"İleriye bakmaya" çalışın, sezgilerinizi algoritmanın birçok adım gerektireceği, ancak net olduğu yerlerde kullanabileceğiniz köşeleri kesin.


-2

Bu doğru yol olmasa da çoğu zaman işe yarar.

İlk Adım : Normal İfade ile kabul edilebilecek en küçük dizeyi bulun. İkinci Adım : Minimum dizi kabul eden makinenin işlemiyle gerekli durumları çizin. Üçüncü Adım : Tüm durumlar için kalan alfabe işlemlerini çizin.

Örneğin: Normal İfade (0 + 1) * 1 "1 ile biten dize Adım 1: En Küçük Dize: 1 Adım 2: iki durum Q0 ve Q1. Q0'dan Q1'e 1 işlemine sahip olmak. ve Q1 kabul eden durumdur. Adım 3: Q0 Durumu için Q0 1 işlemi Q1'e yapılır. Şimdi Q0'da 0 işlem yapın. 1. Çeyrek Devleti için 1. işlem 1. Çeyrekte kalacaktır. Ve 0 işlem S0'da olacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.