Qualcuno può dare un esempio semplice ma non giocattolo di una grammatica sensibile al contesto?


12

Sto cercando di capire le grammatiche sensibili al contesto.

Capisco perché le lingue piacciono

  1. {wwwA}
  2. {anbncnnN}

non sono liberi dal contesto, ma cosa vorrei sapere se una lingua simile al calcolo lambda non tipizzato è sensibile al contesto.

Mi piacerebbe vedere un esempio di un semplice, ma non giocattolo (considero gli esempi di giocattoli di cui sopra), un esempio di una grammatica sensibile al contesto che, per alcune regole di produzione, ad esempio, può dire se una serie di simboli è attualmente nell'ambito (ad esempio quando si produce il corpo di una funzione).

Le grammatiche sensibili al contesto sono abbastanza potenti da rendere le variabili indefinite / non dichiarate / non legate un errore sintattico (piuttosto che semantico)?


1
quasi tutti i linguaggi di programmazione reali sono sensibili al contesto (in senso generale, cioè fondendo entrambe le grammatiche di tipo 0 e di tipo I in "sensibile al contesto"). Ad esempio, le variabili devono essere dichiarate prima dell'uso
Nikos M .

Bene, "sensibile al contesto" è il termine standard per le grammatiche di tipo 1.
reinierpost,

Risposte:


8

Sì, ritengo che ciò sia possibile, ma no non sono disposto a costruire esplicitamente quella grammatica sensibile al contesto. Spiegherò la mia risposta, dividendo la domanda in due parti diverse.

(1) Quale sarebbe l'esempio del non giocattolo? Dovrebbe riflettere la dichiarazione delle variabili. La mia proposta di un tale linguaggio, sottratto alla vera programmazione, sarebbe qualcosa del genere. L'alfabeto è . Quella lingua è sensibile al contesto.{a,b,;,(,)}

{w1;w2;;wn(x1;x2;;xm)wi,xj{a,b}, each xj is equal to some wi}

(2) Per dimostrare che in realtà è sensibile al contesto, vorrei usare un altro formalismo. Quella di una macchina Turing con uso lineare del suo nastro: un automa lineare limitato LBA. Posso programmarlo per fare la corrispondenza del modello / Considererei consecutivamente ogni e proverei ad abbinarlo con un appropriato , lettera per lettera. Gli LBA sono equivalenti a grammatiche sensibili al contesto, ma molto più facili da programmare.xjwj


Grazie per il post. Finora ho meno familiarità con gli LBA, quindi sono meno convinto del punto (2). A partire dal punto (1), sto cercando di vedere come costruire regole che produrranno, dove un nome di variabile è previsto come espressione, solo una delle variabili nell'ambito corrente. Non ho bisogno di vedere un CSG completo e formale, ma solo una spiegazione informale funzionerebbe. Non riesco a immaginare come farlo con nomi di variabili multi-simbolo, che è un uso diverso del contesto rispetto, ad esempio, all'uso di un singolo contesto non terminale per dirigere l'accordo numerico soggetto-verbo in una derivazione della frase inglese.

D'altra parte, sono di un background linguistico formale (e anche non madrelingua inglese) e ho difficoltà a capire cosa vuoi esattamente modellare / rappresentare. Scusate! Nella mia visione, in questo contesto, è solo un esempio di giocattolo, ma una parte di ciò che vuoi ottenere, avendo copie complete della stessa stringa (nome variabile?){www}
Hendrik Jan

