Birisi bağlama duyarlı bir dilbilgisinin basit ama oyuncak olmayan bir örneğini verebilir mi?


12

Bağlama duyarlı gramerleri anlamaya çalışıyorum.

Dillerin neden hoşlandığını anlıyorum

  1. {ww|wbir*}
  2. {birnbncn|nN-}

bağlam içermez, ancak türetilmemiş lambda hesabına benzer bir dilin içeriğe duyarlı olup olmadığını bilmek istiyorum.

Basit, ama oyuncak olmayan bir örnek görmek istiyorum (yukarıdaki oyuncak örneklerini göz önünde bulunduruyorum), bazı üretim kuralı için, örneğin bazı sembol dizelerinin olup olmadığını söyleyebilen bağlama duyarlı bir dilbilgisi örneği şu anda kapsam dahilindedir (örneğin, bir fonksiyonun gövdesini üretirken).

Bağlama duyarlı dilbilgisi tanımsız / tanımlanmamış / sınırsız değişkenleri sözdizimsel (anlamsal değil) hatası yapacak kadar güçlü mü?


1
hemen hemen tüm gerçek programlama dilleri içeriğe duyarlıdır (genel anlamda, yani "içeriğe duyarlı" altında hem chomsky tip-0 hem de tip-I gramerlerini karıştırmak). Örneğin, değişkenlerin kullanılmadan önce bildirilmesi gerekir, tanımlayıcılar benzersiz olmalıdır, tüm bunlar bağlam gerektirir (semantik bağlam olarak adlandırılır, ancak yanıltıcı olabilir) cs.purdue.edu/homes/hosking/502/notes/04-semantics.pdf
Nikos M .

"Bağlam duyarlı", tip-1 gramerler için standart terimdir.
reinierpost

Yanıtlar:


8

Evet, bunun mümkün olabileceğine inanıyorum, ancak hayır, bu bağlam-duyarlı dilbilgisini açıkça inşa etmek istemiyorum. Cevabımı soruyu iki farklı bölüme ayırarak açıklayacağım.

