LR ayrıştırma ile permütasyon cümleleri


16

Bir permütasyon ifade: permütasyonu ifade için standart (S) BNF bağlam bağımsız dilbilgisi tanımları bir uzantısıdır ihtiva üretimi (ya da eşit şekilde, nonterminallerdir) yoluyla . Permütasyon cümlesi pozisyonunda, bu prodüksiyonların her birini tam olarak bir kez görmek isteriz, ancak bu terminal olmayanların siparişiyle ilgilenmiyoruz.n A 1 A n{bir1,...,birn}nbir1birn

Örneğin:

S <- X { A, B, C } Y

şuna eşittir:

S <- X  A B C  Y
S <- X  A C B  Y
S <- X  B A C  Y
S <- X  B C A  Y
S <- X  C A B  Y
S <- X  C B A  Y

Bu kavram "Bağlamdan bağımsız gramerlerin permütasyon cümleleriyle genişletilmesi" nde ortaya çıkmaktadır . Burada, bir LL (1) ayrıştırıcısı kullanılarak bu cümlelerin doğrusal zamanda nasıl ayrıştırılacağı da açıklanmaktadır.

"Permütasyon cümleciklerini ayrıştırma" makalesi , ayrıştırıcı birleştiricileri kullanarak permütasyon cümleciklerini ayrıştırma yöntemini açıklamaktadır. Bunlar, permütasyon cümleleri ve bunları nasıl ayrıştıracağımız hakkında konuştuğum sadece iki makale.

LL (1) tabanlı ayrıştırıcılarla bu tür permütasyon cümlelerini kolayca ayrıştırabildiğimize göre, tahminim LR (1) tarzı ayrıştırıcılarla aynı şeyi yapabiliriz. Benim sorum bu nedenle:

Permütasyon cümleleri içeren bir dilbilgisi, makul büyüklükte bir tablo korunurken, LR (1) makineleri kullanılarak girdi dizesi boyutunda doğrusal olarak zaman içinde ayrıştırılabilir mi?

Permütasyon cümleleri, bağlamsız dillerin gücünü genişletmez: yukarıdaki örnekte olduğu gibi, olası tüm permütasyonları numaralandırabilir. Ancak, sonuçta ortaya çıkan dilbilgisi Boyutunda olabileceğinden dilbilgisi patlar . Bu, doğrusal zaman ayrıştırmasına izin verir, ancak dilbilgisinin boyutu çok büyür.Ö(|G,|!)

Yukarıdaki yaklaşım herhangi bir ayrıştırma algoritması için işe yarar (faydalı olmasa da), bu yüzden belki belirli algoritmalar için daha iyisini yapabiliriz. İfadeleri LR tablosuna kodlayarak havaya uçmayı 'sadece' üstel ( ) azaltabiliriz: LR öğelerinin henüz hangi yapımların görülmediğini kodlamasını sağlayabiliriz ve bu nedenle patlamayı azaltabiliriz permütasyon cümlelerinin tüm alt kümelerine.Ö(2|G,|)

Bu daha iyi olmasına rağmen, elbette yeterince iyi değil - 30 maddelik permütasyon ifadesine sahip olmak dilbilgisini kullanılamaz hale getirecektir. LR ayrıştırma işleminin hala bir kısmına değinmedik ve bu ayrıştırma için kullanılan gerçek yığın tabanlı yordam. Sayaçları yığına kaydetmenin sorunu çözebileceğini düşünüyorum, ancak bunu nasıl yapacağımdan emin değilim.

Şu anda bir ayrıştırıcı jeneratör uyguluyorum ve sorun etki alanı permütasyon cümleleri cennetten bir hediye olurdu. LR (1) makine kullandığım için yukarıdaki soru takip etti.


LR (1) ayrışmasının karmaşıklığı, permütasyon cümleleri olmadan dilbilgisi boyutunda zaten üsteldir --- ayrıştırıcının "anında" hesaplamasını uygulamanız dışında, ancak daha sonra bir Earley ayrıştırıcısı gibi hissettirir. gerçek LR (1) bir.
Sylvain

