Antworten:
Es gibt (mindestens) einen Weg, die Eindeutigkeit einer Grammatik für die Sprache zu beweisen . Es besteht aus zwei Schritten:
Der erste Schritt ist ziemlich klar: Zeigen Sie, dass die Grammatik (zumindest) die gewünschten Wörter generiert, das heißt, Richtigkeit.
Der zweite Schritt zeigt, dass so viele Syntaxbäume für Wörter der Länge wie Wörter der Länge - mit 1. Dies impliziert Eindeutigkeit. Es verwendet die Strukturfunktion von die auf Chomsky und Schützenberger [1] zurückgeht, nämlichn L n G
mit die Anzahl der Syntaxbäume für Wörter der Länge . Natürlich müssen Siedamit dies funktioniert.G n | L n |
Das Schöne ist, dass für kontextfreie Sprachen (normalerweise) leicht zu bekommen ist, obwohl es schwierig sein kann , eine geschlossene Form für finden. Transformiere in ein Gleichungssystem von Funktionen mit einer Variablen pro Nichtterminal:t n G
Dies mag einschüchternd aussehen, ist jedoch nur eine syntaktische Transformation, wie im Beispiel deutlich wird. Die Idee ist, dass generierte Terminalsymbole im Exponenten von gezählt werden. Da das System dieselbe Form wie , kommt in der Summe so oft vor, wie Terminals von generiert werden können . Überprüfen Sie Kuich [2] auf Details.G z n n G
Die Lösung dieses Gleichungssystems (Computeralgebra!) Ergibt ; Jetzt müssen Sie "nur" den Koeffizienten ziehen (in geschlossener, allgemeiner Form). Das TCS Cheat Sheet und die Computeralgebra können dies häufig.
Betrachten Sie die einfache Grammatik mit Regeln
.
Es ist klar, dass (Schritt 1, Beweis durch Induktion). Es gibt Palindrome der Länge wenn ist, sonst .2 n nn0
Aufstellung des Gleichungssystems ergibt
wessen Lösung ist
.
Die Koeffizienten von stimmen mit der Anzahl der Palindrome überein , so dass eindeutig ist. G
Dies ist eine gute Frage, aber einige Googler hätten Ihnen gesagt, dass es keine allgemeine Methode für die Entscheidung über Mehrdeutigkeiten gibt. Sie müssen Ihre Frage daher präzisieren.
Für einige Grammatiken ist ein Induktionsnachweis (über Wortlänge) möglich.
Betrachten Sie zum Beispiel eine Grammatik über Σ = { a , b }, die durch die folgenden Regeln gegeben ist:
Alle Wörter der Länge in L ( G ) - es gibt nur ε - haben nur noch eine Ableitung.
Dies wird schwieriger, wenn
Es kann hilfreich sein, den Anspruch auf alle sententialen Formen (wenn die Grammatik keine unproduktiven Nichtterminals hat) und "Wurzel" -Nichtterminals zu stärken.
Ich denke, die Umwandlung in die Greibacher Normalform bewahrt (Un-) Zweideutigkeit, diesen Schritt zuerst anzuwenden, kann die Linksrekursion gut erledigen.
Der Schlüssel besteht darin, ein Merkmal jedes Wortes zu identifizieren, das (mindestens) einen Ableitungsschritt festlegt. Der Rest folgt induktiv.
Grundsätzlich ist es ein Problem der Kindergeneration. Beginnen Sie mit dem ersten Ausdruck, und generieren Sie dessen untergeordnete Elemente. Führen Sie ihn weiterhin rekursiv aus (DFS), und prüfen Sie nach einigen Iterationen, ob Sie denselben erweiterten Ausdruck aus zwei verschiedenen untergeordneten Elementen generieren können. Wenn Sie das können, ist es nicht eindeutig. Es gibt jedoch keine Möglichkeit, die Laufzeit dieses Algorithmus zu bestimmen. Angenommen, es ist sicher, nachdem vielleicht 30 Levels von Kindern generiert wurden :) (Natürlich könnte es am 31. bombardieren)