Sonlu dizeler dizisi verilen bir gramer oluşturmak için bilinen bir yöntem var mı?


10

Okuduğum kadarıyla, çoğu gramer sonsuz sayıda dize oluşturmakla ilgileniyor gibi görünüyor. Ya başka bir şekilde çalışsaydın?

Eğer m uzunluğunda dizeler verilirse, bu dizeleri ve sadece bu dizeleri oluşturacak bir dilbilgisi yapmak mümkün olmalıdır.

Bunu yapmak için bilinen bir yöntem var mı? İdeal olarak bir teknik ismi araştırabilirim. Alternatif olarak, böyle bir yöntemi bulmak için literatür taraması yapmaya nasıl devam edebilirim?


5
Önemsiz: Dizelerin BNF tablosunu oluşturun.
Joshua

Dizeler tanım gereği sonludur. Ve bunun sınırlı bir tanımına sahip olmadığınız sürece sonsuz bir setin "verileceği" olamaz.
vonbrand

Yanıtlar:


11

Muhtemelen sonsuz düzenli diller için dilbilgisi oluşturmak zor ve bu sorundan oldukça farklıdır.
reinierpost

Bu soruyu doğru işaretliyorum, çünkü soruyu doğrudan cevaplamasa da (ki bu açıkça belirtildiği gibi çözülebilir), daha fazla araştırma yapmam gereken terminoloji türünü sağlıyor.
Gustav Bertram

8

Dizelerin sayısı sonlu ise , her zaman tüm bu dizeleri oluşturan dilbilgisi ile gelebilirsiniz, terminal olmayan olsun , kural olabilir . Sonlu dizeler kümesi için, yalnızca bu dizeleri kabul eden sonlu bir durum otomatı bile bulabilirsiniz. Sonlu dizi dizisi durumu gerçekten önemsizdir.S={s1,s2....sm}AAs1|s2|...sn


Sanırım ayrıştırma ders kitabımı gözden geçirmem gerekiyor. Geçmişe bakıldığında bu cevap açık görünüyor. Teşekkür ederim!
Gustav Bertram

3

Birçok yol var, bu nedenle sonuçların kalitesi hakkında ek kriterler dayatmanız gerekiyor.

  1. Liste: Dildeki her dizesi için, kuralına sahip olun . Let başlayan terminal olmayan olun. Bitti.wSwS
  2. Önek ağacı: Her önek için dilde bir dize, terminal olmayan var . Her dize için dilinde, bir semboldür, kural var . her dizesi için kuralına sahip . Let başlayan terminal olmayan olun. Bitti.wXww1xw2xXw1xXw2wXwϵXϵ
  3. Sonek ağacı: aynı, ters çevrilmiş.
  4. Minimum boyutta bir gramer üretmesi garanti edilen bir algoritma uygulamak, örneğin minimum sayıda kuralla. Bunun ne kadar zor olduğunu bilmiyorum.

Evet, ilk cevaptan sonra ek kriterler dayatmam gerektiği aşikardı, ancak ilk cevaptan sonra soruyu değiştirmek haksızlık hissetti.
Gustav Bertram

Yine de, belirli bir sonlu dizi dizisi için minimal bir gramer bulmanın zaman karmaşıklığını bilmek isterim ... diyelim ki, dizelerin toplam uzunluğunda veya sonucun toplam uzunluğunda.
reinierpost

3

Sorduğunuz şey bir arama dizinine benzer. Gerçekten de Sonlu Durum Dönüştürücüler oluşturulabilir ve bunlara beslenen metni tanımak için kullanılabilir. Örnek olarak Lucene şu algoritmayı kullanır: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.24.3698

Pratik bir kullanım için Andrew Gallant'ın bu blog gönderisine göz atın: Dizin 1.600.000.000 Automata ve Rust ile Anahtarlar