2
Sorunuzun geri kalanı hakkında: cstheory.stackexchange.com/questions/4962/… , permütasyonlar için bir CFG'nin boyutunda üstel bir alt sınır gösterir ve PDA'lardan CFG'lerin olağan polinom yapısı ile bu, PDA'nın boyutu da.
Sylvain

1
LL (1) ile ilgili makaleye bakmamıştım. Aslında, uygulanan ayrıştırıcı artık bir PDA değildir. Değişmeli bağlamsız gramer üyeliği NP-tam olduğu için hala "makul boyutta bir tablonun" varlığına inanmıyorum (bkz. Örneğin dx.doi.org/10.3233/FI-1997-3112 ), ama doğru zor örneklerin LR olmayabilir (1).
Sylvain

2
@Sylvain: 4962 sorusunun bununla ilişkisini ayrıntılı olarak açıklayabilir misiniz? 4962 numaralı soruda, her girdi uzunluğu için permütasyon sabittir ve izin verilecek dizeler değişir. Mevcut soruda, permütasyonu düzeltmiyoruz. Bu yüzden aralarında gerçek bir bağlantı göremiyorum.
Tsuyoshi Ito

2
@Tsuyoshito Ito: LR (1) 'de giriş dilbilgisine eşdeğer bir DPDA ayrıştırma ilk önce oluşturulur ve daha sonra tanımak için dizeye karşı çalıştırılır. Her permütasyon dili için permütasyon cümleleri olan doğrusal boyutlu bir CFG olduğundan, Yuval Filmus'un makalesi (bu, cstheory'deki cevabından daha kapsamlı: bkz. Cs.toronto.edu/~yuvalf/CFG-LB.pdf ) bu tür DPDA giriş dilbilgisi boyutunda polinom boyutunda olabilir.
Sylvain

Yanıtlar:


1

Bunu anlamsal bir soruna dönüştürmeyi düşündünüz mü? {A, B, C} terminallerinin tüm permütasyonları için dilbilgisi kuralları yerine, (A | B | C) ^ 3'ü tanımak için sadece bir tanesinin tanınmasını sağlayan özel dahili kodla birlikte bir kurala sahip olun, aksi takdirde bir hata. Yukarıdaki maddeden önce, A, B ve C'leri saymak için kullandığınız her şeyin başlatılmasını tetikleyen ve azalması sayaç kontrolünü tetikleyen ve (gerekirse) hatayı bildiren boş bir üretim ekleyeceğim. (elbette, dilbilgisi A, B ve / veya C aracılığıyla tekrarlanırsa bu biraz zor olabilir)


0

Birinin sayaca ihtiyacı olduğunu sanmıyorum. Aslında tüm permütasyonları kontrol edersiniz ama

sözde kodu:

perm-match(input, pattern)
     if pattern = nil return true

     foreach(rule in pattern)
         if (match(input, rule))
             perm-match(input - matchedpart, pattern - rule)
             break
         end
     end
     return false
end

İşte daha somut bir örnek

Varsayalım abcd herhangi bir permütasyon maç için çalışıyoruz ve bizim dize bcda

  • Adım 1: İlk eşleşen sembolü bulun. Bu durumda b
  • Adım 2: Bu sembolü desenimizden çıkarın ve dizeyi azaltın: örn. Acd ve cda kaldı
  • Adım 3: Yeni dizelerde 1. adımı tekrarlayın
    • cda bizi reklam ve da ile bırakan cda ile eşleşir
    • bizi d ve d ile bırakan da bir eşleşme
    • d, d ile eşleşir ve her iki dizgide de bizi nil bırakır

Gördüğünüz gibi, bu basit algoritma basitçe "dizeleri" sıra dışı bir şekilde karşılaştırarak bir permütasyonu kolayca kontrol edebilir. İşlevin karmaşıklığının O (n!) Daha kötü durum ve O (1) en iyi durum olduğunu unutmayın. Bir anlamda sembolleri bir dizide eşleşecek şekilde depolayarak sayıyoruz. Biri çoğu durumda çok büyük n ile uğraşmayacağı için bunun genel olarak "hızlı" olacağını düşünürdüm.


2
nn=50
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.