Chomsky-Normalform - LinkFang.de





Chomsky-Normalform


Die Chomsky-Normalform (Abk.: CNF) ist in der theoretischen Informatik eine Normalform für kontextfreie Grammatiken. Sie ist nach dem Linguisten Noam Chomsky benannt und kommt beim CYK-Algorithmus zum Einsatz. Eine kontextfreie Grammatik in Chomsky-Normalform hat eine einfache Struktur der Produktionsregeln und erfüllt auch die Eigenschaften kontextsensitiver Grammatiken.

Zu jeder kontextfreien Sprache gibt es eine Grammatik in Chomsky-Normalform. Deshalb kann aus jeder kontextfreien Grammatik [math]G[/math] eine Chomsky-Normalform [math]G_{CNF}[/math] konstruiert werden, die dieselbe Sprache erzeugt. Die Grammatik [math]G_{CNF}[/math] wird dann auch eine Chomsky-Normalform der kontextfreien Grammatik [math]G[/math] genannt.

Eine weitere Normalform für kontextfreie Grammatiken ist die Greibach-Normalform. Eine Erweiterung der Chomsky-Normalform auf kontextsensitive Grammatiken stellt die Kuroda-Normalform dar. Die Chomsky-Normalform wird auf Grund der gleichen Abkürzung leicht mit der Konjunktiven Normalform (engl. conjunctive normal form) verwechselt.

Definition

Eine formale Grammatik [math]G=(V,\Sigma,P,S)[/math] ist in Chomsky-Normalform, wenn jede Produktion aus [math]P[/math] eine der folgenden Formen hat:

  • [math]A \rightarrow BC[/math]
  • [math]A \rightarrow a[/math]
  • [math]S \rightarrow \varepsilon[/math]

wobei [math]A[/math], [math]B[/math] und [math]C[/math] Nichtterminalsymbole aus [math]V[/math] sind und [math]a[/math] ein Terminalsymbol aus [math]\Sigma[/math] ist. [math]S[/math] ist das Startsymbol und [math]\varepsilon[/math] das leere Wort. Wenn die Produktion [math]S \rightarrow \varepsilon[/math] zur Grammatik gehört, dann darf [math]S[/math] nicht auf der rechten Seite einer Produktion stehen.

Lässt man bei der ersten Produktion auf der rechten Seite beliebig viele anstatt zwei Nichtterminalsymbole zu, so spricht man von einer schwachen Chomsky-Normalform.

Konstruktion einer Chomsky-Normalform

Liegt eine kontextfreie Grammatik [math]G=(V,\Sigma,P,S)[/math] vor, so lässt sich daraus schrittweise eine Grammatik [math]G'[/math] in Chomsky-Normalform generieren, die dieselbe Sprache erzeugt:

