Come dimostrare che una grammatica non è ambigua?


25

Il mio problema è come posso dimostrare che una grammatica è inequivocabile? Ho la seguente grammatica:

Sstatementif expression then Sif expression then S else S

e trasformarlo in una grammatica non ambigua, penso che sia corretto:

  • SS1S2

  • S1if expression then Sif expression then S2 else S1

  • S2if expression then S2 else S2statement

So che una grammatica inequivocabile ha un albero di analisi per ogni termine.

Risposte:


20

V'è (almeno) un modo per dimostrare univocità di una grammatica per il linguaggio L . Si compone di due passaggi:G=(N,T,δ,S)L

  1. Prova .LL(G)
  2. Prova .[zn]SG(z)=|Ln|

Il primo passo è abbastanza chiaro: mostra che la grammatica genera (almeno) le parole che vuoi, questa è correttezza.

Il secondo passo mostra che ha tanti alberi di sintassi per parole di lunghezza n quante L ha parole di lunghezza n - con 1. questo implica univoco. Usa la funzione di struttura di G che risale a Chomsky e Schützenberger [1], vale a direGnLnG

SG(z)=n=0tnzn

con il numero di alberi di sintassi G ha per parole di lunghezza n . Ovviamente devi avere | L n | perché questo funzioni.tn=[zn]SG(z)Gn|Ln|

La cosa bella è che è (di solito) facile da ottenere per linguaggi senza contesto, sebbene trovare una forma chiusa per t n possa essere difficile. Trasforma G in un sistema di equazioni di funzioni con una variabile per nonterminale:SGtnG

[A(z)=(A,a0ak)δ i=0k τ(ai) :AN] with τ(a)={a(z),aNz,aT.

Questo può sembrare scoraggiante, ma in realtà è solo una trasformazione sintattica, come sarà chiaro nell'esempio. L'idea è che simboli terminali generati vengono conteggiati nel esponente e perché il sistema ha la stessa forma G , z n si verifica più spesso nella somma come n terminali possono essere generati da G . Controlla Kuich [2] per i dettagli.zGznnG

Risolvere questo sistema di equazioni (algebra del computer!) Produce ; ora devi "solo" tirare il coefficiente (in forma chiusa, generale). Il TCS Cheat Sheet e l'algebra del computer possono farlo spesso.S(z)=SG(z)


Esempio

Considera la semplice grammatica con regoleG

.SaSabSbε

È chiaro che (passaggio 1, prova per induzione). Ci sono 2 nL(G)={wwRw{a,b}} palindromi di lunghezzansenè pari,0altrimenti.2n2nn0

Impostare i rendimenti del sistema di equazioni

S(z)=2z2S(z)+1

di chi è la soluzione

.SG(z)=112z2

I coefficienti di coincidono con il numero di palindromi, quindi G non è ambiguo.SG G


  1. La teoria algebrica delle lingue senza contesto di Chomsky, Schützenberger (1963)
  2. Sull'entropia delle lingue senza contesto di Kuich (1970)

3
Come sai @Raphael, l'ambiguità non è decidibile, quindi almeno uno dei tuoi passi non può essere meccanizzato. Qualche idea su quali? Ottenere una forma chiusa per ? tn
Martin Berger,

2
Il sistema di equazioni potrebbe non essere risolvibile da un punto di vista algoritmico se il grado è troppo alto e tirare i coefficienti esatti dalle funzioni di generazione può essere (troppo) difficile. Nella "pratica", tuttavia, ci si occupa spesso di grammatiche di piccolo "grado" - si noti che, diciamo, la forma normale di Chomsky porta a sistemi di equazione di piccolo grado - e ci sono metodi per ottenere almeno -sintotici per i coefficienti ; questo può essere sufficiente per stabilire l'ambiguità. Si noti che per dimostrare l'ambiguità, è sufficiente mostrare S L ( z ) = S G ( z ) senza coefficienti di trazione; dimostrare questa identità può essere difficile, però. SL(z)=SG(z)
Raffaello

Grazie @Raphael. Conoscete dei testi che sviluppano in dettaglio in che modo entra in gioco l'indecidibilità anche se si utilizza, ad esempio, la forma normale di Chomsky? (Non riesco a trovare Kuich.)
Martin Berger,

@MartinBerger Ho appena riscoperto il tuo commento nella mia lista delle cose da fare; scusa per il lungo silenzio. Ci sono tre passi che (credo) non sono calcolabili in generale: 1) Determinare . 2) Calcolo | L n | . 3) Determina [ z n ] S g ( z ) . In particolare, quale rappresentazione di L usare per 2)? SG|Ln|[zn]Sg(z)L
Raffaello

Perché la rappresentazione di un problema? Ad esempio, possiamo usare uno dei molteplici modi di rappresentare i CFG per i compilatori. Forse intendi come rappresentare L n ? LLn
Martin Berger,

6

Questa è una buona domanda, ma alcuni googling ti avrebbero detto che non esiste un metodo generale per decidere l'ambiguità , quindi devi rendere la tua domanda più specifica.


2
L'OP richiede tecniche di prova, non algoritmi.
Raffaello

Lo penso anch'io; potrebbe essere menzionato nella domanda.
reinierpost,

1
Google non è un oracolo della verità, perché la conoscenza non è democratica, e lo sono i risultati di Google. Non contare su Google in questo caso, perché le persone spesso copiano l'una dall'altra senza verificare la correttezza di ciò che copiano. Senza mostrare una prova, potrebbero essere sbagliati.
SasQ,

5
@SasQ: hai letto le mie parole troppo alla lettera. Ciò che Google mi dà sono gli URL degli elementi che spiegano le cose.
reinierpost,

4

Per alcune grammatiche, è possibile una prova per induzione (oltre la lunghezza della parola).


Considera ad esempio una grammatica su Σ = { a , b } data dalle seguenti regole:GΣ={a,b}

SaSabSbε

Tutte le parole di lunghezza in L ( G ) - c'è solo ε - hanno solo una derivazione sinistra.1L(G)ε

nnN

w=w1wwnL(G)Σnn>0w1Σw1=aSaSaw1=bSbSbww


Questo diventa più difficile se

  • ci sono più non terminali,
  • la grammatica non è lineare e / o
  • la grammatica è ricorsiva a sinistra.

Può aiutare a rafforzare la rivendicazione di tutte le forme sentenziali (se la grammatica non ha non terminali non produttivi) e non terminali "root".

Penso che la conversione alla forma normale di Greibach mantenga (una) ambiguità, applicare prima questo passaggio potrebbe occuparsi bene della ricorsione di sinistra.

La chiave è identificare una caratteristica di ogni parola che corregge (almeno) un passaggio di derivazione. Il resto segue induttivamente.


3

Fondamentalmente, è un problema di generazione di bambini. Inizia con la prima espressione e genera i suoi figli .... Continua a farlo in modo ricorsivo (DFS) e dopo alcune iterazioni, vedi se riesci a generare la stessa espressione espansa da due figli diversi. Se sei in grado di farlo, è ambiguo. Tuttavia, non è possibile determinare il tempo di esecuzione di questo algoritmo. Supponiamo che sia sicuro, dopo aver generato forse 30 livelli di bambini :) (Certo che potrebbe bombardare il 31)


1
L'OP richiede tecniche di prova, non algoritmi.
Raffaello

2
quello non può essere un modo per dimostrare se una grammatica è ambigua o no. È un dato di fatto quando si verificano quegli attentati è indecidibile.
Sнаđошƒаӽ,
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.