Formale Sprachen und Automaten - Kapitel 1: Grundlagen
Formale Sprachen und Automaten - Kapitel 1: Grundlagen
Formale Sprachen und Automaten - Kapitel 1: Grundlagen
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Formale</strong> <strong>Sprachen</strong> <strong>und</strong> <strong>Automaten</strong><br />
<strong>Kapitel</strong> 1: Gr<strong>und</strong>lagen<br />
Vorlesung an der DHBW Karlsruhe<br />
Thomas Worsch<br />
Karlsruher Institut für Technologie, Fakultät für Informatik<br />
Wintersemester 2012
Ziel<br />
Einführung<br />
◮ der wichtigsten Gr<strong>und</strong>begriffe<br />
◮ für prägnantes Reden<br />
◮ der wichtigsten Notationen<br />
◮ für prägnantes Schreiben<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 2/19
1.1 Beispiel<br />
Ein Übersetzer für Java (oder C, oder . . . )<br />
◮ liest als Eingabe eine Folge von Zeichen,<br />
◮ von denen der Benutzer „verspricht“, dass sie alle aus einer<br />
gewissen Menge A stammen.<br />
(Java: Teilmenge von Unicode, C: ASCII-Zeichensatz).<br />
◮ Diese Menge ist endlich <strong>und</strong> man nennt sie auch ein Alphabet.<br />
Ein Programm ist eine Zeichenfolge mit der Eigenschaft syntaktisch<br />
korrekt zu sein.<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 3/19
1.2 Definition<br />
◮ Alphabet: endliche Menge von Zeichen.<br />
◮ Wort über A: Folge von Zeichen aus A.<br />
◮ Länge |w| eines Wortes w:<br />
Anzahl Zeichen, aus denen es besteht.<br />
◮ Das leere Wort besteht aus 0 Zeichen: || = 0.<br />
Damit man es trotzdem sieht, schreibt man ε, also |ε| = 0.<br />
◮ Menge aller Wörter über einem Alphabet A schreiben wir A ∗ .<br />
◮ <strong>Formale</strong> Sprache über A:<br />
beliebige Teilmenge L ⊆ A ∗ von Wörtern<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 4/19
1.2 Definition<br />
◮ Alphabet: endliche Menge von Zeichen.<br />
◮ Wort über A: Folge von Zeichen aus A.<br />
◮ Länge |w| eines Wortes w:<br />
Anzahl Zeichen, aus denen es besteht.<br />
◮ Das leere Wort besteht aus 0 Zeichen: || = 0.<br />
Damit man es trotzdem sieht, schreibt man ε, also |ε| = 0.<br />
Aber ε ist kein Symbol aus A !<br />
◮ Menge aller Wörter über einem Alphabet A schreiben wir A ∗ .<br />
◮ <strong>Formale</strong> Sprache über A:<br />
beliebige Teilmenge L ⊆ A ∗ von Wörtern<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 4/19
Beachte: Benutzung des Wortes „Wort“<br />
◮ eine beliebige Folge von Zeichen aus dem benutzten Alphabet<br />
◮ auch wenn das Alphabet das Leerzeichen enthält<br />
◮ Ein Java-Programm ist ein Wort (in diesem Sinne).<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 5/19
1.3 Definition (Konkatenation)<br />
Es sei A ein beliebiges Alphabet.<br />
◮ Für zwei Wörter w1, w2 ∈ A ∗ mit<br />
w1 = a1 · · · ak, mit a1, . . . , ak ∈ A <strong>und</strong><br />
w2 = b1 · · · bℓ, mit b1, . . . , bℓ ∈ A ist ihre<br />
Konkatenation w1 · w2 = w1w2 = a1 · · · akb1 · · · bℓ.<br />
◮ Für das leere Wort gilt: w · ε = w = ε · w.<br />
◮ Die Potenzen eines Wortes w ∈ A ∗ sind so definiert:<br />
w 0 = ε<br />
w k+1 = w k w für alle k ∈ N0<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 6/19
1.4 Beispiele<br />
◮ 00 · 10 = 0010, aber 10 · 00 = 1000.<br />
◮ Die Konkatenation von Wörtern ist also nicht kommutativ.<br />
◮ w 1 = w 0+1 = w 0 · w = ε · w = w<br />
◮ w 2 = w 1+1 = w 1 · w = w · w = ww<br />
◮ 0 5 = 00000<br />
◮ 0 3 1 3 = 000111<br />
01 3 = 0111<br />
(01) 3 = 010101<br />
◮ (110101101) 0 = ε<br />
◮ Für alle k ∈ N0 ist ε k = ε.<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 7/19
1.5 Bemerkung<br />
◮ Für alle Wörter w1, w2 ∈ A ∗ gilt: |w1w2| = |w1| + |w2|.<br />
◮ Für alle k ∈ N0 ist daher |w k | = k|w|.<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 8/19
Eingabealphabete<br />
◮ In unseren Beispiele meist {0, 1} oder {a, b} o.ä.<br />
◮ Bei Programmiersprachen: oft ASCII oder Unicode oder . . .<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 9/19
1.6 Definition (Produkte auf <strong>Sprachen</strong>)<br />
Für formale <strong>Sprachen</strong> L1, L2, L ⊂ A ∗ definiert man:<br />
◮ Die Konkatenation oder das Produkt zweier <strong>Sprachen</strong><br />
L1 · L2 = L1L2 = {w1w2 | w1 ∈ L1 ∧ w2 ∈ L2}<br />
◮ Die Potenzen einer Sprache L sind so definiert:<br />
L 0 = {ε}<br />
L k+1 = L k L für alle k ∈ N<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 10/19
1.7 Beispiele<br />
◮ {01, 1} · {000, 01} = {01000, 0101, 1000, 101}<br />
◮ {010, 11} 2 = {010010, 01011, 11010, 1111}<br />
◮ {0, 1} 1 = {0, 1}<br />
◮ {0, 1} 2 = {00, 01, 10, 11}<br />
◮ {0, 1} 3 = {000, 001, 010, 011, 100, 101, 110, 111}<br />
◮ A k = w ∈ A ∗ |w| = k <br />
◮ A ∗ = A 0 ∪ A 1 ∪ A 2 ∪ A 3 ∪ · · ·<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 11/19
1.8 Bemerkung<br />
Bei der Konkatenation gilt insbesondere:<br />
◮<br />
◮ analog: L · {ε} = L.<br />
{ε} · L = {w1w2 | w1 ∈ {ε} ∧ w2 ∈ L}<br />
= {w1w2 | w1 = ε ∧ w2 ∈ L}<br />
= {εw2 | w2 ∈ L}<br />
= {w2 | w2 ∈ L}<br />
= L<br />
◮ Wichtig: Die formale Sprache {ε} ist nicht die leere Menge,<br />
sondern eine Menge, die genau ein Element enthält.<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 12/19
1.9 Definition<br />
Der ε-freie Konkatenationsabschluss L + einer formalen Sprache L<br />
<strong>und</strong> der Konkatenationsabschluss L ∗ von L sind so definiert:<br />
L + =<br />
L ∗ =<br />
∞<br />
L k<br />
k=1<br />
∞<br />
k=0<br />
L k = L 0 ∪ L + = {ε} ∪ L +<br />
◮ Das ist konsistent mit A ∗ wie wir es schon definiert haben!<br />
◮ L ∗ = L 0 ∪ L 1 ∪ L 2 ∪ L 3 ∪ · · ·<br />
◮ L + = L 1 ∪ L 2 ∪ L 3 ∪ · · ·<br />
◮ Der ∗ heißt auch Kleene-Operator oder Kleene-Stern.<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 13/19
1.10 Bemerkung<br />
◮ L + ist die Menge aller Wörter, die man als Produkt von einem<br />
oder mehreren Wörtern aus L schreiben kann.<br />
◮ Beachte: Auch in L + kann schon ε enthalten sein,<br />
nämlich dann, wenn ε ∈ L ist.<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 14/19
1.11 Beispiel<br />
◮ Die Menge der syntaktisch korrekten Java-Programme ist eine<br />
formale Sprache LJava ⊂ A ∗ über dem Alphabet<br />
A = {a, . . . , z, A, . . . , Z, +, −, ∗, . . .}.<br />
◮ Ein Java-Übersetzer muss unter anderem überprüfen, ob eine<br />
Eingabezeichenkette ein syntaktisch korrektes Java-Programm<br />
ist oder nicht.<br />
◮ Mit anderen Worten muss ein Übersetzer für jedes w ∈ A ∗<br />
feststellen können, ob w ∈ LJava ist oder nicht<br />
◮ <strong>und</strong> je nachdem dann verschiedene Aktionen durchführen.<br />
Gr<strong>und</strong>lagen Zeichen, Alphabete, Wörter, <strong>Sprachen</strong> 15/19
Probleme bei Programmiersprachen<br />
◮ Wie spezifiziert man (präzise), welche Zeichenfolgen<br />
syntaktisch korrekte Java-Programme sind?<br />
◮ Wie kann z. B. ein Algorithmus aussehen, der überprüft, ob die<br />
Eingabe ein syntaktisch korrektes Java-Programm ist?<br />
Gr<strong>und</strong>lagen „Verarbeitung“ formaler <strong>Sprachen</strong> 16/19
Probleme bei formalen <strong>Sprachen</strong><br />
Verallgemeinert auf beliebige formale <strong>Sprachen</strong>:<br />
◮ Wie spezifiziert man eine formale Sprache?<br />
◮ Inwieweit kann man Algorithmen angeben, die für<br />
Eingabewörter entscheiden, ob sie zu einer vorher spezifizierten<br />
formalen Sprache gehören?<br />
Ist man erst einmal so weit, dann ergeben sich als weitere Fragen:<br />
◮ Kann man den Entscheidungsalgorithmus womöglich<br />
automatisch aus der Spezifikation der formalen <strong>Sprachen</strong><br />
erzeugen?<br />
◮ Gibt es vielleicht Teilklassen (besonders „einfacher“) formaler<br />
<strong>Sprachen</strong>, für die gewisse besonders „schöne“ Spezifizierungs<strong>und</strong><br />
Erkennungsmethoden benutzt werden können?<br />
Gr<strong>und</strong>lagen „Verarbeitung“ formaler <strong>Sprachen</strong> 17/19
Lösungsansätze<br />
◮ Die Entscheidung über die Zugehörigkeit eines Wortes zu einer<br />
formalen Sprache kann manchmal durch Angabe eines<br />
Algorithmus in irgendeiner gängigen Programmiersprache<br />
beschrieben werden.<br />
◮ Für spezielle Klassen formaler <strong>Sprachen</strong> kommt man mit<br />
Algorithmen einer bestimmten speziellen einfachen Struktur<br />
aus.<br />
◮ Übliche Darstellung: gewisse Sorten von <strong>Automaten</strong>.<br />
◮ Typisch: eine Kontrolleinheit (sozusagen mit einem fest<br />
verdrahteten Programm), die auf einen (Daten-)Speicher<br />
zugreifen kann.<br />
◮ Unterschiede insbesondere bei der Speichergröße <strong>und</strong> bei der<br />
Art der möglichen Speicherzugriffe.<br />
◮ Je nach „Kompliziertheit“ der formalen Sprache braucht man<br />
unterschiedlich „mächtige“ <strong>Automaten</strong> für die Erkennung.<br />
Gr<strong>und</strong>lagen „Verarbeitung“ formaler <strong>Sprachen</strong> 18/19
Vorschau<br />
◮ Chomsky-Hierarchie: unterscheide Typ-3-, Typ-2-, Typ-1- <strong>und</strong><br />
Typ-0-<strong>Sprachen</strong> (mit zunehmendem „Schwierigkeitsgrad“).<br />
◮ Schwergewicht auf<br />
◮ regulären <strong>Sprachen</strong> (Typ 3) <strong>und</strong><br />
◮ kontextfreien <strong>Sprachen</strong> (Typ 2)<br />
da z. B. im Übersetzerbau von Bedeutung.<br />
◮ Typ-1- <strong>und</strong> Typ-0-<strong>Sprachen</strong> <strong>und</strong> noch „kompliziertere“ werden<br />
nur kurz abgehandelt.<br />
◮ Regular Expressions<br />
◮ Syntaxanalyse in einfacher Form<br />
Gr<strong>und</strong>lagen Vorschau auf die Vorlesung 19/19