Hangi hesaplama modelleri gramerlerle ifade edilebilir?


18

Bu, gramer programlarının yeniden düzenlenmesi midir? önceki Vag tarafından sordu ve yorumculardan birçok öneri ile.

Bir dilbilgisi bir hesaplama modelini ne şekilde tanımlayabilir? Örneğin, aşağıdaki gibi bağlam içermeyen basit bir dilbilgisi alırsak,

G ::= '1' -> '0' '+' '1'
      '1' -> '1' '+' '0'
      '2' -> '2' '+' '0'
      '2' -> '1' '+' '1'
      '2' -> '0' '+' '2'
      '3' -> '3' '+' '0'
      '3' -> '2' '+' '1'
      '3' -> '1' '+' '2'
      '3' -> '1' '+' '2'

Ayrıştırıcının burada gösterdiğim gibi terminal ve terminal olmayan semboller arasında ayrım yapmadığını varsayarsak, 3'e kadar sayılar için basit aritmetik yapmak mümkündür.

Örneğin, dizeyi

"2 + 0 + 1"

Bu dizede bir LR (1) ayrıştırıcısı çalıştırmak , hesaplamanın sonucunun ağacın kökünde depolandığı aşağıdaki somut sözdizimi ağacını vermelidir :

           '3'
         /  |  \
        /   |   \
      '2'  '+'  '1'
     / | \
    /  |  \
  '2' '+' '0' 

Biz olmak için bir dilbilgisi alırsak Böylece programı ve bir ayrıştırıcı jeneratör, bir olmaya derleyici , bir olarak dilbilgisi şartname dili görebiliyordu programlama dili ?

Ayrıca, selüllar otomatları veya lambda hesabı ile turlama tam programlarını nasıl oluşturabileceğinize benzer gramerler belirterek Turing tamamlanmış programlar oluşturabilir miyiz ?

Başka bir deyişle, anlamında olduğu bilinmektedir tanıyan bir dil, düzenli diller karşılık sonlu durumlu otomata , bağlam-bağımsız diller karşılık otomata aşağı itmek ve bağlama duyarlı diller karşılık sınırlı otomata doğrusal . Ancak, dilbilgisine hesaplama araçları (yani yukarıdaki örnek anlamındaki programlar ) olarak bakarsak , Chomsky hiyerarşisindeki her dilbilgisi sınıfının hesaplama gücünü nasıl sınıflandırırız ?

Ayrıca, daha az bilinen gramer alt sınıflarına ne dersiniz?

EDIT: Bu arada, bu benim kendi sorum bir nitpick ama örnek dilbilgisi için hiçbir başlangıç ​​sembolü vermedi bahsetmedim ve terminaller ve terminaller arasında ayrım yapmak ihtiyacında el salladı. Teknik veya geleneksel olarak, dilbilgisinin muhtemelen bu gibi daha karmaşık bir biçimde yazılması gerektiğini düşünüyorum (burada S başlangıç ​​sembolüdür ve $ , akış sonu terminalini temsil eder):

G ::= S -> R0 '$'
      S -> R1 '$'
      S -> R2 '$'
      R0 -> '0'
      R0 -> R0 '+' '0'
      R1 -> '1'
      R1 -> R0 '+' '1'
      R1 -> '1' '+' R0
      R1 -> R0 '+' '1' '+' R0
      R2 -> '2'
      R2 -> R0 '+' '2'
      R2 -> '2' '+' R0
      R2 -> R0 '+' '2' '+' R0
      R2 -> R1 '+' '1'
      R2 -> R1 '+' '1' '+' R0

... gerçekten hiçbir şeyi değiştirmediği için değil, ama bundan bahsetmem gerektiğini düşündüm.

DÜZENLEME: Gasche'ın cevabını okuduğumda akla gelen başka bir şey, örneğimdeki ağaçtaki her dalın bir alt hesaplamayı temsil etmesi. Her üretim kuralına LHS'nin sonucu temsil ettiği ve RHS'nin argümanlarını temsil ettiği bir işlev olarak bakarsanız, dilbilgisinin yapısı işlevlerin nasıl oluşturulduğunu belirler.

Başka bir deyişle, ayrıştırıcının gözetleme mekanizmasıyla birlikte bağlamı, sadece hangi işlevlerin uygulanacağını (parametrik polimorfizm gibi) değil, aynı zamanda yeni işlevler oluşturmak için nasıl bir araya getirilmeleri gerektiğini belirlemeye yardımcı olur.

En azından, açık bir CFG için bu şekilde bakabilirsiniz, diğer gramerler için zihinsel jimnastik şu anda benim için biraz fazla.


