Risposte:
V'è (almeno) un modo per dimostrare univocità di una grammatica per il linguaggio L . Si compone di due passaggi:
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 dire
con il numero di alberi di sintassi G ha per parole di lunghezza n . Ovviamente devi avere | L n | perché questo funzioni.
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:
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.
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.
Considera la semplice grammatica con regole
.
È chiaro che (passaggio 1, prova per induzione). Ci sono 2 n palindromi di lunghezzansenè pari,0altrimenti.
Impostare i rendimenti del sistema di equazioni
di chi è la soluzione
.
I coefficienti di coincidono con il numero di palindromi, quindi G non è ambiguo.
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.
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:
Tutte le parole di lunghezza in L ( G ) - c'è solo ε - hanno solo una derivazione sinistra.
Questo diventa più difficile se
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.
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)