Algorithmen und Datenstrukturen I - - Thies Pfeiffer Technische Fakultät tpfeiffe@techfak.uni-bielefeld.de Vorlesung, Universität Bielefeld, Winter 2012/2013 1 / 22 Exkurs: Formale Sprachen Im Kapitel Maschinenmodelle haben wir endliche Automaten eingeführt. Wir haben darüber gesprochen, dass diese bestimmte Wortmengen akzeptieren. Später haben wir dann auch gesehen, wie man verschiedene Automaten kombinieren kann um komplexere Wortmengen verarbeiten zu können. 2 / 22
Wir haben definiert, dass eine formale Sprache über A eine beliebige Teilmenge L A ist und damit die akzeptierte Wortmenge Akz(A) für jeden endlichen Automaten auch eine formale Sprache ist. 3 / 22 Neben dem Maschinenmodell des Automaten haben wir auch eine algebraische Notation, die regulären Ausdrücke, kennen gelernt. Mit diesen kann man die akzeptierte Wortmenge deklarativ und viel prägnanter als mit Automaten festlegen. Die über reguläre Ausdrücke oder endliche Automaten definierten formalen Sprachen nennt man reguläre Sprachen. 4 / 22
Weiterhin haben wir festgehalten, dass endliche Automaten nur die kleinste Klasse einer Hierarchie von Modellen bilden, mit denen man formale Sprachen beschreiben kann. Heute wollen wir uns kurz mit der nächsten Stufe, den kontextfreien Sprachen, beschäftigen. 5 / 22 Kontextfreie Sprachen Kontextfreie Sprachen Kontextfreie Sprachen spielen eine entscheidende Rolle bei der Entwicklung von Programmiersprachen: mit ihnen lassen sich die Programmiersprachen prägnant deklarativ in Form einer Grammatik beschreiben. Diese Grammatiken können dann automatisch in ein Maschinenmodell übersetzt werden, welches die entsprechende Sprache, hier Programmiersprache, akzeptiert. Der Prozess dieser Strukturerkennung von Programmen wird auch Parsen genannt. 6 / 22
Kontextfreie Sprachen Neben Programmen werden auch Datenstrukturen über Grammatiken beschrieben. Besonders bekannt sind dabei auf XML basierende Datenstrukturen, die unter anderem über eine Grammatik, der Dokumenttypdefinition (DTD), beschrieben werden können. 7 / 22 Kontextfreie Sprachen Intermezzo 8 / 22
Beispiel Beispiel: Palindrome Ein Palindrom ist vorwärts wie rückwärts gelesen identisch. Beispiele für Palindrome sind otto, anna oder reliefpfeiler. Formal ausgedrückt: ein Wort w ist genau dann ein Palindrom, wenn gilt w = w R. 9 / 22 Beispiel Versuchen wir uns an einer Sprache L, die alle möglichen Palindrome aus Nullen und Einsen umfasst. Man kann leicht, über das Pumping Lemma, zeigen, dass eine Sprache die alle Palindrome aus Nullen und Einsen enthält, keine reguläre Sprache sein kann. Das überlassen wir aber der Theoretischen Informatik. Wie können wir diese Sprache L stattdessen aufschreiben? 10 / 22
Beispiel Beschreibungsansatz Idee: wir verwenden eine rekursive Definition Induktionsbeginn: ɛ, 0 und 1 sind Palindrome. Induktionsschritt: Ist w ein Palindrom, dann sind es auch 0w0 und 1w1. Ein Wort ist nur dann ein Palindrom, wenn es sich aus Induktionsbeginn und Induktionsschritt ergibt. 11 / 22 Beispiel Wie könnte man diese Definition mit noch einfacheren Mechanismen beschreiben? P ɛ P 0 P 1 P 0P0 P 1P1 12 / 22
Definition Definition kontextfreier Grammatiken Die Beschreibung einer Grammatik umfasst 1 ein Alphabet T, dessen Elemente man auch als terminale Symbole bezeichnet, 2 eine Menge von Variablen V, dessen Elemente man auch als nichtterminale Symbole bezeichnet, 3 eine endliche Menge von Regeln P, auch Produktionen genannt und 4 ein Start-Symbol S aus der Menge der nichtterminalen Symbole. Eine kontextfreie Grammatik kann also durch diese vier Komponenten beschrieben werden: G = (V, T, P, S) 13 / 22 Definition Die kontextfreie Grammatik für unsere Sprache der Palindrome über 0 und 1 ist damit G = ({P}, {0, 1}, A, P) mit A der Menge der Produktionen, die wir zuvor definiert haben. Die Regeln einer kontextfreien Grammatik bestehen aus einer Variablen, dem Kopf der Regel, die definiert wird, dem Produktionssymbol und einer Zeichenreihe aus terminalen und nicht-terminalen Symbolen, dem Rumpf. 14 / 22
Notation Notation Die Notation der Produktionen lässt sich vereinfacht schreiben, in dem man als Trennsymbol zwischen alternativen Rümpfen einführt. Dann wird aus P ɛ P 0 P 1 P 0P0 P 1P1 die deutlich kürzere Produktion: P ɛ 0 1 0P0 1P1. 15 / 22 Eine kontextfreie Grammatik für einfache Ausdrücke In Programmiersprachen kommen sehr häufig Ausdrücke vor, mit denen Berechnungsvorschriften festgelegt werden. Beispiele für solche Ausdrücke sind etwa 42 b2 1+4 a1 * a2 + b1 * b2 a1 * (a2 + b1) * b2 5 * a1 + 7 * b2 Wie könnte eine Grammatik für solche Ausdrücke aussehen? 16 / 22
Ableitung Ableitung Um zu zeigen, dass eine bestimmte Zeichenreihe in der über die Grammatik definierten Sprache liegt, muss man diese aus den Produktionsregeln herleiten können. Dabei gibt es zwei Vorgehensweisen: Bei der rekursiven Inferenz geht man vom Rumpf zum Kopf über, betrachtet also erst die Teile und setzt sie dann zusammen. Bei der Ableitung fängt man beim Startsymbol an und expandiert dieses so lange, bis man eine Zeichenreihe erhält, die nur aus terminalen Symbolen besteht. 17 / 22 Ableitung Ableitung Für die Ableitung müssen wir noch ein neues Relationssymbol einführen. Sei αaβ eine Zeichenreihe aus terminalen und nicht-terminalen Symbolen und A ein nicht-terminales Symbol. Weiterhin sei A γ eine Produktion. Dann sagen wir αaβ αγβ. Wir können auch noch so erweitern, dass sie keine bis beliebig viele solcher Ableitungsschritte repräsentiert. Das notieren wir mit. Um zu zeigen, dass eine Zeichenreihe w zu einer Sprache gehört, müssen wir dann also S w zeigen, mit dem Startsymbol S. 18 / 22
Parse-Bäume Parse-Bäume Eine Ableitung lässt sich auch als Baum darstellen. Dies ist die bevorzugte Form der Repräsentation von Ableitungen in Compilern und wird dort Parse-Baum genannt. Bei einem Parse-Baum werden nicht-terminale Symbole durch Verzweigungen oder Blätter und terminale-symbole durch Blätter repräsentiert. 19 / 22 Mehrdeutigkeiten Eine Grammatik, die eine Sprache, d.h. die zur Sprache gehörigen Zeichenreihen, formal korrekt spezifiziert, kann jedoch mehrdeutig in den erzeugten Strukturen sein. Dies lässt sich leicht am Beispiel E + E E zeigen. Eine Grammatik wird als eindeutig bezeichnet, wenn es für jedes Wort w der Sprache genau einen Parse-Baum gibt, ansonsten ist sie mehrdeutig. 20 / 22
Mehrdeutigkeiten Es gibt kein allgemeines Verfahren, um die Mehrdeutigkeit aus einer kontextfreien Grammatik zu entfernen. Es gibt sogar kein allgemeines Verfahren, um festzustellen, ob eine kontextfreie Grammatik mehrdeutig ist. Es gibt jedoch Techniken, mit denen konkrete Fälle von Mehrdeutigkeiten aufgelöst werden können: Auswertungsreihenfolge festlegen Richtung von Gruppierungen festlegen (z.b. von links nach rechts) 21 / 22 Wir haben kontextfreie Grammatiken und kontextfreie Sprachen kennen gelernt. Dazu gehören Definition, Notation, Ableitungen und Parse-Bäume. Wir haben über das Problem der Mehrdeutigkeit gesprochen und Techniken zur Auflösung von Mehrdeutigkeiten kennen gelernt. Kontextfreie Sprachen können durch Keller-Automaten definiert werden. Diese werden in der Theoretischen Informatik behandelt. Dieser Exkurs basiert auf Hopcroft, Motwani und Ullman: Einführung in die Automatentheorie, Formale Sprachen und Berechenbarkeit. 3. Auflage. Pearson Studium. 2011. 22 / 22