3
Böyle güzel ve umut verici bir cihaz olan Görünür Aşağı Açılan Otomattan (İç İçe Kelimeler) bahsetmeyi unuttun! Bu önemlidir çünkü popüler programlama dillerinde yazılan programları ayrıştırabilmek için normal ifadelere göre çok az gelişme olduğu görülmektedir. ( cis.upenn.edu/~alur/nw.html )
Vag

1
Teşekkürler, bu çok ilginç, bakmadım!
Belirleyici bağlamsız

1
@imz Gramerleri, chomsky hiyerarşisinde resmi olarak tanımlandıkları için kastediyorum (yani, prodüksiyon grupları olarak). Tam olarak ne dediğini iddia ettiğim için: bu gramerler programlardır, bu sadece gramerlerle temsil edilebilen program sınıfı anlamına gelir (soru budur).
Rehno Lindeque

1
@imz Dürüst olmak gerekirse, dizinlenmiş gramerlere gerçekten aşina değilim, onları sadece bir düşünce sonrası olarak ekledim.
Rehno Lindeque

1
Bu soruyu LtU forumuna göndermenin iyi bir fikir olabileceğini düşünmeye başlıyorum. Btw @imz, belki de soruyu "en iyi gramer sınıfları, Marc Hamman'ın cevabında Jukka tarafından tanımlanan 'fonksiyonel' anlamda hangi program sınıflarına karşılık gelir" olarak okumak en iyisidir. Belki de bunu daha açık hale
getirmeliyim

Yanıtlar:


10

Chomsky Type-0 gramerleri ile Turing makineleri arasında birebir yazışmalar var .

Bu, bir başlangıç ​​dizesi ve bir dizi yeniden yazma kuralı ( bir type-0 dilbilgisine eşdeğer bir yarı-Thue dilbilgisi) tarafından belirtilen Turing-complete programlarını yazmanıza izin veren Thue programlama dilinde patlar .

GÜNCELLEME:

Thue gibi ezoterik "Turing tar-pit" dilleri dışında, programlayıcının kendi sözdizimini genişletmesine izin veren çeşitli genel amaçlı diller, ayrıştırma-derleme aşamasında Turing-complete hesaplaması yapmak için kullanılabilir.

Lisp ailesindeki diller , özellikle Common Lisp , muhtemelen en açık örneklerdir, ancak aynı zamanda, genel olarak, şablonlarla C ++ , Scala ve Qi gibi her zaman durdurulması gerekmeyen statik tip kontrolüne sahip dillerdir .


Ancak soru, ters yönde çalışan şeyler hakkındadır: kurallara göre ilk sembol dizisini yeniden yazarak sonuca varılmalıdır, ancak bu sorudaki bir dilbilgisi tarafından tanımlanan hesaplamanın "sonucu" bir ilktir. dilbilgisi kurallarına göre "girdi" dizisini üretebilen sembol.
imz - Ivan Zakharyaschev

2
Ancak, doğru bir şekilde anlarsam, iki şey esasen eşdeğerdir: Yalnızca sabit bir başlangıç ​​sembolünden başlayarak dilbilgisi giriş dizisini üretebilirse, o zaman ilgili Turing makinesi bu diziyi kabul ederse. Kabul / reddetme dışında bir sonucu döndüren ancak yine de sonlu kümede olan hesaplamaları göz önünde bulundurmak istiyorsanız, ilk sembolün belirsiz olmayan bir choicheini eklemeniz gerekir (aslında, bu sadece ek bir kuraldır). Sonsuz bir kümedeki sonuçlara izin vermek için, dizesini oluşturan bir dilbilgisi tanımlayabilirsiniz.cÖncbirt(quÖte(benn),Öut)TM(benn)=Öut

Tip0 dilbilgisi ve TM'ler arasındaki yazışmaların soruya geçerli bir cevap olduğunu kabul ediyorum (özellikle evet / hayır işlevlerini hesaplama ile kısıtlıysa). Giriş-çıkış çiftlerini nasıl temsil
edeceğimize

Bunu tam olarak mevcut dilbilgisi çerçevelerini ve hesaplamaları gerçekleştirmek için karşılık gelen ayrıştırıcıları sömürmek için bir soru olarak anlıyorum, yani, bir işlev f ile bir dilbilgisi arasındaki çevirinin izin verilen şekli sadece olabilir: S olarak f olarak ayrıştırılan bir girdi ( I) 'S =.
imz - Ivan Zakharyaschev

1
Yüzeysel olarak, Thue programlama dili bir gramer çerçevesi kullanmak gibi görünmüyor: gramer gibi yeniden yazma kuralları olmasına rağmen, bir girdiden bir sonucun hesaplanması, ters yönde değil, kuralların yönüne gider Rehno'nun istediği gibi. (Ama belki de bu sadece yapımlardaki okların yönünü değiştirme meselesidir: bu Q anlamında bir “ayrıştırıcı olarak hesaplama” dilbilgisini Thue'ye çevirmek sadece kuralların yönünü, ardından Thue programını değiştirmek olabilir gerçekten sonuç olarak başlangıç ​​sembollerine ulaşacak, değil mi? ..)
imz - Ivan Zakharyaschev