(1) Oyuncak olmayan örnek ne olurdu? Değişkenlerin beyanını yansıtmalıdır. Gerçek programlamadan soyutlanmış böyle bir dil önerim böyle bir şey olurdu. Alfabe . Bu dil içeriğe duyarlıdır.{ w 1 ; w 2 ; ; w n ( x 1 ; x 2 ; ; x m ) w i , x j{bir,b,;,(,)}

{w1;w2;...;wn(x1;x2;...;xm)|wben,xj{bir,b}*, her biri xj bazılarına eşittir wben}

(2) aslında göstermek için ise başka bir formalizmini kullanırsınız içeriğe duyarlı. Bantını doğrusal kullanan bir Turing makinesinin makinesi: doğrusal sınırlı bir otomat LBA. Ben desen eşleştirme yapmak için programlayabilirsiniz / art arda her ve uygun bir , harf harf ile eşleştirmeye çalışın . LBA'lar bağlama duyarlı dilbilgisine eşdeğerdir, ancak programlanması çok daha kolaydır.w jxjwj


Gönderi için teşekkürler. Şu andan itibaren LBA'lara daha az aşinayım, bu yüzden nokta (2) ile daha az ikna oldum. Nokta (1) olarak, bir değişken olarak bir ifade olarak beklendiği yerlerde, geçerli kapsamdaki değişkenlerden sadece birini üretecek kurallar oluşturmak için nasıl çalışacağını görmeye çalışıyorum. Bütün bir resmi CSG görmem gerekmiyor, ancak sadece gayri resmi bir açıklama işe yarayacaktır. Bağlamın farklı bir kullanımı olan çoklu sembol değişken adları ile nasıl yapılacağını hayal edemiyorum, örneğin, ~ İngilizce cümle türetmesinde konu-fiil numarası anlaşmasını yönlendirmek için tek bir terminal dışı bağlam kullanmak.

Öte yandan, bir resmi dil kökenli (ve aynı zamanda ana dili İngilizce değil) ve tam olarak modellemek / temsil etmek istediğinizi anlamakta sorun yaşıyorum. Üzgünüm! Benim görüşüme göre, bu bağlamda, sadece bir oyuncak örneğidir, ancak aynı dizenin tam kopyalarına (değişken adı?) Sahip olmak istediğiniz şeyin bir parçasıdır.{ww|w...}
Hendrik Jan

{ww|w...}

3
Ah. Bu oldukça somut bir soru. için dilbilgisi vermeden birkaç şey söyleyebilirim. Gramerde iki "sınır sembolü" vardır . Türev sırasında dize gibi . , yapımları tarafından (teknik olarak CS'ye eşdeğer bir monoton dilbilgisi ) harfleri üzerinde "hareket edecek" bir kopyasıyla birlikte alfabeden a harfi oluşturur . "Haberci" ulaştığında harfinin kopyasını . Böylece daha uzun (multismbol) dizeler kopyalanabilir. {ww}LR,LwR,wLbirMbirwMbirbbMbirR,MbirR,R,bir
Hendrik Jan

13

Bağlama duyarlı bir dilin (CSL) en sevdiğim örneği SAT . Landwebwer'in-Kuroda teoremi söylüyor CSL = N-Space . Herhangi bir SAT örneğinin doğrusal boyutlu bir sertifikası vardır, bu nedenle SAT bir CSL'dir. Soruma bakın SAT için bağlama duyarlı dilbilgisi? referanslar ve tartışma için.[n]

NP-hard gibi diğer birçok dil de CLIQUE gibi CSL'de bulunmaktadır.

CSL'de daha da zor olan oldukça doğal diller de var.

Bununla birlikte, makalesinin Teorem 3'ünde Landweber'ın yapısını kullanmaktan başka, keyfi bir CSL'yi içeriğe duyarlı bir dilbilgisi (CSG) olarak ifade etmenin hiçbir yolunun farkında değilim. Bu yapıda, CSG, CSL'yi tanıyan doğrusal sınırlı otomatın çalışmasının tersini açıklar. CSG'nin üretimleri, makinenin belirli bir durumunun olası bir hareketten nasıl sonuçlandığını açıklar. Böyle bir CSG, otomatiğin bir dilbilgisine basitçe tercüme edilmesidir, bu yüzden değişkenleri bildirmek gibi dil özelliklerine karşılık gelmeyebilir, bunun yerine otomatın detayları tarafından bataklığa uğramış olacaktır.

Bir CSL yerine bir CSG konusunda ısrar ediyorsanız ve asıl sorunuz özellikle kısıtlı değişken kapsam belirleme içeren bir dil için bir CSG görmek istemekse, Hendrik Jan'ın cevabı iyi bir başlangıç ​​gibi görünüyor.


9

Evet, bağlama duyarlı gramerler (CSG) tanımlanmamış / bildirilmemiş / sınırsız değişkenleri kontrol edecek kadar güçlüdür, ancak maalesef CSG dizelerini ayrıştırmak için etkili bir algoritma bilmiyoruz.

Bağlama duyarlı dilin gerçek bir örneği C programlama dilidir. Önce değişkenleri bildirmek ve daha sonra bunları kullanmak gibi bir özellik, C dilini bağlama duyarlı bir dil (CSL) yapar. ( Tipik olmayan lambda hesabı hakkında bilmiyorum ).

CSL (veya CSG) için doğrusal ayrıştırma algoritması bilmediğimiz için. Derleyici tasarımının nedeni, sözdizimi denetimi için CFG'yi (ve yalnızca ayrıştırma algoritmasını) kullanıyoruz çünkü CFG'yi ayrıştırmak için etkin algoritmalar biliyoruz (kısıtlı formda ise). Derleyiciler önce bağlamsız bir özelliği ayrıştırır ve daha sonra bağlama duyarlı özellikleri sorunlu bir şekilde işler (örneğin, tanımlanmışsa sembol tablosunda kullanılan herhangi bir değişkeni denetler. Aksi takdirde bir hata oluşturur).

Ayrıca içeriğe duyarlı dilbilgisi doğal dil işlemede (NLP) kullanılır. Ve çoğu doğal dil bağlama duyarlı dillerin örnekleridir. ( Sanskrit dilinden emin değilim ).

Aptalca ama basit bir örnekle açıklamaya çalışacağım (sadece bir fikir, rafine edebilirsiniz):

NOUN     -->  { BlueBomber, Grijesh, I, We}
TENSE    -->  { am, was, is, were}
VERB     -->  { going, eating, working}

SENTENCE --> <NOUN> <TENSE> <VERB>

Şimdi, bu dilbilgisini kullanarak bazı doğru ifadeler üretebiliriz, ancak bazıları da yanlıştır. Örneğin,

SENTENCE --> <NOUN>   <TENSE>   <VERB>
             Grijesh    is       working       [Correct statement]

Fakat

             Grijesh    am       working       [wrong statement]

Sebep: <TENSE> değeri <NOUN> değerine (örneğin, I &lt;TENNSE> --> I am) bağlıdır ve bu nedenle dilbilgisi İngilizce dilinde doğru ifadeler üretmez.

Aslında tam İngilizce için bağlamsız bir gramer yazamıyoruz!

Fark etmiş olabilirsiniz, herhangi bir doğal dil çevirmeni veya dilbilgisi denetleyicisi düzgün çalışmıyor (uzun ifadelerle deneyin). Çünkü bu sorun bağlama duyarlı ayrıştırma algoritması altındadır.


REFERANS : Dr. Arun Kumar'ın derslerini izleyebilirsiniz . Bazı derslerde tam olarak neyle ilgilendiğinizi açıklar.


Bilgi için teşekkür ederim, şüphesiz bu aynı konuyla ilgilenen diğerleri için yararlı olacaktır, ancak sadece kısmen istediğim şeyle ilgili. Kendimi bir CSG tarafından oluşturulan bir dizeyi ayrıştırmayla ilgili değilim, ancak iyi biçimlendirilmiş soyutlamalar (işlev gövdesi içinde bağlı olmayan değişkenler) üreten resmi bir CSG'nin basit - hatta aptalca bir örneğini görmek için. Bir CSG'nin doğru "İngilizce" dizeleri oluşturmasını hayal edebilirim, çünkü tek bir sembol özne / fiil anlaşmasını yönlendirebilir, ancak soyutlamalarla değişkenler genellikle birden çok sembolden oluşur.

1
@BlueBomber: teşekkürler kesinlikle size cevap vereceğim, Hindistan'daki gece ... N Yeni Yılınız Kutlu Olsun! :)
Grijesh Chauhan

Görünüşe göre bunu sadece sınırlı sayıda yapabilirim ve (buna) göre [ meta.scicomp.stackexchange.com/questions/156/… , bu soruyu silmeli ve daha uygun bir yerde yeniden göndermeliyim ...

@MaviBomber Kaydırmak için işaretledim, ayrıca yapabilirsiniz.
Grijesh Chauhan

1

(yorumları cevaba genişletme)

Bunun istediğiniz bir örnek olduğundan emin değilim.

Hemen hemen tüm gerçek programlama dilleri bağlama duyarlı (genel anlamda vardır, yani conflating hem Chomsky tip-0 ve tip-I gramerlerin beri tabii doğrudur "bağlam-duyarlı" altında sınırsız dilbilgisi vardır hatta daha içeriğe duyarlı daha bağlamında duyarlı dilbilgisi).

Örneğin, "değişkenlerin kullanılmadan önce bildirilmesi gerekir", "tanımlayıcılar benzersiz olmalıdır", tüm bunlar bağlam gerektirir (bazen anlambilimsel bağlam olarak da adlandırılır, ancak yine de sözdizimsel özellikleri içerdiği için yanıltıcı olabilir) bkz. Https: // www .cs.purdue.edu / evler / Hosking / 502 / notlar / 04-semantics.pdf

Yukarıdaki örneklerin içeriğe duyarlı olmaları (dilbilgisi / sözdizimsel anlamda ve anlamsal olanı) bağlamları hakkında konuşmalarıdır (bundan önce veya sonra gelen).

Bir "değişken zaten tanımlanmış", önceki bağlam ile ilgilidir , değişken bir kullanımdır. "Benzersiz tanımlayıcı", hem tanımlayıcı bildiriminden önce gelen hem de sonra gelen içerikle ilgilidir .

ayrıca bkz. JavaScript Bağlamdan Bağımsız Bir Dil mi? bu yüzden


"Bağlama duyarlı", tip-1 anlamına gelir.
reinierpost
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.