Mesajda, tüm kelimeleri tanıyacak şekilde bir metin bütünü verilen bir FSA oluşturma yöntemi açıklanmaktadır. Nihai sonuç, önceden sıralanmış tuşlardan doğrusal zamanda ve sabit bellekte yaklaşık olarak en az FST oluşturmaktır.

ÖSO paylaşım ön ekleri ve son ekleri

Uygulama fstkütüphanesinde mevcuttur : https://github.com/BurntSushi/fst


1

Reinierpost tarafından sorulan ve orijinal soruya da cevap veren soruya bir cevap:

Sözlük otomatını şu şekilde oluşturuyoruz:

  1. tam olarak ilk dizeyi okuyan ve kabul eden bir otomat oluşturun.
  2. sonraki dize için, bir harf için geçiş kalmayıncaya kadar otomat ile okumaya başlayın. dizenin geri kalanı için yeni bir dal başlatın. tüm dizeler işlenene kadar tekrarla

Otomatiğin maksimum boyutu, giriş dizelerinin toplam uzunluğudur. Geçişleri simüle edebileceğiniz ve sabit zamanda yenilerini oluşturabileceğinizi varsayarsak, çalışma zamanı da girdi dizelerinin toplam uzunluğudur. En iyi ya da en kötü durum yok.

Bu otomat çok az. normal durumda otomata ve gramerler neredeyse bire bir karşılık geldiğinden, aynı gramer için de geçerlidir, Tabii ki, n boyutundan daha az zamanda n boyutunda bir şey inşa etmek imkansızdır.


Teşekkürler. Bu soruya cevap olarak: Bunun reinierpost'a ne katkısı olduğunu görmüyorum. Ayrıca, başka bir yanıta yanıt veren veya bu yanıta yorum yapan yanıtlar istemiyoruz: bu bir tartışma forumu değil. Bunu yapmanın yolu yeni bir soru göndermek ve daha sonra kendiniz cevaplamak olacaktır. Bunun açık olmayabileceğinin farkındayım. [Yani, cevabınızın reinierpost'un merak ettiği soruna nasıl cevap verdiğini göremiyorum. Reinierpost'un cevabının sonundaki sorun, minimum kural sayısına sahip bir dilbilgisi bulmaktı. Yanıtınız, en az sayıda duruma sahip bir DFA'nın nasıl oluşturulacağını gösterir. (devamı)
DW

1
Tabii ki bu DFA'yı normal bir dilbilgisine dönüştürebiliriz, ancak dilbilgisindeki kural sayısı açısından bunun asgari olacağını düşündüğünüz şey nedir? Bunun kanıta ihtiyacı var gibi görünüyor.]
DW

Cevabımın katkıda bulunduğu çalışma zamanı. Haklısın, söylediğim birkaç şeyin bir kanıta ihtiyacı var. Ancak Sonlu Otomata geçişleri ve Düzenli Gramer kuralları arasındaki yazışma benim için çok açıktır (eğer ikincisi çoğu tanımda olduğu gibi kural başına sadece bir terminal oluşturabilirse); o zaman benimkinden daha küçük herhangi bir dilbilgisi, en küçük olandan daha küçük bir otomat verecektir. Bu yüzden minimal otomanın (benimkinin minimum olduğunu kanıtlamıyorum) dilbilgisinin de minimum olacağını düşünüyorum. - Cevaplarla ilgili tavsiyelerinizi akılda tutacağım, teşekkürler
Peter Leupold

DFA'lar için minimalite kavramı, devlet sayısı ile ilgilidir . Bu , DFA'daki geçişlerin sayısı ile ilgili minimallik mi yoksa ortaya çıkan dilbilgisindeki kural sayısının minimitesi mi anlamına geliyor? Sanırım metriğinizin ne olduğunu takip etmeliyiz, aksi takdirde elmaları portakal ile karşılaştırırız.
DW

Doğru, Termson olmayan terminallerde dilbilgisi minimal olacaktır. Kurallar için bu açık değildir.
Peter Leupold
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.