Ausnahme [math]S\rightarrow\varepsilon[/math] behandeln
Enthält die Grammatik [math]G[/math] die Regel [math]S\rightarrow\varepsilon[/math], wird ein neues Startsymbol [math]S'[/math] für [math]G'[/math] eingeführt. Anschließend erhält die neue Grammatik die Regeln [math]S'\rightarrow\varepsilon[/math] und [math]S'\rightarrow S[/math]. Damit ist sichergestellt, dass die Grammatik weiterhin das leere Wort ermöglicht und das ursprüngliche Startsymbol weiterhin auf der rechten Seite verwendet werden kann.
Eine schwache Chomsky-Normalform erzeugen
Jedem Terminalsymbol [math]a[/math] wird ein Nichtterminalsymbol [math]X_a[/math] zugeordnet. Auf der rechten Seite jeder Produktion werden sämtliche Terminalsymbole [math]a[/math] durch das entsprechende Nichtterminalsymbol [math]X_a[/math] ersetzt. Abschließend werden alle Produktionen [math]X_a \rightarrow a[/math] der Grammatik hinzugefügt.
Rechte Seiten mit mehr als zwei Nichtterminalen ersetzen
Sind auf der rechten Seite einer Produktion mehr als zwei Nichtterminale, so werden zwei benachbarte Nichtterminale [math]AB[/math] durch ein neues Nichtterminal [math]Y_{AB}[/math] ersetzt. Die Produktion [math]Y_{AB} \rightarrow AB[/math] wird zur Grammatik hinzugefügt. Dies wiederholt man solange, bis keine Produktion mit mehr als zwei Nichtterminalen mehr vorkommt.
[math]\varepsilon[/math]-Produktionen entfernen
Streiche die Regeln [math]A \rightarrow \varepsilon[/math], außer [math]S'\rightarrow \varepsilon[/math] (falls vorhanden).
Gab es vorher genau eine Produktion mit [math]A[/math] auf der linken Seite, so streiche das [math]A[/math] überall auf den rechten Seiten der Produktionen.
Gab es vorher mehrere Produktionen mit [math]A[/math] auf der linken Seite, so füge für jede Regel, die ein solches [math]A[/math] auf der rechten Seite enthält, eine Regel hinzu, in der das [math]A[/math] gestrichen wurde. Die Regel [math]C \rightarrow AB[/math] wird dann beispielsweise um die Regel [math]C\rightarrow B[/math] ergänzt.
Kettenregeln (Produktionen der Form A→B) entfernen
Wenn man eine Kettenregel, d. h. eine Produktion der Form [math]A \rightarrow B[/math], entfernt, fügt man für jede vorhandene Produktion der Form [math]B \rightarrow w[/math] eine neue Produktion [math]A \rightarrow w[/math] hinzu, falls diese keine bereits entfernte Kettenregel ergibt. [math]w[/math] ist hierbei ein beliebiges Wort; die vorangegangenen Änderungen gewährleisten aber, dass [math]w[/math] entweder genau ein Terminalsymbol ist oder ein Wort aus genau zwei Nichtterminalsymbolen.

Beispiel

Es gilt die Grammatik über dem Alphabet [math]\Sigma = \{a,b\}[/math] mit den Regeln

  • [math]S \rightarrow ASA | aB[/math]
  • [math]A \rightarrow B | S[/math]
  • [math]B \rightarrow b | \varepsilon[/math]

in Chomsky Normalform zu bringen.  