6

Cevabım biçimsel, kesin ve kesinlikle konuyla ilgili değil. Sanırım Marc Hamman'ın cevabı çok sağlam, ancak sorunuz bana ilgili bir konuyu düşündürdü.

Dilbilgileri, tümdengelim sistemlerine ilişkin özel durumlar olarak düşünülebilir: girdi bir yargıdır ve ayrıştırma ağacı, kararın bir türetilmesidir veya kararın (dilbilgisel) kurallara göre geçerli olduğunun kanıtıdır .

Bu anlamda, sorunuz mantık programlama / kanıt arama topluluğunun bir kısmının yaklaşımı ile ilgili olabilir ( örneğin Dale Miller'ı düşünüyorum ), yani kanıt araması daha klasik olanın aksine hesaplama içeriğine sahiptir. tür / kanıt teorisi, hesaplamanın kanıt normalleştirmesi olduğu bakış açısı .

Açıklama: Cevabımı tekrar okuduğumda, "ayrıştırılmış ağaç yapısının kanıt arama olduğu" fikrinin burada biraz ileri sürülmüş olduğunu düşünüyorum. İspat araştırması oldukça diğer yöne doğru akar: bir kişi, oldukça karmaşık bir yargıdan başlar ve ispatın yapısı üzerinde çalışan çıkarım kurallarının tekrar tekrar kullanılmasıyla, daha fazla kanıtlanması gerekmeyen daha basit aksiyomlara ulaşılması umulur. Bu nedenle, gramer terimleriyle, terminal olmayan terminaller, terminaller gibi atomlar ve kelime arama problemi olarak kanıt arama ya da boşluk testi olarak görmek daha doğal olurdu.


Yine de çok ilginç yorumlar. Beynim şu anda iyi bir yanıt vermek için biraz fazla yorgun, ancak
örneğimde

6

Ayrıca, dilbilgisi belirterek Turing-complete programları oluşturabilir miyiz?

Sorunuzu doğru bir şekilde anladığımdan emin değilim, ancak bir tür dize yeniden yazma sistemine dayanan bir programlama dili arıyorsanız, muhtemelen Markal algoritması formalizmine dayanan bir Refal'a girersiniz (bir Turing- aynı zamanda dilbilgisi benzeri bir dize yeniden yazma sistemi olan tam biçimcilik).


1
Soruyu şu şekilde anladım: Rehno, sonucun bir hesaplaması olarak görülmesi için bootom-up ayrıştırma işlemiyle (gramer tarafından tanımlanmış) ilgileniyor. Hesaplama sonucu dilbilgisinin üretim kurallarına aykırı yönde giden parçalardan oluşturulmalıdır. Refal'ın yeniden yazma kuralları (IIUC, yukarıda belirtilen Thue programlama diline benzer şekilde) diğer yöne doğru gider (girdiden sonuca).
imz - Ivan Zakharyaschev

Şimdi düşünüyorum da, bağlama duyarlı gramerlerin LHS üretim kuralları üzerinde birden fazla sembolü var. Bu yüzden gerçek bir pratik fark olmadığını düşünüyorum. Bağlama duyarlı bir dilin ayrıştırıcısı, ona nasıl bakarsanız bakın dize yeniden yazma sistemi olabilir mi?
Rehno Lindeque

@imz Rehno'nun sorusu hakkındaki açıklama için teşekkür ederim. @Rehno “Bağlama duyarlı bir dilin ayrıştırıcısı, ona nasıl bakarsanız bakın dize yeniden yazma sistemi olurdu?” - muhtemelen mantıklı, evet.
Artem Pelenitsyn

Ancak Refal'ın yeniden yazma kuralları belirleyici olmayan bir şekilde ele alınıyor mu? (Ya da farklı bir şekilde ifade edin: Refal çalışan bir yeniden yazma yolu arayışında geri izleme yapacak mı?) Bu "hesaplama olarak ayrıştırma" yaklaşımını tersine çevirme kurallarıyla yeniden yazma kuralları ile modellemek istiyorsak, deterministik olmayan kurallara ihtiyacımız var; dilbilgisi gibi düşünün S -> A a; S -> B b; A -> 0; B -> 0. Bunu kuralları tersine çevirerek programlarsak, 0"0a" veya "0b" değerini değerlendirmek için çalışma zamanında işlemek için farklı kurallar seçmemiz gerekir S.
imz - Ivan Zakharyaschev

6

(Sadece bazı önemsiz düşünceler. Yorum olabilir, ancak çok uzun.)

Aslında, tanımladığınız şey, bir dilin ne olduğuna (insanın "dil" anlamında) ve bir dilbilgisinin bir dili nasıl tanımladığına dair çok doğal bir görüş olarak görünür .

Bir dil, anlamsal değerler vermek üzere yorumlanan (sonsuz sayıda) doğru sözdizimsel formdan oluşur .

Yorum hesaplanabilirse, bir dilin sözdizimsel biçimleri semantik değerleri hesaplayan programlar olarak görülebilir.

Bir dilin sonlu bir araç olarak uygulandığını varsayarsak, bir dilin bu sonlu temsilini "dilbilgisi" olarak adlandırabiliriz. Bu anlayışa göre, bir dilbilgisi sözdizimini değil, aynı zamanda anlambilimi de, yani bütün ifadenin anlamsal değerini parçalarının değerlerinden nasıl hesaplayacağına (atomik kısımlar ve değerleri bir "sözlükte" kaydedilir) .

Bazı doğal dil teorileri böyle bir forma sahiptir (yukarıdaki hususlarla tutarlı olan form; buradaki @ gasche cevabında zaten belirtilmiştir): girdinin türetilmesini araştıran tümdengelimsel bir sistem (semantik hesaplaması ile birleştiğinde) değeri veya ispat teriminin oluşturulması; bkz. Curry-Horward yazışmaları). Dolayısıyla, bu tür sistemlere bakar ve gramerleri düşünürsek , sorunuz önemsizdir : bu sistemler tam olarak tarif ettiğiniz şekilde hesaplamalar yapmak için tasarlanmıştır.