Grazie per la risposta!. è un esempio di giocattolo e capisco perché non è privo di contesto, ma non riesco ancora a "vedere" in modo intuitivo come sia sensibile al contesto o in che modo un CSG lo genererebbe. Vorrei provare a chiarire ciò che non capisco (c'è almeno una domanda di follow-up, ma per ora è sufficiente): come potrebbe un CSG usare un contesto contenente parole multi-simbolo per generare di nuovo una di quelle parole in un certo produzione? Da quello che ho visto, i CSG generalmente funzionano scambiando personaggi durante la produzione e usando singoli simboli per dirigere una produzione, ma non parole con più simboli.
{ww|w...}

3
Oh. Questa è una domanda piuttosto concreta. Senza dare la grammatica per posso dire alcune cose. La grammatica ha due "simboli di confine", dice . Durante la derivazione la stringa sembra . genera una lettera dall'alfabeto insieme a una copia che "si sposterà" sulle lettere in dalle produzioni (tecnicamente si tratta di una grammatica monotona , equivalente a CS). Quando il "messaggero" raggiunge , scrive la sua copia della lettera . È quindi possibile copiare stringhe più lunghe (multisimbolo). L R L w R w L a M a w M a b b M a R M a R R a{ww}LRLwRwLaMawMabbMaRMaRRa
Hendrik Jan

13

Il mio esempio preferito di un linguaggio sensibile al contesto (CSL) è SAT . Il teorema di Landweber-Kuroda afferma che CSL = NSPACE . Qualsiasi istanza SAT ha un certificato di dimensioni lineari, quindi SAT è un CSL. Vedi la mia domanda Grammatica sensibile al contesto per SAT? per riferimenti e discussioni.[n]

Molti altri linguaggi NP-hard sono anche in CSL per lo stesso motivo, come CLIQUE.

Ci sono anche linguaggi abbastanza naturali in CSL che sono ancora più difficili.

Tuttavia, non sono a conoscenza di alcun modo per esprimere un CSL arbitrario come grammatica sensibile al contesto (CSG), se non quello di usare la costruzione di Landweber nel Teorema 3 del suo documento. In questa costruzione, il CSG descrive il contrario del funzionamento dell'automa a limite lineare che riconosce il CSL. Le produzioni del CSG descrivono come un particolare stato della macchina risulta da una possibile mossa. Tale CSG è una traduzione diretta dell'automa in una grammatica, quindi non corrisponderà necessariamente a caratteristiche del linguaggio come la possibilità di dichiarare variabili, ma sarà invece impantanato dai dettagli dell'automa.

Se insisti su un CSG piuttosto che su un CSL, e se la tua vera domanda è specificamente quella di voler vedere un CSG per un linguaggio che coinvolge l'ambito variabile, allora la risposta di Hendrik Jan sembra essere un buon inizio.


9

Sì, le grammatiche sensibili al contesto (CSG) sono abbastanza potenti da controllare le variabili indefinite / non dichiarate / non legate, ma sfortunatamente non conosciamo alcun algoritmo efficiente per analizzare le stringhe di CSG.

Un vero esempio di un linguaggio sensibile al contesto è il linguaggio di programmazione C. Una caratteristica come dichiarare prima le variabili e poi usarle in seguito rende il linguaggio C un linguaggio sensibile al contesto (CSL). ( Non conosco il calcolo lambda non tipizzato ).

E poiché non conosciamo alcun algoritmo di analisi lineare per CSL (o CSG). Questo è il motivo nella progettazione del compilatore, utilizziamo CFG (e solo il suo algoritmo di analisi) per il controllo della sintassi poiché conosciamo algoritmi efficienti per analizzare CFG (se è in forma limitata). I compilatori prima analizzano una funzione libera dal contesto e successivamente gestiscono in modo problematico le funzioni sensibili al contesto (ad esempio, controlla qualsiasi variabile usata nella tabella dei simboli se è definita. Altrimenti, genera un errore).

Anche la grammatica sensibile al contesto viene utilizzata nell'elaborazione del linguaggio naturale (PNL). E la maggior parte dei linguaggi naturali sono esempi di linguaggi sensibili al contesto. (Non sono sicuro per la lingua sanscrita ).

Proverò a spiegarlo con un esempio sciocco ma semplice (è solo un'idea, puoi perfezionarlo):

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

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

Ora, usando questa grammatica, possiamo generare alcune affermazioni corrette, ma anche alcune sono sbagliate. Per esempio,

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

Ma

             Grijesh    am       working       [wrong statement]

Motivo: il valore di <TENSE> dipende dal valore <NOUN> (ad esempio, I &lt;TENNSE> --> I am) e quindi la grammatica non genera istruzioni corrette in lingua inglese.

In realtà non possiamo scrivere una grammatica senza contesto per un inglese completo!

Potresti aver notato che qualsiasi traduttore di lingua naturale o correttore grammaticale non funziona correttamente (prova con dichiarazioni lunghe). Perché questo problema rientra nell'algoritmo di analisi sensibile al contesto.


RIFERIMENTO : Puoi guardare le lezioni del Dr. Arun Kumar . In alcune lezioni spiega esattamente ciò che ti interessa.


Grazie per l'informazione, sarà sicuramente utile per gli altri interessati a questo stesso argomento, ma è solo parzialmente correlato a quello che avrei chiesto. Non mi sto occupando dell'analisi di una stringa generata da un CSG, ma di vedere un semplice - anche sciocco - esempio di un CSG formale che genera astrazioni ben formate (nessuna variabile non associata all'interno del corpo della funzione). Posso immaginare un CSG per generare stringhe "inglesi" corrette, poiché un singolo simbolo può dirigere l'accordo soggetto / verbo, ma con le astrazioni, le variabili sono in genere composte da più simboli.

1
@BlueBomber: grazie di sicuro ti risponderò, è notte in India..N Buon anno! :)
Grijesh Chauhan il

Sembra che posso farlo solo un numero limitato di volte, e secondo (questo) [ meta.scicomp.stackexchange.com/questions/156/… , dovrei eliminare questa domanda e ripubblicarla nel posto più appropriato ...

@BlueBomber Ho segnalato per spostare, puoi anche fare.
Grijesh Chauhan

1

(estensione dei commenti in risposta)

Non sono sicuro che questo sia un esempio che vorresti, comunque.

Quasi tutti i linguaggi di programmazione reali sono sensibili al contesto (in senso generale, cioè che fondono entrambe le grammatiche di tipo 0 e di tipo I di Chomsky in "sensibili al contesto", il che è vero naturalmente poiché le grammatiche senza restrizioni sono persino più sensibili al contesto rispetto al contesto grammatiche sensibili ).

Ad esempio, "le variabili devono essere dichiarate prima dell'uso", "gli identificatori devono essere univoci", tutti richiedono un contesto (a volte indicato come contesto semantico, ma che può essere fuorviante, poiché comporta comunque caratteristiche sintattiche), vedi ad esempio https: // www .cs.purdue.edu / case / Hosking / 502 / note / 04-semantics.pdf

La sensazione che gli esempi di cui sopra siano sensibili al contesto (sia in senso grammaticale / sintattico che semantico) è perché parlano del loro contesto (ciò che precede o viene dopo).

Una "variabile già definita" riguarda il contesto precedente , un uso variabile. Un "identificatore univoco" è un contesto sia rispetto a ciò che è stato preceduto o dopo una dichiarazione di identificatore, e così via

vedi anche JavaScript è una lingua senza contesto? su SO


"Sensibile al contesto" significa tipo 1.
reinierpost,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.