1. Neue Startvariable hinzufügen

  • [math]S_{0} \rightarrow S[/math]
  • [math]S \rightarrow ASA | aB[/math]
  • [math]A \rightarrow B | S[/math]
  • [math]B \rightarrow b | \varepsilon[/math]

  2. [math]\varepsilon[/math]-Übergänge entfernen

  • [math]S_{0} \rightarrow S[/math]
  • [math]S \rightarrow ASA | aB |a[/math]
  • [math]A \rightarrow B |\varepsilon | S[/math]
  • [math]B \rightarrow b[/math]

  Eine neue [math]\varepsilon[/math]-Regel ist entstanden, die wiederum gleich behandelt werden muss:

  • [math]S_{0} \rightarrow S[/math]
  • [math]S \rightarrow ASA | AS | SA | aB |a[/math]
  • [math]A \rightarrow B | S[/math]
  • [math]B \rightarrow b[/math]

  3. Alle Einheits-Regeln entfernen. Diese sind [math]A \rightarrow B, A \rightarrow S[/math] und [math]S_{0} \rightarrow S[/math].

  • [math]S_{0} \rightarrow S[/math]
  • [math]S \rightarrow ASA | AS | SA | aB |a[/math]
  • [math]A \rightarrow S[/math]
  • [math]B \rightarrow b[/math]
  • [math]A \rightarrow b[/math]

  danach [math]A \rightarrow S[/math]

  • [math]S_{0} \rightarrow S[/math]
  • [math]S \rightarrow ASA | AS | SA | aB |a[/math]
  • [math]A \rightarrow ASA | AS | SA | aB |a |b[/math]
  • [math]B \rightarrow b[/math]

  und zum Schluss [math]S_{0} \rightarrow S[/math]

  • [math]S_{0} \rightarrow ASA | AS | SA | aB |a[/math]
  • [math]S \rightarrow ASA | AS | SA | aB |a[/math]
  • [math]A \rightarrow ASA | AS | SA | aB |a |b[/math]
  • [math]B \rightarrow b[/math]

  4. Längere Verkettungen sind nicht erlaubt, deshalb führen wir eine zusätzliche Variable [math]A_{1} [/math] ein und ersetzen [math]S\rightarrow ASA[/math] durch die Regel [math]S \rightarrow AA_{1}[/math] und [math]A_{1}\rightarrow SA[/math]:

  • [math]S_{0} \rightarrow AA_{1} | AS | SA | aB |a[/math]
  • [math]S \rightarrow AA_{1} | AS | SA | aB |a[/math]
  • [math]A \rightarrow AA_{1} | AS | SA | aB |a |b[/math]
  • [math]A_{1} \rightarrow SA[/math]
  • [math]B \rightarrow b[/math]

  Nun bleiben nur noch die Regel [math]A \rightarrow aB[/math] und [math]S \rightarrow aB[/math]. Deshalb wird eine weitere Variable [math]U[/math] verwendet die zusammen mit der Regel [math]U \rightarrow a[/math] das Terminalsymbol [math]a[/math] in den genannten Regeln ersetzen kann.

  • [math]S_{0} \rightarrow AA_{1} | AS | SA | UB |a[/math]
  • [math]S \rightarrow AA_{1} | AS | SA | UB |a[/math]
  • [math]A \rightarrow AA_{1} | AS | SA | UB |a |b[/math]
  • [math]A_{1} \rightarrow SA[/math]
  • [math]U \rightarrow a[/math]
  • [math]B \rightarrow b[/math]

  Somit ist die Grammatik in Chomsky Normalform geschrieben.

Quellen

  • Grzegorz Rozenberg, Arto Salomaa: Handbook of Formal Languages. Volume 1: Word, Language, Grammar. Springer-Verlag, Berlin u. a. 1997, ISBN 3-540-60420-0, S. 124–125

Kategorien: Compilerbau | Theorie formaler Sprachen

Quelle: Wikipedia - http://de.wikipedia.org/wiki/Chomsky-Normalform (Vollständige Liste der Autoren des Textes [Versionsgeschichte])    Lizenz: CC-by-sa-3.0

Änderungen: Alle Bilder mit den meisten Bildunterschriften wurden entfernt. Ebenso alle zu nicht-existierenden Artikeln/Kategorien gehenden internen Wikipedia-Links (Bsp. Portal-Links, Redlinks, Bearbeiten-Links). Entfernung von Navigationsframes, Geo & Normdaten, Mediadateien, gesprochene Versionen, z.T. ID&Class-Namen, Style von Div-Containern, Metadaten, Vorlagen, wie lesenwerte Artikel. Ansonsten sind keine Inhaltsänderungen vorgenommen worden. Weiterhin kann es durch die maschinelle Bearbeitung des Inhalts zu Fehlern gerade in der Darstellung kommen. Darum würden wir jeden Besucher unserer Seite darum bitten uns diese Fehler über den Support mittels einer Nachricht mit Link zu melden. Vielen Dank!

Stand der Informationen: August 201& - Wichtiger Hinweis: Da die Inhalte maschinell von Wikipedia übernommen wurden, ist eine manuelle Überprüfung nicht möglich. Somit garantiert LinkFang.de nicht die Richtigkeit und Aktualität der übernommenen Inhalte. Sollten die Informationen mittlerweile fehlerhaft sein, bitten wir Sie darum uns per Support oder E-Mail zu kontaktieren. Wir werden uns dann innerhalb von spätestens 10 Tagen um Ihr Anliegen kümmern. Auch ohne Anliegen erfolgt mindestens alle drei Monate ein Update der gesamten Inhalte.