Chomsky-Normalform

Aus testwiki
Zur Navigation springen Zur Suche springen

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. Aus jeder kontextfreien Grammatik G kann eine Grammatik GCNF in Chomsky-Normalform konstruiert werden, die dieselbe Sprache erzeugt. Die Grammatik GCNF wird dann auch eine Chomsky-Normalform der kontextfreien Grammatik G 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 G=(V,Σ,P,S) ist in Chomsky-Normalform, wenn jede Produktion aus P eine der folgenden Formen hat:

  • ABC
  • Aa
  • Sε

wobei A, B und C Nichtterminalsymbole aus V sind und a ein Terminalsymbol aus Σ ist. S ist das Startsymbol und ε das leere Wort. Wenn die Produktion Sε zur Grammatik gehört, dann darf S 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 G=(V,Σ,P,S) vor, so lässt sich daraus schrittweise eine Grammatik G in Chomsky-Normalform generieren, die dieselbe Sprache erzeugt:

Ausnahme Sε behandeln
Enthält die Grammatik G die Regel Sε, wird ein neues Startsymbol S für G eingeführt. Anschließend erhält die neue Grammatik die Regeln Sε und SS. 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 a wird ein Nichtterminalsymbol Xa zugeordnet. Auf der rechten Seite jeder Produktion werden sämtliche Terminalsymbole a durch das entsprechende Nichtterminalsymbol Xa ersetzt. Abschließend werden alle Produktionen Xaa 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 AB durch ein neues Nichtterminal YAB ersetzt. Die Produktion YABAB wird zur Grammatik hinzugefügt. Dies wiederholt man solange, bis keine Produktion mit mehr als zwei Nichtterminalen mehr vorkommt.
ε-Produktionen entfernen
Streiche die Regeln Aε, außer Sε (falls vorhanden).
Gab es vorher genau eine Produktion mit A auf der linken Seite, so streiche das A überall auf den rechten Seiten der Produktionen, denn es kann nicht zu einem Terminal abgeleitet werden.
Gab es vorher mehrere Produktionen mit A auf der linken Seite, so füge für jede Regel, die ein solches A auf der rechten Seite enthält, eine Regel hinzu, in der das A gestrichen wurde, denn es muss der Fall betrachtet werden, in dem das A als leeres Wort abgeleitet wurde oder etwa nicht. Die Regel CAB wird dann beispielsweise um die Regel CB ergänzt.
Aus CAB wird also:
CB
CAB
Kettenregeln (Produktionen der Form A→B) entfernen
Wenn man eine Kettenregel, d. h. eine Produktion der Form AB, entfernt, fügt man für jede vorhandene Produktion der Form Bw eine neue Produktion Aw hinzu, falls diese keine bereits entfernte Kettenregel ergibt. w ist hierbei ein beliebiges Wort; die vorangegangenen Änderungen gewährleisten aber, dass w entweder genau ein Terminalsymbol ist oder ein Wort aus genau zwei Nichtterminalsymbolen.

Beispiel

Es gilt, die Grammatik über dem Alphabet Σ={a,b} mit den Regeln

  • SASA|aB
  • AB|S
  • Bb|ε

in Chomsky-Normalform zu bringen.  

1. Neue Startvariable hinzufügen

  • S0S
  • SASA|aB
  • AB|S
  • Bb|ε

  2. ε-Übergänge entfernen

  • S0S
  • SASA|aB|a
  • AB|ε|S
  • Bb

  Eine neue ε-Regel ist entstanden, die wiederum gleich behandelt werden muss:

  • S0S
  • SASA|AS|SA|aB|a
  • AB|S
  • Bb

  3. Alle Einheits-Regeln entfernen. Diese sind AB,AS und S0S.

  • S0S
  • SASA|AS|SA|aB|a
  • AS
  • Bb
  • Ab

  danach AS

  • S0S
  • SASA|AS|SA|aB|a
  • AASA|AS|SA|aB|a|b
  • Bb

  und zum Schluss S0S

  • S0ASA|AS|SA|aB|a
  • SASA|AS|SA|aB|a
  • AASA|AS|SA|aB|a|b
  • Bb

  4. Längere Verkettungen sind nicht erlaubt, deshalb führen wir eine zusätzliche Variable A1 ein und ersetzen SASA durch die Regel SAA1 und A1SA:

  • S0AA1|AS|SA|aB|a
  • SAA1|AS|SA|aB|a
  • AAA1|AS|SA|aB|a|b
  • A1SA
  • Bb

  Nun bleiben nur noch die Regel AaB und SaB. Deshalb wird eine weitere Variable Xa verwendet die zusammen mit der Regel Xaa das Terminalsymbol a in den genannten Regeln ersetzen kann.

  • S0AA1|AS|SA|XaB|a
  • SAA1|AS|SA|XaB|a
  • AAA1|AS|SA|XaB|a|b
  • A1SA
  • Xaa
  • Bb

  Somit ist die Grammatik in Chomsky-Normalform umgewandelt.

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