fG,ben f(ben)=SbenSG,

(Aslında, programlama dillerinin gerçek derleyicileri daha çok hem sözdizimi hem de anlambilime sahip bir sisteme benziyorlar: bir programın sözdizimsel biçimini, programın anlamsal anlamı olan bir yürütülebilir dosyaya dönüştürüyorlar, sadece bir başlangıç ​​sembolüne değil dilbilgisi.)


4

Sadece eklemek için:

Saf bir mantık programında deklaratif okuma ve prosedürel okuma vardır. Bu rapor, cümlelerin bir gramer kurallarını yeniden yazma kuralları olarak kabul edildiği bir gramer okuması ile tamamlanabileceği fikrini tartışmaktadır. Amaç, bu bakış açısının, uzmanlığın mantık programlamasından programlama dilleri ile ilgili diğer araştırmalara aktarılmasını kolaylaştırdığını göstermektir. Bu tür bir aktarımın bazı örnekleri tartışılmaktadır. Öte yandan sunulan dilbilgisel görüş, saf mantık programlamaya yönelik bazı geçici uzantıları haklı çıkarır ve bu uzantılar için teorik temellerin geliştirilmesini kolaylaştırır.

Pierre Deransart ve Jan Maluszynski'nin Mantık Programlamasına Gramer Bakış.


Görünüşe göre, Prolog öznitelik gramerlerinden ortaya çıktı, bu yüzden mantık programlamaya başlayan bu görüş.
reinierpost

1

Peano sayıları gibi bir şeye ne dersiniz:

S    -> int
int  -> zero
int  -> succ
zero -> "0"
succ -> "#" int

bu formun herhangi bir dizesini (sayısını) tanıyacaktır:

0   // zero
#0  // one
##0 // two

ve derinliği sayı olmak üzere iç içe bir yapı döndürmelidir.

Ama bir kişi sadece ekleme demek istediğinde karmaşıklaşmaya başlar:

S    -> int
int  -> sum
int  -> zero
int  -> succ
zero -> "0"
succ -> "#" int
sum  -> int "+" int

Sadece böyle iyi biçimlendirilmiş ints'ı tanıyacağı için mükemmel bir anlam ifade eder:

#####0 + ####0

Ancak bu dilbilgisi, bir miktar olduğunda ayrıştırma ağacında bir bölünme sağlar, bu nedenle, doğrudan bir sayıya eşlenen güzel bir dallı ağaca sahip olmak yerine, ifadenin yapısına sahibiz, yine de birkaç hesaplamadan uzak değer. Yani hiçbir hesaplama yapılmaz, sadece tanıma yapılır. Sorun dilbilgisi değil ayrıştırıcı olabilir. Bunun yerine kişi başka bir şey kullanabilir, idk ... Akla gelen bir başka nokta da dilbilgisi biçimciliğinin hesaplamayı ifade etme yeterliliğidir. Bir Peano aksiyomuna baktığınızda (Haskell benzeri notasyonda):

1) Nat = Zero
2) Nat = Succ Nat
3) Sum ( Succ X ) ( Y ) = Succ ( X + Y )
4) Sum Zero X = X

Üçüncü kural açıkça bir dönüşümü belirtir. Herkes bağlamsız bir dilbilgisi kuralında aynı miktarda anlam taşıyabildiğini düşünebilir mi? Ve eğer öyleyse, nasıl!?

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.