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
kann eine Grammatik
in Chomsky-Normalform konstruiert werden, die dieselbe Sprache erzeugt. Die Grammatik
wird dann auch eine Chomsky-Normalform der kontextfreien Grammatik
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
ist in Chomsky-Normalform, wenn jede Produktion aus
eine der folgenden Formen hat:
![{\displaystyle A\rightarrow BC}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d006db33dce212be6b03190185ee63f78a27a055)
![{\displaystyle A\rightarrow a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/f2c4fbdf7d3a3af41e9c6b2f8e9586d9ada6317d)
![{\displaystyle S\rightarrow \varepsilon }](https://wikimedia.org/api/rest_v1/media/math/render/svg/0f812ed93b682adf1fe8eb6e8f4d8dfe4efa9336)
wobei
,
und
Nichtterminalsymbole aus
sind und
ein Terminalsymbol aus
ist.
ist das Startsymbol und
das leere Wort. Wenn die Produktion
zur Grammatik gehört, dann darf
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.
Liegt eine kontextfreie Grammatik
vor, so lässt sich daraus schrittweise eine Grammatik
in Chomsky-Normalform generieren, die dieselbe Sprache erzeugt:
- Ausnahme
behandeln
- Enthält die Grammatik
die Regel
, wird ein neues Startsymbol
für
eingeführt. Anschließend erhält die neue Grammatik die Regeln
und
. 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
wird ein Nichtterminalsymbol
zugeordnet. Auf der rechten Seite jeder Produktion werden sämtliche Terminalsymbole
durch das entsprechende Nichtterminalsymbol
ersetzt. Abschließend werden alle Produktionen
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
durch ein neues Nichtterminal
ersetzt. Die Produktion
wird zur Grammatik hinzugefügt. Dies wiederholt man solange, bis keine Produktion mit mehr als zwei Nichtterminalen mehr vorkommt.
-Produktionen entfernen
- Streiche die Regeln
, außer
(falls vorhanden).
- Gab es vorher genau eine Produktion mit
auf der linken Seite, so streiche das
überall auf den rechten Seiten der Produktionen, denn es kann nicht zu einem Terminal abgeleitet werden.
- Gab es vorher mehrere Produktionen mit
auf der linken Seite, so füge für jede Regel, die ein solches
auf der rechten Seite enthält, eine Regel hinzu, in der das
gestrichen wurde, denn es muss der Fall betrachtet werden, in dem das
als leeres Wort abgeleitet wurde oder etwa nicht. Die Regel
wird dann beispielsweise um die Regel
ergänzt.
- Aus
wird also:
![{\displaystyle C\rightarrow B}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ffffaf8052c965411189d15dd62668811b2c282a)
![{\displaystyle C\rightarrow AB}](https://wikimedia.org/api/rest_v1/media/math/render/svg/6b9657e945c4b5f5f312cb4203f1e4053cd90f1e)
- Kettenregeln (Produktionen der Form A→B) entfernen
- Wenn man eine Kettenregel, d. h. eine Produktion der Form
, entfernt, fügt man für jede vorhandene Produktion der Form
eine neue Produktion
hinzu, falls diese keine bereits entfernte Kettenregel ergibt.
ist hierbei ein beliebiges Wort; die vorangegangenen Änderungen gewährleisten aber, dass
entweder genau ein Terminalsymbol ist oder ein Wort aus genau zwei Nichtterminalsymbolen.
Beispiel
Es gilt, die Grammatik über dem Alphabet
mit den Regeln
![{\displaystyle S\rightarrow ASA|aB}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9e857d76dc32684f632b1b6891ab4f25cfd6a5b3)
![{\displaystyle A\rightarrow B|S}](https://wikimedia.org/api/rest_v1/media/math/render/svg/79d08de8654b28daff65bd55d3fe3c5975fc54c4)
![{\displaystyle B\rightarrow b|\varepsilon }](https://wikimedia.org/api/rest_v1/media/math/render/svg/56cdc93964d1cdff84edb82f98120f0d3e4c6947)
in Chomsky-Normalform zu bringen.
1. Neue Startvariable hinzufügen
![{\displaystyle S_{0}\rightarrow S}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ba9614c5110b4ff3402115278b6e95840408234d)
![{\displaystyle S\rightarrow ASA|aB}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9e857d76dc32684f632b1b6891ab4f25cfd6a5b3)
![{\displaystyle A\rightarrow B|S}](https://wikimedia.org/api/rest_v1/media/math/render/svg/79d08de8654b28daff65bd55d3fe3c5975fc54c4)
![{\displaystyle B\rightarrow b|\varepsilon }](https://wikimedia.org/api/rest_v1/media/math/render/svg/56cdc93964d1cdff84edb82f98120f0d3e4c6947)
2.
-Übergänge entfernen
![{\displaystyle S_{0}\rightarrow S}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ba9614c5110b4ff3402115278b6e95840408234d)
![{\displaystyle S\rightarrow ASA|aB|a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8818fc5d5b17ba2037ba2cef884eb28541bda042)
![{\displaystyle A\rightarrow B|\varepsilon |S}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d44eb5386ef54f16b44f793bdd63f76eb32623e5)
![{\displaystyle B\rightarrow b}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8198c29a0217ade84f2fc29ec669f300ce3996db)
Eine neue
-Regel ist entstanden, die wiederum gleich behandelt werden muss:
![{\displaystyle S_{0}\rightarrow S}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ba9614c5110b4ff3402115278b6e95840408234d)
![{\displaystyle S\rightarrow ASA|AS|SA|aB|a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1be9481ab6ce796e1fbe4dbff46579fb6e6408a8)
![{\displaystyle A\rightarrow B|S}](https://wikimedia.org/api/rest_v1/media/math/render/svg/79d08de8654b28daff65bd55d3fe3c5975fc54c4)
![{\displaystyle B\rightarrow b}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8198c29a0217ade84f2fc29ec669f300ce3996db)
3. Alle Einheits-Regeln entfernen. Diese sind
und
.
![{\displaystyle S_{0}\rightarrow S}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ba9614c5110b4ff3402115278b6e95840408234d)
![{\displaystyle S\rightarrow ASA|AS|SA|aB|a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1be9481ab6ce796e1fbe4dbff46579fb6e6408a8)
![{\displaystyle A\rightarrow S}](https://wikimedia.org/api/rest_v1/media/math/render/svg/a07a4dd042c1c2a5fc225c59c294f2674fb4a8ba)
![{\displaystyle B\rightarrow b}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8198c29a0217ade84f2fc29ec669f300ce3996db)
![{\displaystyle A\rightarrow b}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e99db60c2eeea11cb8bf249ed43db4099b864718)
danach
![{\displaystyle S_{0}\rightarrow S}](https://wikimedia.org/api/rest_v1/media/math/render/svg/ba9614c5110b4ff3402115278b6e95840408234d)
![{\displaystyle S\rightarrow ASA|AS|SA|aB|a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1be9481ab6ce796e1fbe4dbff46579fb6e6408a8)
![{\displaystyle A\rightarrow ASA|AS|SA|aB|a|b}](https://wikimedia.org/api/rest_v1/media/math/render/svg/cfc51c2033cd59af0a381617b42369c1c19a536d)
![{\displaystyle B\rightarrow b}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8198c29a0217ade84f2fc29ec669f300ce3996db)
und zum Schluss
![{\displaystyle S_{0}\rightarrow ASA|AS|SA|aB|a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/56f266b8b7f273955550a9a5eb3974ed0a25f4da)
![{\displaystyle S\rightarrow ASA|AS|SA|aB|a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1be9481ab6ce796e1fbe4dbff46579fb6e6408a8)
![{\displaystyle A\rightarrow ASA|AS|SA|aB|a|b}](https://wikimedia.org/api/rest_v1/media/math/render/svg/cfc51c2033cd59af0a381617b42369c1c19a536d)
![{\displaystyle B\rightarrow b}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8198c29a0217ade84f2fc29ec669f300ce3996db)
4. Längere Verkettungen sind nicht erlaubt, deshalb führen wir eine zusätzliche Variable
ein und ersetzen
durch die Regel
und
:
![{\displaystyle S_{0}\rightarrow AA_{1}|AS|SA|aB|a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/9deb2ddd5538221baa2e98286573c7e2e897ec90)
![{\displaystyle S\rightarrow AA_{1}|AS|SA|aB|a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/32e0d01d00579e538123b7d9f0dfac5654c6d87b)
![{\displaystyle A\rightarrow AA_{1}|AS|SA|aB|a|b}](https://wikimedia.org/api/rest_v1/media/math/render/svg/bec5e680c8b7921face9b0683146362fbb6d607f)
![{\displaystyle A_{1}\rightarrow SA}](https://wikimedia.org/api/rest_v1/media/math/render/svg/edf9113d7d464370931b1c3bf5a34d583dcdb7da)
![{\displaystyle B\rightarrow b}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8198c29a0217ade84f2fc29ec669f300ce3996db)
Nun bleiben nur noch die Regel
und
. Deshalb wird eine weitere Variable
verwendet die zusammen mit der Regel
das Terminalsymbol
in den genannten Regeln ersetzen kann.
![{\displaystyle S_{0}\rightarrow AA_{1}|AS|SA|X_{a}B|a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d83c4ace3800ac7d819b2ceb7180897d184fbb04)
![{\displaystyle S\rightarrow AA_{1}|AS|SA|X_{a}B|a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/33a09d2d14ea3fb3b1fbf6ac805d47bec1377d57)
![{\displaystyle A\rightarrow AA_{1}|AS|SA|X_{a}B|a|b}](https://wikimedia.org/api/rest_v1/media/math/render/svg/3aa12157436bbc4590457e6d95399ed3ec246ff7)
![{\displaystyle A_{1}\rightarrow SA}](https://wikimedia.org/api/rest_v1/media/math/render/svg/edf9113d7d464370931b1c3bf5a34d583dcdb7da)
![{\displaystyle X_{a}\rightarrow a}](https://wikimedia.org/api/rest_v1/media/math/render/svg/d787a850242cc35b3f94a23d241701d7725b00ec)
![{\displaystyle B\rightarrow b}](https://wikimedia.org/api/rest_v1/media/math/render/svg/8198c29a0217ade84f2fc29ec669f300ce3996db)
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