Theoretische Informatik - ganz praktisch 9783110412086, 9783110412079

For many students, theoretical computer science is a nightmare, since formal hurdles impede access to practical utility.

176 67 3MB

German Pages 428 [432] Year 2016

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

Theoretische Informatik - ganz praktisch
 9783110412086, 9783110412079

Table of contents :
Vorwort und Lesehinweise
Inhalt
1 Auf dem Weg zur theoretischen Informatik
1.1 Information: der Stoff der Informatik
1.2 Formale Sprachen, Funktionen und Probleme
1.3 Zusammenfassung
2 Deterministische Automaten
2.1 Turingmaschinen
2.2 Linear beschränkte Turingmaschinen (LBA)
2.3 Kellerautomaten
2.4 Endliche Automaten
2.5 Zusammenfassung
3 Nichtdeterminismus: Ratende Automaten?
3.1 Nichtdeterminismus bei Turingmaschinen
3.2 Nichtdeterminismus bei LBA
3.3 Nichtdeterminismus bei Kellerautomaten
3.4 Nichtdeterminismus bei endlichen Automaten
3.5 Zusammenfassung
4 Grammatiken und die Chomsky-Hierarchie
4.1 Allgemeine Grammatiken (Chomsky-Typ 0)
4.2 Kontextsensitive Grammatiken (Chomsky-Typ 1)
4.3 Monotone Grammatiken (noch einmal Chomsky-Typ 1)
4.4 Kontextfreie Grammatiken (Chomsky-Typ 2)
4.5 LR(k)-Grammatiken (eine Zwischenstufe)
4.6 Rechtslineare Grammatiken (Chomsky-Typ 3)
4.7 Grammatiken mit endlicher Auswahl (Chomsky-Typ 4?)
4.8 Zusammenfassung
5 Weitere strukturelle Eigenschaften der vorgestellten Sprachklassen
5.1 Reguläre Ausdrücke (Chomsky-Typ 3)
5.2 Die Pumping-Lemmata (Chomsky-Typen 2 und 3)
5.3 Normalformen für Grammatiken
5.4 Zusammenfassung
6 Berechenbarkeitstheorie
6.1 Was „empfinden“ wir als berechenbar?
6.2 Formalisierung der Berechenbarkeit durch Turingmaschinen
6.3 Die Turingmaschine als universeller Rechner
6.4 Eigenschaften (semi-)entscheidbarer Sprachen
6.5 Reduzierbarkeit: zur relativen Schwierigkeit von Problemen
6.6 Zusammenfassung
7 Komplexitätstheorie
7.1 Wie misst man die Komplexität von Problemen?
7.2 Die Klassen P und NP
7.3 Die Klassen NP-schwer und NP-vollständig
7.4 Wie findet man NP-vollständige Probleme?
7.5 Weitere Problemklassen und Reduktionen
7.6 Zusammenfassung
A Mathematische Grundlagen
A.1 Mengen und Funktionen
A.2 Graphen
A.3 Alphabete, Zeichen, Wörter und Sprachen
A.4 Landau-Notation
A.5 Kodierung
A.6 Klassifizierung von Sprachen
B Skripte
Literaturverzeichnis
Stichwortverzeichnis

Citation preview

Lukas König, Friederike Pfeiffer-Bohnen, Hartmut Schmeck Theoretische Informatik – ganz praktisch De Gruyter Studium

Weitere empfehlenswerte Titel Rechnerorganisation und Rechnerentwurf, 5. Auflage D. Patterson, J.L. Hennessy, 2016 ISBN 978-3-11-044605-0, e-ISBN 978-3-11-044606-7, e-ISBN (EPUB) 978-3-11-044612-8 Informatik, Band 1: Programmierung, Algorithmen und Datenstrukturen H.P. Gumm, M.Sommer, 2016 ISBN 978-3-11-044227-4, e-ISBN 978-3-11-044226-7, e-ISBN (EPUB) 978-3-11-044231-1 Informatik, Band 2: Rechnerarchitektur, Betriebssysteme, Rechnernetze H.P. Gumm, M.Sommer, 2017 ISBN 978-3-11-044235-9, e-ISBN 978-3-11-044236-6, e-ISBN (EPUB) 978-3-11-043442-2 Informatik, Band 3: Formale Sprachen, Compilerbau, Programmierung H.P. Gumm, M.Sommer, 2018 ISBN 978-3-11-044238-0, e-ISBN 978-3-11-044239-7, e-ISBN (EPUB) 978-3-11-043405-7 Complex Behavior in Evolutionary Robotics Lukas König, 2015 ISBN 978-3-11-040854-6, e-ISBN 978-3-11-040855-3, e-ISBN (EPUB) 978-3-11-040918-5, Set-ISBN 978-3-11-040917-8

Lukas König, Friederike Pfeiffer-Bohnen, Hartmut Schmeck

Theoretische Informatik – ganz praktisch

Autoren Dr. Lukas König Karlsruher Institut für Technologie Institut für Angewandte Informatik und Formale Beschreibungsverfahren Kaiserstr. 89 76133 Karlsruhe [email protected] Dipl.-Wi.-Ing. Friederike Pfeiffer-Bohnen Karlsruher Institut für Technologie Institut für Angewandte Informatik und Formale Beschreibungsverfahren Kaiserstr. 89 76133 Karlsruhe [email protected] Prof. Dr. Hartmut Schmeck Karlsruher Institut für Technologie Institut für Angewandte Informatik und Formale Beschreibungsverfahren Kaiserstr. 89 76133 Karlsruhe [email protected]

ISBN 978-3-11-041207-9 e-ISBN (PDF) 978-3-11-041208-6 e-ISBN (EPUB) 978-3-11-042387-7 Library of Congress Cataloging-in-Publication Data A CIP catalog record for this book has been applied for at the Library of Congress. Bibliografische Information der Deutschen Nationalbibliothek Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.dnb.de abrufbar. © 2016 Walter de Gruyter GmbH, Berlin/Boston Einbandabbildung: Wavebreakmedia Ltd/thinkstock Druck und Bindung: CPI books GmbH, Leck ♾ Gedruckt auf säurefreiem Papier Printed in Germany www.degruyter.com

Vorwort und Lesehinweise Die theoretische Informatik ist ein lebendiges Forschungsgebiet, das schöne und praxisrelevante Resultate hervorbringt. Von Studierenden wird sie dagegen vor allem am Anfang oft als schwieriges Fach wahrgenommen, das aufwendige Einarbeitung in trockene Formalismen erfordert. Das liegt vor allem daran, dass eine „kritische Masse“ an Verständnis nötig ist, um routiniert mit den theoretischen Konzepten umgehen zu können. Anfangs muss also viel Theorie gelernt werden, bevor irgendwann die Erleuchtung kommt. Aber muss das so sein? Kann man die theoretische Informatik nicht einfach ganz praktisch angehen? Na ja, Sie ahnen es. . . Obwohl es der Titel verspricht, ist Theorie eben nicht praktisch und soll es auch nicht sein – sonst hieße sie nicht Theorie. Aber theoretische Überlegungen haben (meist) einen praktischen Nutzen oder sie entstanden wenigstens ursprünglich aus der Notwendigkeit heraus, praktische Probleme zu lösen. Von da an verselbstständigen sie sich allerdings gerne und verschleiern ihren Praxisbezug im Lauf der Zeit immer mehr. Die paradoxe Situation in der Informatik ist, dass relativ viel Theorie nötig ist, um die praktische Relevanz dieser Theorie zu verstehen.¹ Zum Glück mag der Informatiker Paradoxes. (Wenn er etwas beweist, dann meist durch Widerspruch.) Wir werden daher trotz des vermeintlichen Widersinns versuchen, den Einstieg in die Theorie durch möglichst einleuchtende Bezüge zur Praxis zu erleichtern. Genauer gesagt heißt das, dass wir den praktischen Kern eines zu betrachtenden Konzepts darstellen werden, noch bevor das Konzept selbst überhaupt eingeführt wurde. Alle Facetten des Konzepts können durch diesen ersten unscharfen Eindruck natürlich noch nicht abgehandelt werden – und das lässt den strengen Formalisten gleich skeptisch werden. Aber die Grundideen intuitiv verstanden zu haben, macht es für Sie wesentlich einfacher, später den formalen Definitionen zu folgen. Anderenfalls kann es passieren, dass Studierenden erst nach mehreren Semestern des geduldigen Schluckens von Definitionen und Formeln der Sinn hinter manchen Konzepten zu dämmern beginnt. Der strenge Formalist hat allerdings nicht unrecht; theoretische Konzepte allzu praktisch zu zeichnen birgt immer die Gefahr von Missverständnissen. Eine praktische Sicht deckt sich nie exakt mit der Theorie (sonst wäre sie selbst Theorie), und weil sie oft intuitiver erscheint, zieht man sie gerne der formalen Wirklichkeit vor. Dabei tappen die meisten Studierenden jedoch glücklicherweise in dieselben typischen Fallen. Wir werden Ihnen helfen, diese Fallen zu umgehen, und zwar oft genug ein-

1 Relativ! Um die Kirche im Dorf zu lassen: Es gibt wesentlich schlimmere Gebiete als die theoretische Informatik. Die Aura des Schrecklichen speist sich vor allem aus Berichten Studierender, die mit falschen Erwartungen oder zu wenig Vorbereitung in Prüfungen versagten. Dieser beiden Probleme werden wir uns schon bald annehmen.

VI | Vorwort und Lesehinweise

fach mit dem Hinweis: „Vorsicht, das ist eine Falle!“ Trotzdem ist beim Übergang von der Praxis zur Theorie Vorsicht geboten; allgemein sollte nie vergessen werden, dass überall, wo intuitive und formale Perspektive auseinandergehen, kompromisslos die formale Version gilt, auch wenn die intuitive „intuitiver“ erscheint. Kurz gesagt, werden wir uns der theoretischen Informatik also ganz praktisch nähern, aber sobald sie erreicht ist, wird sie sich – was sonst? – als ganz und gar theoretisch erweisen. Sie werden aber zu dem Zeitpunkt schon in der Lage sein, gerade das an ihr zu schätzen. Nun kennen Sie die Theorie hinter dieser praxisorientierten Einführung; aber wie sollen Sie dieses Buch eigentlich lesen, um „möglichst viel daraus zu lernen“? Wir beantworten diese Frage zunächst auf typische Informatiker-Art (also so, dass der Beantwortungsprozess mehr wert ist als die eigentliche Antwort). Dabei nehmen wir übrigens eines der angekündigten „schönen Resultate“ vorweg, ohne dass Sie auch nur eine einzige Definition lernen mussten. (Und danach überlegen wir, wie Sie trotz der ersten unbefriedigenden – nicht ganz ernst gemeinten – Antwort durchaus konstruktiv an die Lektüre dieses Buches gehen können.)

Dieses Buch lesen – ein schwieriges Problem Betrachten wir einmal folgende drei Fragestellungen, die eigentlich drei Varianten eines einzigen Grundproblems sind: (1) Gibt es eine Art, dieses Buch zu lesen, sodass Sie nach der Lektüre in der Lage sind, Ihre Informatik-Grundlagenprüfung zu bestehen (Entscheidungsvariante)? (2) Wenn das möglich ist, wie gut ist die beste Note, die Sie erzielen können (Optimierungsvariante)? (3) Wie genau müssen Sie sich mit diesem Buch beschäftigen, um diese Bestnote zu erhalten (Konstruktionsvariante)? Wäre es nicht schön, wenn Sie zumindest die Entscheidungsvariante, am besten aber gleich die Konstruktionsvariante für sich beantworten könnten? Nun werden Sie sagen, dass das schon aus Mangel an Informationen nicht möglich ist, denn Sie wissen ja nicht, wie die Prüfung aussehen wird, und Sie wissen auch nicht, was genau Sie in diesem Buch erwartet. Dann sagen wir eben, Sie dürfen das Buch beliebig intensiv durcharbeiten und die Prüfung beliebig oft wiederholen (Sie vergessen natürlich nach jedem Versuch die Prüfungsaufgaben wieder, sonst wäre es langweilig). Dann müssten diese Fragen doch zu beantworten sein. . . Unter Umständen ja, denn vielleicht ist das Buch toll, Sie schreiben auf Anhieb eine 1,0 und alle drei Fragen sind auf einmal beantwortet. Oder aber das Buch und die Prüfung passen ganz und gar nicht zusammen, und Sie sehen sofort, dass die Lektüre Ihnen auf keinen Fall beim Bestehen helfen kann; auch dann könnten Sie die Fragen beantworten, nur eben negativ. Das sind

Vorwort und Lesehinweise |

VII

die beiden typischen einfachen Randbereiche algorithmischer Probleme, für die wir „auf den ersten Blick“ die Lösung sehen. Was aber, wenn das Buch in Ordnung zu sein scheint und Sie nach x Versuchen trotzdem nicht in der Lage waren, die Prüfung zu bestehen? Oder Sie haben nach y Versuchen höchstens eine 1,7 erhalten, würden aber gerne noch eine bessere Note schaffen? Gibt es eine Chance, irgendwann mit Sicherheit sagen zu können, dass es nicht mehr besser werden wird? Als Mensch würden Sie vermutlich irgendwann aufgeben und sich mit dem bisher erreichten zufriedengeben. Aber nehmen wir an, Sie wären sehr ehrgeizig und müssten (wie ein Computer) das Problem unbedingt lösen. Sie tüfteln mit komplizierten mathematischen Formeln herum, analysieren den Inhalt des Buches und Ihre eigenen Charaktereigenschaften, und nach einer Weile sind Sie tatsächlich der Meinung, einen Beweis gefunden zu haben, dass Sie niemals bestehen werden. (Etwa weil Sie bisher nicht bestanden haben, und es neurologisch nicht möglich ist, noch mehr Wissen in Ihren Kopf zu bekommen.) Es war nicht einfach, Sie sind weder dumm noch schlau genug, das Buch weder gut noch schlecht genug, damit das Problem in einen der überschaubaren Randbereiche fällt – aber zuletzt ist Ihnen eine längliche Argumentation eingefallen, die eindeutig zeigt, dass Sie immer durchfallen müssen. Nun haben Sie sich aber bereits für einen weiteren Prüfungstermin angemeldet, und spaßeshalber gehen Sie ein letztes Mal hin. Sie erhalten den Prüfungsbogen, auf dem nur eine einzige Aufgabe steht: „Beweisen Sie, dass Sie nicht in der Lage sind, diese Prüfung zu bestehen.“ Toll, denken Sie, das kann ich! Sie schreiben Ihren Beweis hin und. . . bestehen. – Oder. . . ? Müsste Ihr Beweis dann nicht falsch gewesen sein? Aber wie können Sie mit einem fehlerhaften Beweis bestanden haben? Oder Sie bestehen eben nicht, weil Ihr Beweis falsch war. Darin liegt kein Widerspruch, aber wie man es dreht, der Beweis kann auf keinen Fall korrekt gewesen sein. Es kann so einen Beweis prinzipiell nicht geben! Wir schlussfolgern daher, dass keine der eingangs gestellten Fragen – nicht einmal die Entscheidungsvariante – allgemein beantwortet werden kann. Sie glauben, niemand würde so eine gemeine Prüfungsfrage stellen? Ein Informatiker schon! Viel mehr als die auf Sie persönlich bezogenen Eingangsfragen interessiert ihn nämlich die Meta-Frage: ob diese Fragen überhaupt von „irgendwem“ allgemein beantwortet werden können. Der Beweis, um den es ging, war also nicht der, den Sie zu führen glaubten, sondern der, der zeigt, dass Sie mit Ihrem Beweis gescheitert sein müssen. Normalerweise untersuchen wir natürlich nicht die Problemlösefähigkeit von Menschen, sondern die von (anderen) „Rechnern“. Die wichtige Schlussfolgerung ist daher, dass kein Rechner in der Lage ist, ein Problem zu lösen, das in der obigen Art gestellt ist. Das ist eine wichtige Erkenntnis, denn wenn es Rechner gäbe, die alles berechnen könnten, was wir uns vorstellen können, würden große Bereiche der theoretischen Informatik einfach wegfallen. Den Kerngedanken, der im Beispiel den angeblichen Beweis zum Widerspruch führte, hat bereits der Informatik-Pionier Alan Turing entwickelt: Es geht darum, den

VIII | Vorwort und Lesehinweise

Rechner selbst (rekursiv) zum Teil des Problems zu machen. Wird eine Frage, wie „Kann ich, der Rechner, beweisen, dass ich (nicht) in der Lage bin, dies und das zu tun?“, geschickt gestellt, kann sie zu einem Widerspruch geführt werden, und man erhält als Ergebnis algorithmisch nicht lösbare Probleme. Unser obiges (direkt aus dem Leben gegriffenes) unlösbares Problem war: „Kann ich als Mensch beweisen, dass ich (nicht) in der Lage bin, eine gewisse Art von Prüfungen zu bestehen – egal wie die konkrete Prüfung aussieht?“ Turing zeigte auf eine ganz ähnliche Art, dass Rechner nicht in der Lage sind zu entscheiden, ob ein Programm anhalten oder endlos weiterlaufen wird. Diese einfache Idee war der Beginn aller Berechenbarkeits- und Komplexitätsbetrachtungen, welche inzwischen zu den Königsdisziplinen der theoretischen Informatik gehören. Bevor wir uns mit ihnen in den Kapiteln 6 und 7 formal befassen, muss noch etwas Vorarbeit geleistet werden – aber einige wichtige Grundgedanken haben Sie gerade schon kennengelernt.

Was steckt in diesem Buch und wie holt man es heraus? Der gerade geführte „Beweis“ ist nur in Grenzen auf die Menschenwelt übertragbar. Es gibt wohl viele Prüfungssituationen (hoffentlich auch Ihre anstehende), auf die er nicht angewendet werden kann. Daher sollten Sie sehr wohl versuchen, für sich den bestmöglichen Weg zu finden, um sich vorzubereiten. Dafür ist es zunächst wichtig zu wissen, für welche Zielgruppe das Buch überhaupt geschrieben wurde. Es gibt viele gute Lehrbücher zur theoretischen Informatik, und einige davon werden in diesem Buch auch rege referenziert². Schwierig ist es allerdings, Bücher zu finden, die auch für Anfänger gut geeignet sind. Das liegt an der schon erwähnten „kritischen Masse“ an theoretischem Vorwissen: Es gibt keine „Theorie light“, die „nicht so sehr in die Tiefe geht“; eine gewisse Mindesttiefe ist immer erforderlich, um überhaupt etwas zu verstehen. Meist wird dieses Vorwissen entweder als bekannt vorausgesetzt oder die Konzepte müssen zunächst mehr oder weniger neutral zur Kenntnis genommen werden, bevor sich manchmal erst viel später ihr Zweck erschließt. Hier wagen wir den Versuch, von Anfang an zu jedem Konzept den Praxisbezug gleich mitzuliefern, damit die Theorie nicht im leeren Raum stehen muss. Wir holen dafür ein bisschen weiter aus als es andere Lehrbücher tun, und manches wird doppelt beschrieben – einmal salopp und informell, einmal präzise und formal. Dieser doppelte Blick aus verschiedenen Perspektiven vertieft aber das Verständnis für den Stoff – solange die erwähnten Praxisfallen erfolgreich umgangen werden. Als weiterer Vorteil entsteht auf diese Weise ein natürlicher roter Faden, der sich nicht nur mathematisch, sondern auch konzeptuell von Beginn an durch die dargestellten Ideen zieht.

2 Als Standardwerk ist vor allem das Buch „Einführung in Automatentheorie, Formale Sprachen und Berechenbarkeit“ von Hopcroft, Motwani und Ullman zu erwähnen [HMU11].

Vorwort und Lesehinweise |

IX

Darüber hinaus versuchen wir, die typischen Verständnisprobleme – von denen es eine ganze Reihe gibt – direkt anzusprechen und aus dem Weg zu räumen. Um eilige Leser nicht zu bremsen, werden solche Zusatzinformationen meist klar vom Haupttext abgetrennt, sodass sie auch übersprungen werden können (vgl. e iπ Fallen, Exkurse etc. weiter unten). Eine wichtige Quelle von Verständnisproblemen sind eigentlich einfache Gedankengänge, die aber durch einen ungewöhnlichen Widerspruch (wie beim oben geführten „Beweis“) oder durch eine gerade umgekehrte Sicht auf eine logische Aussage unintuitiv werden. So sei schon jetzt als Warnung gesagt, dass es bei logischen Implikationen A ⇒ B fast nie darum gehen wird, aus der Gültigkeit von A zu folgern, dass auch B gilt. Aus irgendeinem Grund folgert der Informatiker so gut wie immer anders herum: dass die Nicht-Gültigkeit von B zur Nicht-Gültigkeit von A führt. Behält man das im Kopf, entstehen viele Missverständnisse erst gar nicht. Es gibt in der theoretischen Informatik auch exotische Bereiche, die schwer in Bezug zu (heutigen) realen Anwendungen zu setzen sind; solche Themen werden wir weitgehend aussparen. Aber auch innerhalb der unvermeidbaren Mindesttiefe (Sie werden sehen, dass wir durchaus die Tiefe der üblichen Standardwerke erreichen werden³) muten manche Themen der Berechenbarkeits- und Komplexitätstheorie recht exotisch an. Auch diese Themen werden möglichst anfängertauglich präsentiert, aber dennoch wird es für jeden, der sich das erste Mal damit beschäftigt, nötig sein, diese Kapitel sorgfältig zu lesen, womöglich manches mehrfach. Vielleicht werden Sie im Verlauf des Lernprozesses mehrmals denken, dass Sie es verstanden haben, dann aber doch neue Nuancen entdecken, die Sie übersehen hatten. Wenn diese Erleuchtung so in etwa das dritte oder vierte Mal aufgetreten ist, haben Sie es wirklich verstanden. Nichtsdestotrotz sind gerade die Themen Komplexität und Berechenbarkeit von großer praktischer Bedeutung für die Informatik. Sie können helfen, im Alltag viel Zeit zu sparen, indem sie einerseits besonders effiziente Algorithmen liefern, oder andererseits durch Negativaussagen, wie „besser als wir das sowieso schon tun, geht es gar nicht“ unnötiges Optimieren verhindern. In einem gewissen Sinne kann man die „handfesteren“ Themen, wie Automaten und Grammatiken, lediglich als Werkzeuge betrachten, die benötigt werden, um eine Komplexitäts- und Berechenbarkeitstheorie zu formulieren. Positiv formuliert heißt das aber auch, dass Sie, wenn Sie die handfesten Themen gründlich verstanden haben, schon einen wesentlichen Teil des Weges zum Verständnis der Komplexitäts- und Berechenbarkeitstheorie gegangen sind.

3 Mit einer Ausnahme: Wir werden nicht alle Beweise bis ins letzte Detail formal ausführen, sondern stattdessen versuchen, umso ausführlicher die zentralen Ideen darzustellen.

X | Vorwort und Lesehinweise

Die e iπ -Falle: Ein Wegweiser für Gefahrenstellen Aus den Überlegungen zur Mindesttiefe geht hervor, dass jedes Buch über theoretische Informatik (wenn es nicht gerade Tausende Seiten lang oder sehr oberflächlich ist), Aussagen oder Schlussfolgerungen enthalten muss, die beim ersten Lesen nicht sofort verständlich sind. Typischerweise verstecken sich solche schwierigen Stellen in einer Kette einfach nachzuvollziehender Argumentationsschritte, weshalb sie im Lesetrott leicht übersehen werden. Dadurch bleibt oft ausgerechnet der Knackpunkt einer Argumentation unbeachtet, der für das Verständnis des Themas am wichtigsten gewesen wäre. In einem Comic aus der „xkcd“-Reihe (http://xkcd.com/179) zeigt der Zeichner Randall Munroe diese Eigenheit mathematischer Argumentationsketten am Beispiel der eulerschen Identität. Gegeben sei etwa die folgende Aussagenliste, die (hoffentlich so nicht) aus einem Mathematikbuch der Oberstufe stammen könnte: 1) Die Kreiszahl π bezeichnet den Umfang des Einheitskreises und hat einen Wert von etwa 3,1415927. 2) Die Basis des natürlichen Logarithmus ist die irrationale Zahl e ≈ 2,7182818. √ 3) Die imaginäre Konstante i = −1 wird eingeführt, um mit Wurzeln negativer Zahlen rechnen zu können. 4) Daraus ergibt sich die eulersche Identität als: e iπ = −1.

e iπ

Die ersten drei Aussagen werden die meisten Leser kennen und beim Lesen einfach abnicken. Die vierte Aussage ist jedoch alles andere als trivial und ergibt sich nur sehr indirekt aus den vorherigen. Trotzdem erwischt man sich in der Routine des Abnickens schnell dabei, auch diese komplizierte Formel innerlich ad acta zu legen, ohne ihre Herleitung wirklich verstanden zu haben. In diesem Buch werden solche versteckten verständnisintensiven Stellen als e iπ -Fallen bezeichnet. Natürlich würde ein gutes Lehrbuch die obige Aussagenliste um viele Zwischenschritte erweitern. Trotzdem sind einige davon eingängiger und andere erfordern einen größeren geistigen Aufwand. Um die Selbstkontrolle beim Lesen zu erleichtern, werden wir das folgende Symbol am Seitenrand verwenden, um Stellen zu kennzeichnen, die erfahrungsgemäß gerne als Knackpunkte übersehen werden: 4) Daraus ergibt sich die eulersche Identität als: e iπ = −1.

e iπ

Wenn Sie auf dieses Symbol stoßen, sollten Sie sich vergewissern, dass Sie den entsprechenden Argumentationsschritt, der oft eine Hauptschwierigkeit für das Verständnis darstellt, begriffen und nicht einfach nur abgenickt haben.

In so einem Kasten wird eine genauere Erklärung der Falle oder ein Hinweis zu ihrer Vermeidung gegeben.

Vorwort und Lesehinweise |

XI

Wir werden die Kästen auch verwenden, um gefährlich anschauliche Beispiele oder besonders heimtückische Praxisvergleiche zu kennzeichnen. Allzu „knackige Beispiele“ und allzu „typische praktische Anwendungen“ neigen nämlich dazu, wesentliche Aspekte der eigentlichen Aussage zu verschleiern; das liegt nicht am Beispiel selbst, sondern am Leser, der hofft aus dem Beispiel schon die ganze Vielfalt einer Idee ablesen zu können – was nur selten der Fall ist. Trotzdem werden wir Beispiele und Praxisbezüge großzügig verwenden, aber dabei stets im Hinterkopf behalten, dass die gesamte Fülle einer mathematischen Aussage nicht durch Beispiele erschlossen werden kann – und ihrem Wesen nach nicht praktisch ist. Außerdem wird es neben der normalen e iπ -Box hier und da einen Exkurs-Kasten mit weiterführenden Informationen geben, der für das Verständnis der Grundidee nicht unbedingt notwendig ist, aber die Details noch etwas gründlicher beleuchtet.



Das große „∃“-Symbol wurde als Kennzeichnung der Exkurs-Kästen gewählt, weil es einerseits für das E aus Exkurs steht und andererseits dafür, dass so ein Kasten nicht „∀“ – für alle Leser ist. Andererseits sind die Exkurse aber oft nichts anderes als etwas tiefgreifendere e iπ -Boxen. Es kann also sicher nicht schaden, sich auch mit ihnen zu beschäftigen.

Nutzung der Skripte und des XWizard-Werkzeugs XWizard ist der Name eines Programms, mit dem viele der theoretischen Konzepte aus dem Buch – ganz praktisch – visualisiert und bearbeitet werden können. Es ist im Rahmen der Lehrveranstaltungen entstanden, an denen die Autoren beteiligt sind, und kann als Web-Version einfach über folgende Adresse erreicht werden:

www.xwizard.de

Darüber hinaus existiert eine fast funktionsgleiche Download-Version, die für Windows vorkompiliert oder als vollständiger Java-Quellcode mit Dokumentation heruntergeladen werden kann:

www.dasinfobuch.de/links/vfp

XII | Vorwort und Lesehinweise

Der XWizard arbeitet mit sogenannten Skripten, die vom Benutzer eingegeben und vom Programm in eine graphische Darstellung übersetzt werden. Skripte sind also Texte, die ein Objekt, beispielsweise einen Kellerautomaten, eine Grammatik oder einen regulären Ausdruck beschreiben. Das zu einem Skript gehörende Objekt kann einfach angezeigt oder durch Konversionsmethoden in ein neues Skript überführt werden. Zum Beispiel kann ein Kellerautomat durch eine Konversionsmethode schrittweise simuliert werden, indem im Skript die Variable für das Simulieren hochgezählt wird (Kellerautomaten werden im Buch in Kapitel 2.3 behandelt). Oder ein endlicher Automat kann durch eine Konversionsmethode minimiert werden, indem ein neues Skript erzeugt wird, das für den minimierten Automaten steht (die Minimierung endlicher Automaten finden Sie in Kapitel 2, ab Seite 72). Werden im Buch Konzepte behandelt, die im XWizard bearbeitet werden können, wird immer auch das zugehörige Skript und ein Link zur Web-Version angegeben. Beispielsweise könnte folgende Darstellung einer Grammatik im Buch auftauchen: G = ({X}, {Bedienung, Beispiel, XWizards, des, dies, ein, ist, zur}, P, X) P ={X → Bedienung ∣ Beispiel ∣ XWizards ∣ des ∣ dies ∣ ein ∣ ist ∣ zur ∣ XX} 



































 



 



  

DAR-01 | ID-16356 → Skript: S. 385

Vorwort und Lesehinweise |

XIII

Unter der Abbildung steht zunächst eine eindeutige Nummer der Darstellung (hier „DAR-01“), welche über das ganze Buch fortlaufend hochgezählt wird. Danach folgt eine sogenannte XWizard! Skript-ID (hier „ID-16356“) und zuletzt ein Verweis auf die Seite in Anhang B, wo das Skript selbst und weitere Informationen abgedruckt sind. Ein Skript kann auf verschiedene Arten in den XWizard geladen werden: (1) In Anhang B ist ein zum Skript gehörender QR-Code abgedruckt. Wird er eingescannt, wird automatisch die XWizard-Website aufgerufen und das Skript geladen. Für die obige Beispieldarstellung wäre das folgender QR-Code:

(2) Auf der XWizard-Website kann die Skript-ID auch direkt in das Eingabefeld eingetragen werden; nach einem Klick auf „Draw!“ wird das Skript geladen. (3) Zuletzt ist im Anhang auch noch das komplette Skript abgedruckt, das sowohl in der Web- als auch in der Download-Version des XWizards in das Eingabefeld eingetragen werden kann (Skript-IDs funktionieren dagegen nur bei der WebVersion). Damit das Skript nicht vollständig abgetippt werden muss, sind alle Skripte auch unter der im Anhang angegebenen Adresse online abrufbar. Normalerweise sind die Optionen (1) und (2) am bequemsten, um ein Skript zu laden. Option (3) ist eher als Backup-Lösung zu sehen, falls keine Internetverbindung verfügbar oder der Server nicht erreichbar sein sollte. Der XWizard bietet zahlreiche Möglichkeiten, um die vorgegebenen Objekte weiter zu verarbeiten. So können aus Grammatiken Normalformen erzeugt, endliche Automaten deterministisch gemacht, Automaten und Grammatiken ineinander überführt werden und vieles mehr. All diese Funktionen werden auf den umfangreichen Hilfeseiten des XWizards beschrieben, die über den Link „Hilfe“ auf www.xwizard.de erreichbar sind. Darüber hinaus gibt es dort zwei PDF-Dokumente mit detaillierten Beschreibungen der Arbeitsweise des XWizards. Wir werden die Arbeit mit dem XWizard oft dem Selbststudium überlassen, manchmal aber auch im Text konkrete Hinweise geben, wie die Ausgabe zu interpretieren ist oder welche Funktionen zum jeweiligen Thema passen. Diese Hinweise werden in solchen Kästen gegeben: Versuchen Sie einmal, die oben angegebene Grammatik mit dem XWizard in die Greibach-Normalform zu überführen. (Diese Normalform wird im Buch ab Seite 239 behandelt; Sie müssen sie aber nicht verstanden haben, um diese Miniaufgabe zu lösen.)

XIV | Vorwort und Lesehinweise

In vielen Fällen kann der XWizard helfen, die im Buch dargestellten Konzepte genauer unter die Lupe zu nehmen und bei eventuell auftauchenden Verständnisschwierigkeiten Klarheit zu schaffen. Bleiben Fragen offen, kann das von der Website aus verlinkte Forum zum Diskutieren genutzt werden. Auch zu Übungszwecken lohnt es sich, den XWizard regelmäßig zu verwenden, denn theoretische Feinheiten gehen erst durch häufige Wiederholungen in Fleisch und Blut über. Der XWizard wird in diesem Buch als wichtiges Bindeglied zwischen Theorie und Praxis angesehen und entsprechend häufig referenziert.

Übungsaufgaben Natürlich gehören als weiteres Bindeglied zwischen Theorie und Praxis eine Menge Übungsaufgaben zu einem Gesamtpaket der theoretischen Informatik. Um jedoch eine repräsentative Auswahl an Aufgaben in diesem Buch bereitzustellen, wäre wohl eine Verdopplung der Seitenzahl nötig gewesen. In Anbetracht der vielen aus Vorlesungen, dem Internet und speziellen Übungsbüchern verfügbaren Übungsaufgaben, erschien die entsprechende Erhöhung des Preises bei einer Verminderung der Flexibilität (zu schweigen von der Abschreckung der Leser) nicht angemessen. Daher werden Sie in diesem Buch eher Beispiele finden, die gleich mit umfassenden Erklärungen durchgerechnet werden. Außerdem wird jedes Kapitel durch fünf Fragen zur Selbstkontrolle abgeschlossen, mit welchen Sie prüfen können, ob Sie die wesentlichen Inhalte verstanden haben. (Warum fünf? Drei wären zu wenige gewesen und sieben schon wieder zu viele; vier oder sechs wären vielleicht noch im Rahmen gewesen, aber fünf ist eine Primzahl.) Diese fünf Fragen sind nicht mit einem Wort zu beantworten, sondern sollen zu einer möglichst umfassenden Rekapitulation des Stoffs anregen. Daher werden dazu auch keine Musterlösungen angeboten; vielmehr sollte die Lösung im Selbststudium bzw. in der Diskussion mit anderen erarbeitet werden. Um diesen Prozess zu erleichtern, wird im Anschluss an die Kontrollfragen jeweils auf ein Online-Forum verwiesen, wo Lösungsansätze oder sonstige Themen zur Diskussion gestellt werden können. Die Auswahl weiterer Aufgaben zur Prüfungsvorbereitung wird im Prinzip der Leserin oder dem Leser selbst überlassen. Wird das Buch begleitend zu einer Vorlesung verwendet, werden Übungsaufgaben normalerweise ohnehin bereitgestellt. Wer allerdings Aufgaben aus demselben Guss sucht, sei verwiesen auf das Übungsbuch 100 Übungsaufgaben zu Grundlagen der Informatik, Band I: Theoretische Informatik das ebenfalls der Feder der Autoren dieses Lehrbuchs entsprungen ist [KPBS14]. Zur besseren Orientierung werden zum Abschluss jedes Kapitels die passenden Aufgaben aus diesem Buch in einer Exkurs-Box referenziert; ob Sie diese oder andere Aufga-

Vorwort und Lesehinweise |

XV

ben verwenden, bleibt aber Ihnen überlassen. Für weitere Informationen gibt es auch einen kleinen Webauftritt für dieses Lehrbuch und die beiden Bände der „100 Übungsaufgaben zu Grundlagen der Informatik“ unter folgender Adresse:

www.dasinfobuch.de

Wir wünschen Ihnen nun viel Erfolg und Freude bei Ihrer persönlichen, ganz praktischen Widerlegung der These, dass Sie die Informatik-Grundlagenprüfung nicht bestehen können!

Danksagung Die Autoren danken für das Durchsehen der Texte hinsichtlich Grammatik und Stil sowie für kreative Hinweise aller Art (und auch für aufmunternde Worte in geistigen Dürreperioden) Marlon Braun, Christian Hirsch, Fabian Kern, Anna Mauser, Ingo Mauser, Johannes Müller, Fabian Rigoll, Sebastian Steuer, André Wiesner und Micaela Wünsche. Karlsruhe, Juli 2016 Lukas König, Friederike Pfeiffer-Bohnen, Hartmut Schmeck

Inhalt Vorwort und Lesehinweise | V 1 1.1 1.2 1.3

Auf dem Weg zur theoretischen Informatik | 1 Information: der Stoff der Informatik | 2 Formale Sprachen, Funktionen und Probleme | 9 Zusammenfassung | 20

2 2.1 2.2 2.3 2.4 2.5

Deterministische Automaten | 23 Turingmaschinen | 24 Linear beschränkte Turingmaschinen (LBA) | 45 Kellerautomaten | 47 Endliche Automaten | 65 Zusammenfassung | 92

3 3.1 3.2 3.3 3.4 3.5

Nichtdeterminismus: Ratende Automaten? | 99 Nichtdeterminismus bei Turingmaschinen | 102 Nichtdeterminismus bei LBA | 116 Nichtdeterminismus bei Kellerautomaten | 117 Nichtdeterminismus bei endlichen Automaten | 125 Zusammenfassung | 136

4 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8

Grammatiken und die Chomsky-Hierarchie | 143 Allgemeine Grammatiken (Chomsky-Typ 0) | 155 Kontextsensitive Grammatiken (Chomsky-Typ 1) | 161 Monotone Grammatiken (noch einmal Chomsky-Typ 1) | 167 Kontextfreie Grammatiken (Chomsky-Typ 2) | 170 LR(k)-Grammatiken (eine Zwischenstufe) | 180 Rechtslineare Grammatiken (Chomsky-Typ 3) | 183 Grammatiken mit endlicher Auswahl (Chomsky-Typ 4?) | 190 Zusammenfassung | 192

5 5.1 5.2 5.3 5.4

Weitere strukturelle Eigenschaften der vorgestellten Sprachklassen | 197 Reguläre Ausdrücke (Chomsky-Typ 3) | 199 Die Pumping-Lemmata (Chomsky-Typen 2 und 3) | 207 Normalformen für Grammatiken | 227 Zusammenfassung | 250

6 6.1

Berechenbarkeitstheorie | 255 Was „empfinden“ wir als berechenbar? | 257

XVIII | Inhalt

6.2 6.3 6.4 6.5 6.6

Formalisierung der Berechenbarkeit durch Turingmaschinen | 265 Die Turingmaschine als universeller Rechner | 268 Eigenschaften (semi-)entscheidbarer Sprachen | 286 Reduzierbarkeit: zur relativen Schwierigkeit von Problemen | 302 Zusammenfassung | 309

7 7.1 7.2 7.3 7.4 7.5 7.6

Komplexitätstheorie | 313 Wie misst man die Komplexität von Problemen? | 315 Die Klassen P und NP | 325 Die Klassen NP-schwer und NP-vollständig | 331 Wie findet man NP-vollständige Probleme? | 340 Weitere Problemklassen und Reduktionen | 363 Zusammenfassung | 372

A A.1 A.2 A.3 A.4 A.5 A.6

Mathematische Grundlagen | 377 Mengen und Funktionen | 377 Graphen | 378 Alphabete, Zeichen, Wörter und Sprachen | 379 Landau-Notation | 380 Kodierung | 381 Klassifizierung von Sprachen | 383

B

Skripte | 385

Literaturverzeichnis | 403 Stichwortverzeichnis | 407

1 Auf dem Weg zur theoretischen Informatik Die theoretische Informatik stellt, wie aus dem Namen hervorgeht, die theoretischen Grundlagen für die praktische Informatik dar. Ihr Ziel ist es also, die tägliche Arbeit in vielen Bereichen der Informatik zu strukturieren und dadurch zu erleichtern.

Die „Informatik“ als Gebiet ist alles andere als homogen. Man kann sie aus ihrer Entstehungsgeschichte heraus als Teilgebiet der Mathematik betrachten, durch eine Auflistung ihrer Teildisziplinen beschreiben oder sie nach ihrem theoretischen Nutzen erfassen – etwa als den „machbaren Teil der Mathematik“. Wir werden uns hier der Informatik einerseits begrifflich als der „Wissenschaft der Informationen“ nähern, andererseits aber auch pragmatisch feststellen, dass sich der Informatiker typischerweise mit gewissen Dingen beschäftigt. Dazu gehören etwa das Programmieren von Software, Apps, WebApplikationen usw., das Entwerfen von Hardware, der Aufbau von Rechnernetzen usw. usf. Die meisten dieser Tätigkeiten können auf einen gemeinsamen Kern zurückgeführt werden: das Lösen einer bestimmten Art mathematischer Probleme. Anhand dieser Tätigkeiten werden wir überlegen, was die theoretische Informatik als Disziplin leisten soll.

Eine wichtige Aufgabe der theoretischen Informatik ist zunächst die Formalisierung der elementaren Begriffe, die bei der Arbeit eines Informatikers auftreten, etwa: – Rechner, Rechnung, berechenbar, – Algorithmus, – Problem, – Komplexität, – Effizienz, – ... Sind solche Formalisierungen vorhanden, dann ist der nächste Schritt, mathematische Lösungen für Fragestellungen zu erarbeiten, mit denen Informatiker konfrontiert werden. Dabei handelt es sich beispielsweise um Fragen, wie: „Kann ein gegebenes Problem unter gewissen Randbedingungen (etwa in einer bestimmten Zeit) auf einem Rechner gelöst werden?“ Um zu verstehen, welche Elemente, Prozesse und Fragestellungen die theoretische Informatik untersuchen soll, wollen wir im Folgenden erschließen, womit sich die Informatik im Kern überhaupt beschäftigt, und überlegen nebenbei, welche Schritte bei einer Formalisierung nützlich sein könnten.

e iπ

2 | 1 Auf dem Weg zur theoretischen Informatik

1.1 Information: der Stoff der Informatik

e iπ

Die Informatik ist vom Begriff her und auch ihrem Ursprung nach die Wissenschaft vom automatischen Umgang mit Informationen. Wir überlegen zunächst, was „Informationen“ sind und danach, wie man „automatisch mit ihnen umgehen“ kann und was das mit Rechnen und Computern (im englischsprachigen Raum redet man von „Computer Science“) zu tun hat. Unter Informationen (auch Daten), verstehen wir zunächst sehr allgemein etwas, das mit dem Ziel erzeugt wurde, Wissen zu enthalten und dieses von einem Sender an einen Empfänger zu übermitteln.

Heute wird im Bereich von Big Data diese Definition sogar noch weiter gefasst. Daten werden hier gesammelt, ohne dass im Vorfeld bekannt ist, wie sie später genutzt werden sollen. Begriffe wie Sender, Empfänger oder sogar Inhalt müssen dann sehr flexibel aufgefasst werden. Diese flexible Sicht widerspricht den klassischen Definitionen prinzipiell nicht und soll uns im Folgenden nicht stören.

e iπ

Eine Flaschenpost etwa könnte eine Information sein, die Wissen über den Aufenthaltsort eines Schiffbrüchigen (Sender) an einen potentiellen Retter (Empfänger) übermitteln soll. In diesem Beispiel wird die Flasche nicht an einen bestimmten sondern an irgendeinen Empfänger geschickt; sie könnte unter Umständen eine weite Strecke vom Sender zum Empfänger zurücklegen und dabei eine lange Zeit benötigen. Sowohl Wegstrecke als auch Zeitdauer können aber auch ganz andere Größenordnungen annehmen. So können Sender und Empfänger ein und dieselbe Person sein, etwa wenn jemand Tagebuch schreibt und somit Informationen an sich selbst in der Zukunft sendet. Dasselbe gilt in einer kürzeren Zeitperiode für jemanden, der sich notiert: „Nicht vergessen, Oma vom Flughafen abholen“. Wie im letzten Beispiel dienen in der Informatik Informationen grundsätzlich dazu, Entscheidungen in der Gegenwart von Wissen aus der Vergangenheit abhängig zu machen. Ein wichtiger Spezialfall dieses Grundsatzes ist das Merken von Zwischenschritten in Rechnungen. Wenn wir beispielsweise das aus der Schule bekannte Vorgehen zum schriftlichen Addieren von Zahlen betrachten, sind sowohl die zu Beginn übereinanderstehenden Summanden als auch eventuell zu merkende Überträge und natürlich auch das schrittweise entstehende Ergebnis in diesem Sinne Informationen (die Summanden nennen wir Eingabe, die entstehende Summe Ausgabe der Rechnung). Informationen ermöglichen an einem bestimmten Punkt der Rechnung Rückschlüsse auf die Vergangenheit und eine damit verbundene Anpassung der künftigen Aktionen. Wenn beispielsweise im vorherigen Schritt ein Übertrag entstanden ist, beeinflusst das die Berechnung der nächsten Ziffer.

1.1 Information: der Stoff der Informatik | 3

Für einen Informatiker ist das Merken von Zwischenschritten in Rechnungen oft sogar ein und dasselbe wie der Grundsatz, Entscheidungen in der Gegenwart von Wissen aus der Vergangenheit abhängig zu machen. Die Essenz des Rechnens besteht für ihn darin, Zeichenketten (die Träger der Information) hintereinander aufzuschreiben und zu verändern, wobei jede Veränderung nach gewissen Regeln (diese Regeln liegen später dem Begriff des Algorithmus zugrunde) von der vorherigen Zeichenkette abhängt. So kann Wissen aus der Vergangenheit genutzt werden, um eine Entscheidung in der Gegenwart zu beeinflussen. Am Anfang einer Rechnung steht eine Zeichenkette, die (bzw. deren Interpretation nach gewissen Vereinbarungen) die Eingabe darstellt, und an ihrem Ende eine weitere Zeichenkette, die für das Rechenergebnis bzw. die Ausgabe steht. Das – und nicht mehr – ist die (intuitive) Definition einer Rechnung in der Informatik. Jeder, der sich Notizen macht, führt also fast schon eine Rechnung durch.

Ein Prozess, der ein eindeutig definiertes Verfahren, wie das eben beschriebene Additionsverfahren, auf eine Eingabe anwendet, um eine Ausgabe zu erzeugen, führt eine Informationsverarbeitung oder eine Rechnung durch. Ein solches Verfahren ist im Wesentlichen das, was als Algorithmus bezeichnet wird. Ein Algorithmus liefert eine (möglichst formale) Beschreibung der Regeln, nach denen Zeichenketten im Lauf einer Rechnung verändert werden müssen, um von einer Eingabe auf eine gewünschte Art der Ausgabe zu kommen. Im obigen Beispiel des schriftlichen Addierens muss der Algorithmus dafür sorgen, dass für alle Eingabe-Zeichenketten, die als die Kodierung zweier Zahlen interpretiert werden können, im Verlauf der Rechnung eine Ausgabe-Zeichenkette entsteht, die als die Kodierung der Summe der beiden Zahlen interpretiert werden kann. (Zum Begriff Kodierung vgl. Anhang A.5.) Diese Eigenschaft von Algorithmen, eine Eingabe in eine Ausgabe zu überführen (und zwar dieselbe Eingabe üblicherweise immer in dieselbe Ausgabe) führt dazu, dass ein Algorithmus als mathematische Funktion aufgefasst werden kann: Die Eingabe-Zeichenkette ist das Urbild, welches auf die Ausgabe-Zeichenkette, die Bild bzw. Funktionswert darstellt, abgebildet wird. Über „normale“ Definitionen mathematischer Funktionen hinaus hat ein Algorithmus außerdem die wichtige Eigenschaft, dass er den Weg vom Urbild zum Bild gleich mitliefert. Wir müssen ihn (bzw. die durch ihn festgelegten Regeln zur Veränderung von Zeichenketten) ja nur anwenden, und die Funktion wird berechnet. Beispielsweise könnte eine „normale“ Definition einer Funktion p, die für eine ganze Zahl genau dann wahr ausgibt, wenn es sich um eine Primzahl handelt, etwa so aussehen: ⎧ ⎪ ⎪wahr, p∶ N → B∶ p(n) =def ⎨ ⎪ ⎪ ⎩falsch

falls n > 1 und ∀k, m ∈ N ∶ km = n ⇒ k, m ∈ {1, n} sonst

4 | 1 Auf dem Weg zur theoretischen Informatik

Diese Definition spiegelt korrekt die Prim-Eigenschaft von Zahlen wider, sie sagt aber nichts (oder wenig) darüber aus, wie der Funktionswert berechnet werden kann. Ein Algorithmus für p könnte dagegen so aussehen: Interpretiere die Eingabe-Zeichenkette als natürliche Zahl n. Wenn n=0 oder n=1 gilt, gib „falsch“ aus. Wenn nicht, überprüfe für alle i von 2 bis Wurzel(n): Ist n durch die aktuelle Zahl i teilbar? Gib „falsch“ aus und beende den Programmablauf. Gib „wahr“ aus.

e iπ

Dieser Algorithmus ist nur umgangssprachlich angegeben, aber mit etwas gutem Willen versteht man ihn und kann ihn dazu nutzen, für eine gegebene Zahl den Funktionswert zu berechnen. Dies ist ebenfalls eine Definition der Funktion p, und sie ist insofern mehr wert als die vorherige, als sie gleich eine mögliche Berechnungsart für p mitliefert. Jeder Algorithmus definiert damit insbesondere nicht irgendeine Funktion, sondern eine berechenbare Funktion. (Nicht jeder Algorithmus hält allerdings für alle Eingaben nach endlicher Zeit an. Die Möglichkeit von Endlosschleifen muss bei der Frage nach der Berechenbarkeit von Funktionen speziell berücksichtigt werden.) An dieser Stelle zeigt sich auch der zentrale Bezug der Informatik zu einem physikalischen Rechensystem, also einem Computer.

Wir werden im Folgenden unter einem Computer bzw. Rechner jedes System verstehen, das eine Informationsverarbeitung durchführt. Das sind natürlich Systeme wie Laptops, Mobiltelefone usw., im weiteren Sinn können es aber auch Taschenrechner, Getränkeautomaten oder sogar ein Mensch mit Stift und Papier sein.

Die wesentliche Leistung eines Computers besteht aus genau der gerade beschriebenen Art der Informationsverarbeitung. Salopp gesagt, ist ein eingeschalteter Computer stets damit beschäftigt, Funktionen zu berechnen oder auf Eingaben zu warten – oder beides gleichzeitig. Deshalb lassen sich essentielle Aspekte der Informatik einheitlich als Aussagen über Berechnungen formulieren. Typische Fragestellungen der theoretischen Informatik sind aus diesem Grund, obwohl sie theoretisch aussehen, von hoher praktischer Relevanz, beispielsweise: – Gibt es für jede denkbare Funktion einen Algorithmus, mit dem sie berechnet werden kann? (Diese Frage werden wir bald mit „nein“ beantworten.) – Welchen Einfluss hat der verwendete Rechnertyp darauf? – Wenn eine Funktion berechnet werden kann, welche Zeit ist für die Berechnung erforderlich? Wie sieht ein Algorithmus aus, der möglichst wenig Zeit benötigt?

1.1 Information: der Stoff der Informatik | 5

Welche Zeit benötigt dieser Algorithmus mindestens, im Durchschnitt und höchstens für beliebige Eingaben? – Wenn eine Funktion berechnet werden kann, wie viel Speicherplatz wird für Zwischenergebnisse benötigt? Wie sieht ein Algorithmus aus, der möglichst wenig Speicherplatz benötigt? Wie viel Speicherplatz benötigt dieser Algorithmus mindestens, im Durchschnitt und höchstens für beliebige Eingaben? Es existiert eine Vielzahl an Computern und sonstigen Geräten, die Daten verarbeiten können, und die Beantwortung der obigen Fragen scheint auf den ersten Blick wesentlich davon abzuhängen, auf welche dieser Geräte sie sich beziehen. Natürlich kann ein langsamerer Computer länger für eine Berechnung brauchen als ein schnellerer. Auch der Platzverbrauch (im Sinne der tatsächlichen physikalischen Flächengröße, die für die Speicherung einer bestimmten Datenmenge benötigt wird) ist auf einem älteren Rechner normalerweise größer als auf einem neueren. Ob eine Funktion überhaupt berechnet werden kann, scheint hingegen nicht eine Eigenschaft eines bestimmten Gerätes zu sein, sondern eher der Funktion an sich (oder genauer gesagt, der Funktion in Bezug auf eine ganze Klasse von Geräten oder Rechnermodellen, wie wir gleich sehen werden). Aber auch was Laufzeit und Platzverbrauch einer Berechnung angeht, stellt sich heraus, dass die genauen Werte auf einem bestimmten Computer eher selten von Interesse sind. Das liegt unter anderem daran, dass Computer heute weitgehend austauschbar sind, da ein gegebenes „Programm“ normalerweise auf jedem Computer dasselbe Ergebnis liefern soll. Deshalb sind wir von der Hardware unabhängig und können rechenintensive Prozesse auf einen schnellen Computer, etwa in eine Cloud, auslagern. Was uns interessiert, ist allgemein, ob ein Problem auch für „schwierige“ Eingaben auf irgendeinem Computer in einer vertretbaren Zeit mit einem angemessenen Platzverbrauch gelöst werden kann.

Es gibt Probleme, für deren einfachste Instanzen alle heutigen Rechnern viele Milliarden Jahre zur Lösung benötigen würden. Das allein heißt aber noch nicht, dass solche Probleme unbedingt „schwierig“ sind, denn man braucht ja „nur“ einen schnelleren Rechner, den es vielleicht in zehn Jahren schon gibt. Wirklich schwierig wird ein Problem erst, wenn das Vergrößern der Eingabe zu einem überproportionalen Anstieg der benötigten Rechenzeit (oder des benötigten Speicherplatzes) führt. Wenn etwa ein einziges hinzugefügtes Eingabezeichen zu einer Verdoppelung der Laufzeit führt, dann haben wir ein schwieriges Problem, das wir als „praktisch nicht lösbar“ bezeichnen. In einem praktischen Sinn lösbare Probleme sollten dagegen bei einer Verdopplung der Eingabelänge nicht viel mehr als doppelt so viel Rechenzeit benötigen. Wir verzichten also auf eine genaue Zeitangabe und betrachten nur auf die relative Vergrößerung der Rechenzeit mit der Eingabelänge.

e iπ

6 | 1 Auf dem Weg zur theoretischen Informatik

e iπ

Die theoretische Informatik beschäftigt sich damit, möglichst allgemeine Aussagen darüber zu treffen, ob und auf welche Weise sich Funktionen berechnen lassen und wie dabei sinnvollerweise vom zugrunde liegenden Rechnermodell abstrahiert werden kann. Beispielsweise ist es hilfreich, Aussagen zu treffen, wie: „Jedes Sortierverfahren, das auf paarweisem Vergleichen der Elemente beruht, hat bei n zu sortierenden Elementen eine Laufzeit von Ω(n log(n))“ (zum Landau-Operator Ω vgl. Anhang A.4). Viel schwächer wäre es etwa zu sagen: „Jedes Sortierverfahren, das in Java programmiert ist und auf einem Android-System mit dem und dem Prozessor läuft, hat die und die Laufzeit. . . “ Diese Aussage ist so speziell, dass sie nur auf wenige Situationen zutrifft und deshalb für die meisten Menschen uninteressant ist. Um dagegen möglichst allgemeine Aussagen treffen zu können, ist es notwendig, abstrakte Rechnermodelle (auch Berechnungsmodelle) zu definieren. Ein Berechnungsmodell ist ein formales System, das die Konstruktion von „abstrakten Rechnern“ ermöglicht, welche die für reale Rechner typische Informationsverarbeitung durchführen können. Solche abstrakten Rechner heißen Automaten (oder auch Maschinen; engl. machines). Ein Berechnungsmodell umfasst also eine Klasse A von Automaten, die eine Klasse R realer Rechner bzw. die darauf ausführbaren Algorithmen repräsentiert. Genauer werden wir letztendlich immer nur von Berechnungsmodellen ausgehen können, denn „den realen Rechner“ kann man mathematisch nicht fassen. Das „Repräsentieren“ ist also eigentlich keine Relation zwischen einem Berechnungsmodell und einer Klasse realer Rechner, sondern immer zwischen zwei Berechnungsmodellen.

Das heißt, dass für jeden Algorithmus R, der durch R „ausgeführt werden kann“, ein Automat A ∈ A existiert, der für alle Eingaben zu demselben Ergebnis kommt wie R.



Für manche Berechnungsmodelle ist das äquivalent mit der Aussage, dass A in der Lage ist, alle Rechner aus R zu simulieren. Das bedeutet, dass es einen Automaten A ∈ A gibt, der als Eingabe die Beschreibung eines zu R gehörenden Algorithmus R zusammen mit einer Eingabe w für R erhält. A „simuliert“ die Berechnung von R für die Eingabe w in dem Sinne, dass die Ausgabe von A dieselbe ist, die R bei Eingabe von w ausgegeben hätte. Diese Art der Simulation funktioniert aber nur bei höheren Berechnungsmodellen (Turingmaschinen), die „mächtig“ genug sind, um so komplexe Eingaben zu verarbeiten. Wir werden die Simulation als wesentliches Werkzeug kennenlernen, um zu zeigen, dass ein Berechnungsmodell ein anderes repräsentiert.

1.1 Information: der Stoff der Informatik | 7

ŝŶĞĂƌďĞƐĐŚƌćŶŬƚĞ ƵƚŽŵĂƚĞŶ

ĞƐĞͲ ͬ^ĐŚƌĞŝďŬŽƉĨ

dƵƌŝŶŐŵĂƐĐŚŝŶĞͬ> sĞƌĂƌďĞŝƚƵŶŐ

ƵƐŐĂďĞ

ŬnjĞƉƚŽƌ͗ ǁĂŚƌͬĨĂůƐĐŚ

Abb. 2.1. Turingmaschine und LBA im Rahmen des allgemeinen Rechnermodells. Das unendliche (bzw. linear beschränkte) Speicherband wird zur Eingabe eines Wortes, während der Rechnung zur Verarbeitung und am Ende zur Ausgabe eines Wortes verwendet. Darüber hinaus kann der Automat als Akzeptor zum Erkennen einer Sprache eingesetzt werden.

Endzustand befindet oder nicht. Wenn eine Turingmaschine oder ein LBA ihr Eingabeband nur zum Einlesen der Eingabe verwenden, entsprechen ihre Arbeitsweise und ihre Berechnungsmächtigkeit der eines endlichen Automaten. Auch die Arbeitsweise eines Kellerautomaten kann sowohl von einer Turingmaschine als auch von einem LBA simuliert werden (Letzteres erfordert allerdings kompliziertere Konstruktionen). Neben Einbandturingmaschinen werden häufig auch Turingmaschinen mit drei separaten Bändern für Eingabe, Rechnung und Ausgabe verwendet. Kellerautomat: Ein Kellerautomat hat ein nicht beschreibbares Eingabeband, das von links nach rechts gelesen wird, und ein davon getrenntes Arbeitsband, den Keller. Der Keller kann gelesen und beschrieben werden, allerdings nur auf eingeschränkte Art nach dem sogenannten „Last-In-First-Out“-Prinzip. Der Keller gehört also nur zum Verarbeitungsprozess und wird auch nicht ausgegeben, vgl. Abbildung 2.2. Vom Eingabeband kann der Kellerautomat in jedem Schritt das nächste Zeichen einlesen oder im Fall von Lambda-Übergängen auch ignorieren. Die Ausgabe eines Kellerautomaten ist üblicherweise eine Akzeptanz-Aussage, also eine Antwort auf die Frage, ob das eingegebene Wort der Sprache des Kellerautomaten entspricht (wenn er sich nach Einlesen der Eingabe in einem Endzustand befindet) oder nicht (wenn er entweder nicht die vollständige Eingabe einlesen konnte oder sich am Ende in einem Nicht-Endzustand befindet). Soll eine allgemeine Funktion berechnet werden, muss der Kellerautomat mit einem von Eingabe und Keller getrennten Ausgabeband ausgestattet werden, das nur beschrieben werden kann. Ein Kellerautomat kann sich wie ein endlicher Automat

94 | 2 Deterministische Automaten

ŝŶŐĂďĞ

΀

΀

΁

΀

΀

΁

΁

΁

>ĞƐĞŬŽƉĨ ĞƐĞŬŽƉĨ ŶĚůŝĐŚĞƌƵƚŽŵĂƚ sĞƌĂƌďĞŝƚƵŶŐ

^ĐŚƌĞŝďŬŽƉĨ ƵƐŐĂďĞ

DĞĂůLJͬDŽŽƌĞ͗

Đ

Ě

Đ

Ğ

Ğ

Ğ

ŬnjĞƉƚŽƌ͗ ǁĂŚƌͬĨĂůƐĐŚ

Abb. 2.3. Endlicher Automat im Rahmen des allgemeinen Rechnermodells. Ein endlicher Automat ist sozusagen ein auf die endliche Steuerung reduzierter Automat. Er hat ein Eingabeband, von dem er nur lesen kann, und das Ergebnis seiner Rechnung kann er entweder in Form seines Akzeptanzverhaltens (End- oder Nicht-Endzustand) oder durch Beschreiben eines separaten (von ihm nicht lesbaren) Ausgabebandes mitteilen (bei Mealy- und Moore-Automaten). Er kann sich aber während der Rechnung nur in einem von endlich vielen Zuständen befinden und hat keinen Zugriff auf einen zusätzlichen unbegrenzten Speicher.

steht also folgende echte Hierarchie der Berechnungsmächtigkeit der deterministischen Automaten: LDEA ⊊ LDKA ⊊ LDLBA ⊊ LDTM Im nächsten Kapitel werden wir die nichtdeterministische Variante jedes dieser Automatentypen kennenlernen. Die Idee von Nichtdeterminismus ist, einem Automaten die (hypothetische) Fähigkeit zu geben, sozusagen in einem beliebig weitverzweigten Geflecht von möglichen Rechenwegen immer genau den richtigen auszuwählen. Anstatt eindeutig zu definieren, welcher Folgezustand eingenommen, wie das Band beschrieben, wohin die Köpfe bewegt werden sollen usw., können wir bei nichtdeterministischen Automaten in jedem Schritt gleichzeitig mehrere mögliche Verhaltensweisen vorgeben. Am Ende reicht es aus, wenn ein einziger Pfad in dem so entstehenden Berechnungsbaum zur Akzeptanz der Eingabe führt. Das entspricht der Vorstellung, dass der Automat genau diesem Pfad während seiner Rechnung folgt und dabei an jeder Abzweigung genau diejenige Richtung einschlägt, die zu einer Endkonfiguration führt. Nur wenn es überhaupt keinen Pfad gibt, der in einer Endkonfiguration mündet, wird die Eingabe nicht akzeptiert. Nichtdeterminismus ist ein Konstrukt, das in der realen Welt nicht existiert, denn ein realer Automat kann nicht das korrekte Verhalten in jedem Schritt vorhersehen. Nichtdeterminismus kann aber als eine Art magische Fähigkeit angesehen werden, die wir im Alltag gerne hätten: die richtige Lösung aus mehreren Möglichkeiten erraten

96 | 2 Deterministische Automaten

zu können. Es wird sich zeigen, dass mit nichtdeterministischen Automaten wichtige Aussagen über die Berechenbarkeit und die Komplexität von Problemen hergeleitet werden können (vgl. Kapitel 3, 6 und 7). Eines dieser Ergebnisse greifen wir vor, weil es nicht unbedingt der Intuition entspricht: Obwohl es so aussieht, als ob nichtdeterministische Automaten viel mehr „können müssten“ als deterministische, ergibt sich, dass das bei Turingmaschinen und endlichen Automaten nicht der Fall ist. Die Menge der akzeptierten Sprachen bleibt dieselbe, ob Nichtdeterminismus zugelassen wird oder nicht. Richtig raten zu können ist in diesem Fall also ohne Vorteil. (Allerdings wird angenommen, dass nichtdeterministische Turingmaschinen Probleme schneller lösen können als deterministische.) Bei Kellerautomaten stimmt dagegen die Intuition in Bezug auf die Sprachmächtigkeit, während bei LBA diese Frage ein bis heute offenes Problem darstellt. Zusammengefasst gilt: LDTM = LTM ?

LDLBA = LLBA LDKA ⊊ LKA LDEA = LEA



Dabei schreiben wir die Abkürzung für die nichtdeterministische Variante ohne „N“; nach Konvention gilt diese Variante als allgemeinste Form der jeweiligen Automaten und damit als Standardvariante. Die deterministische Version kennzeichnen wir dagegen mit einem „D“. Im Text bezeichnen wir aber, wenn es durch den Kontext unmissverständlich ist, sowohl die nichtdeterministische als auch die deterministische Variante ohne genaue Spezifizierung.

Fünf Fragen zur Selbstkontrolle (1) Zu jeder endlichen Sprache gibt es einen endlichen Automaten, der sie akzeptiert. Wie sieht ein endlicher Automat aus, der eine Sprache mit nur zwei beliebigen Wörtern {w1 , w2 } über einem Alphabet E erkennt? Beginnen Sie mit einigen Beispielwörtern und entwerfen Sie daraus ein allgemeines Vorgehen. (2) Bei einem endlichen Automaten, der das leere Wort akzeptiert, muss der Startzustand s0 ein Endzustand sein. Bei einem Kellerautomaten aber nicht – warum? (3) Wird bei einer Turingmaschine mit m Zuständen und einem Bandalphabet der Größe b das Band auf eine konstante Größe von k Feldern beschränkt, kann sie nur noch so viel berechnen, wie ein endlicher Automat mit mb k Zuständen. Warum?

2.5 Zusammenfassung

| 97

(4) Ein LBA ist eine Turingmaschine mit einem auf O(n) Felder beschränkten Band, wobei n die Länge der Eingabe ist. Warum gibt es normalerweise trotzdem keinen endlichen Automaten, der die Funktion eines LBA (für alle Eingaben) berechnen kann? (5) Für endliche Automaten haben wir ein Verfahren kennengelernt, um die Zustandszahl zu minimieren. Für Kellerautomaten, LBA und Turingmaschinen existiert so ein Verfahren dagegen nicht. Warum nicht, wenn doch die endliche Steuerung dieser Automatentypen ebenfalls aus endlich vielen Zuständen und Übergängen besteht? Worin liegt der Unterschied?



Folgende Übungsaufgaben passen zu diesem Kapitel (aus dem Buch „100 Übungsaufgaben zu Grundlagen der Informatik, Band I: Theoretische Informatik“ [KPBS14]):

– Zu Turingmaschinen: 73 bis 76, 77b, 78, 79 – Zu Kellerautomaten: 41a, 42, 43, 45 (Beachten Sie hier den kleinen Unterschied in der formalen Definition des Kellerautomaten.) – Zu endlichen Automaten (Akzeptoren): 7, 8a, 8c, 9a, 36, 41b – Zur Minimierung endlicher Automaten: 8b, 21 bis 27a, 27c, 32b, 33a – Zu Mealy-/Moore-Automaten: 1 bis 5 Lösungen zu den fünf Kontrollfragen und sonstige Themen des Kapitels können hier diskutiert werden: www.dasinfobuch.de/links/k2

3 Nichtdeterminismus: Ratende Automaten? Die bisher behandelten Automatentypen haben alle eine gewisse Entsprechung in der realen Welt. Bei Turingmaschinen und entsprechend auch bei LBA versteht sich die Parallele von selbst, denn die Turingmaschine steht als universelles Berechnungsmodell stellvertretend für die üblichen Rechner aus unserem Alltag.

Umgekehrt ist allerdings genau genommen jeder einzelne reale Rechner nicht Turing-mächtig. Da er nur einen endlichen Speicher hat, gibt es zwar sehr viele, aber nur endlich viele Kombinationen von möglichen Speicherzuständen. Daher kann er, wie ein endlicher Automat, nur endlich viele verschiedene Zustände annehmen. Trotzdem ist es sinnvoll, reale Rechner als Turingmaschinen zu betrachten und nicht als endliche Automaten. Einerseits, weil Rechner sich weiterentwickeln und beispielsweise durch Clouds die Grenzen individueller Rechner verschwimmen; durch die Möglichkeit, bei Bedarf größeren Speicher zu erwerben, kann der Speicherplatz gewissermaßen als „unbegrenzt“ angesehen werden – in Grenzen natürlich. Andererseits ist eine Modellierung der unglaublich großen Zustandszahl eines realen Rechners als endlicher Automat auch gar nicht praktikabel. In der Chipherstellung werden aber Teile realer Rechner durchaus als endliche Automaten behandelt.

Kellerautomaten werden zwar nicht unbedingt als reale Rechner gebaut, aber ihre Art des Speicherzugriffs wird für viele Algorithmen benötigt, beispielsweise zum Auflösen von Klammerausdrücken, wie wir gesehen haben. Auch endliche Automaten werden in vielen realen Anwendungen eingesetzt, beispielsweise als Teilprogramme zur Bedienung von Haushaltsgeräten, Verkaufsautomaten usw., beim Suchen in Texten oder zur Steuerung von Robotern [JJRP12]. All diese tatsächlich „herstellbaren“ Automaten waren bisher deterministisch definiert; das bedeutet, dass jeder derartige Automat in jedem Rechenschritt genau eine durch das Programm vorgegebene Regel für den nächsten Schritt hatte (oder auch keine, was zum Halten des Automaten führt – aber auf keinen Fall mehr als eine). Die Rechnung solcher Automaten läuft insofern linear ab, als jede Konfiguration genau eine (oder keine) Folgekonfiguration nach sich zieht. Auf dem Weg von der Startkonfiguration k0 zur eindeutig bestimmten letzten Konfiguration k e kann es daher keine Verzweigungen geben: k0 ⊢ k1 ⊢ k2 ⊢ . . . ⊢ k n ⊢ k e Wird Nichtdeterminismus zugelassen, dann darf ein Programm eine beliebige Menge möglicher Regeln für eine einzige Situation enthalten. Diese Menge kann leer oder einelementig sein, was dem Determinismus entspricht, sie kann aber auch

e iπ

100 | 3 Nichtdeterminismus: Ratende Automaten?

e iπ

10 oder 100 Regeln enthalten. Tritt die entsprechende Situation ein, kann jede dieser Regeln angewendet werden – und für die so entstehenden Folgekonfigurationen können wieder jeweils mehrere Regeln existieren, sodass sich eine baumförmige Aufspaltung des potentiellen Berechnungsablaufs von k0 hin zu möglicherweise vielen Endkonfigurationen ergibt. Die Idee ist dabei, dass ein nichtdeterministischer Automat bei jeder Verzweigung aus den verfügbaren Regeln immer eine auswählen kann, die zu einer Endkonfiguration führt – falls es überhaupt einen Weg zu einer Endkonfiguration gibt.

Das mag aus praktischer Perspektive wie eine ganz bizarre Idee erscheinen, denn ein realer Rechner wüsste ja nicht, welche Regeln zum Ziel führen und welche nicht. Er könnte eine Breiten- oder Tiefensuche durch den Baum der möglichen Rechenwege durchführen, um eine Endkonfiguration zu finden, was aber natürlich viel längere Zeit benötigen würde als gleich jede Verzweigung korrekt zu nehmen. Ein Rechner mit mehreren Prozessoren könnte auch mehrere Rechenwege gleichzeitig untersuchen, aber es geht hier nicht um ein paar parallele Berechnungen, die mit vier oder acht Prozessorkernen zu bewerkstelligen wären, sondern um eine beliebige Verzweigung der Rechenwege. Schon nach drei Schritten könnte ein Berechnungsbaum bei nur drei Verzweigungen pro Schritt so aussehen: Rein mathematisch ist dagegen nichts naheliegender als die Beschränkung auf eine Regel pro Rechenschritt aufzuheben und zu schauen, was passiert. Es stellt sich heraus, dass die entstehenden Automaten doch wieder einen interessanten Bezug zur Realität haben: es scheint, als könnten sie „raten“ – und zwar immer korrekt. Nichtdeterminismus kann eingesetzt werden, um wichtige Aussagen zur Berechenbarkeit und Komplexität von Problemen herzuleiten. Bevor das gelingt, müssen wir aber diese merkwürdige Idee zunächst hinnehmen und sauber für unsere bekannten Automatentypen definieren.

Beispielsweise könnte eine nichtdeterministische Turingmaschine in einem bestimmten Zustand und bei einem bestimmten gelesenen Bandzeichen zwei definierte Übergänge haben, von denen einer sie nach links und der andere nach rechts laufen lässt. Oder es könnten mehrere verschiedene Folgezustände oder zu schreibende Bandzeichen definiert sein. Die Turingmaschine könnte dann prinzipiell jede dieser Alternativen wählen, sie sucht sich aber immer nur eine von denen aus, die zum Ziel führen werden (genau genommen sucht sie sich sogar die aus, die am schnellsten zum Ziel führen wird, was vor allem in der Komplexitätstheorie eine wichtige Rolle spielen wird; falls es überhaupt eine gibt, die zum Ziel führt – sonst darf sie eine beliebige

3 Nichtdeterminismus: Ratende Automaten? | 101

Alternative wählen). Das setzt natürlich eine Rechnung voraus, in der es so ein „Ziel“ (das ist eine Endkonfiguration) überhaupt geben kann. Wir werden uns im Folgenden daher auf nichtdeterministische Akzeptoren beschränken (obwohl prinzipiell auch allgemeine Probleme durch nichtdeterministische Automaten gelöst werden können). Wie genau kann man sich nun die Rechnung eines nichtdeterministischen Automaten vorstellen, und wo kann eigentlich das Rechenergebnis aus so einem Berechnungsbaum abgelesen werden? Die exakte Antwort wird aus den Definitionen hervorgehen, die wir gleich für alle bereits bekannten Automatentypen einführen werden. Trotzdem gibt es Denkvorstellungen, die eine „halb-deterministische“ Sicht auf nichtdeterministische Rechnungen ermöglichen und vor allem am Anfang hilfreich sind, um die Ideen hinter den Formalismen zu verstehen. (Solange man nie vergisst, dass es nur Stützen sind, die nicht das exakte Verhalten beschreiben.) Das Akzeptanzverhalten eines nichtdeterministischen Akzeptors folgt dem Prinzip der Existenz eines akzeptierenden Pfades. Solange es also eine Möglichkeit gibt, mit den Regeln des Programms auf irgendeinem Pfad in eine akzeptierende Konfiguration zu gelangen, wird die Eingabe akzeptiert. Dabei ist unerheblich, ob und wie viele nicht-akzeptierende Pfade es darüber hinaus auch noch gibt, ein einziger akzeptierender reicht aus. Wir behelfen uns daher mit den folgenden beiden Metaphern, um eine erste Intuition für Nichtdeterminismus aufzubauen: (1) „Nichtdeterminismus ist beliebig weitverzweigtes Simultanrechnen“: Eine mögliche Vorstellung von Nichtdeterminismus in der physikalischen Welt wäre, dass ein deterministischer Automat sich an jeder Verzweigungsstelle in so viele weitere deterministische Automaten aufspalten könnte, wie es Regeln gibt. Jeder dieser Klone übernimmt dann eine der Alternativen und spaltet sich an der nächsten Verzweigung wieder auf usw. usf. Sobald einer dieser hypothetischen Klone eine Endkonfiguration erreicht, wird die Rechnung angehalten und das Ergebnis „akzeptiert“ ausgegeben. (2) „Nichtdeterminismus ist korrektes Raten“: Ein deterministischer Automat könnte Nichtdeterminismus simulieren, wenn ihm an jeder Verzweigung ein Wahrsager die richtige Folgekonfiguration verraten würde; richtig ist eine Folgekonfiguration, wenn sie am Ende in eine akzeptierende Endkonfiguration führt (und zwar auf dem kürzesten Weg) – und wenn es gar keine akzeptierenden Endkonfigurationen gibt (das Wort also nicht akzeptiert wird), ist jeder Weg gleich gut.

Die Vorgehensweise aus der ersten Metapher könnte im Prinzip sogar physikalisch realisiert werden (bei der deterministischen Simulation von Nichtdeterminismus werden ähnliche Methoden tatsächlich angewendet). Das macht sie allerdings zu einer besonders gefährlichen Praxisfalle. Beide Metaphern sind nicht nur für Anfänger hilfreich, um einige wichtige Aspekte von Nichtdeterminismus zu erfassen. Beide spiegeln Nichtdeterminismus aber

e iπ

102 | 3 Nichtdeterminismus: Ratende Automaten?

trotzdem nicht exakt wider, sodass gerade in Beweisen im Zweifel nur anhand der mathematischen Formalismen argumentiert werden darf.

Vor allem die zweite Metapher hat sich (bei gebotener Vorsicht) als hilfreich erwiesen, um kurz und knapp das Verhalten zusammenzufassen, das nichtdeterministische Automaten während einer Rechnung an den Tag legen. Hat man sich daran gewöhnt, dass einem nichtdeterministischen Automaten mehrere Optionen vorgelegt werden können, von denen er die richtige „errät“, ist es für viele Arten von Problemen sogar einfacher, einen nichtdeterministischen Automaten anzugeben als einen deterministischen. In manchen Fällen ist es möglich, diesen nichtdeterministischen Automaten im Anschluss deterministisch zu machen, sodass ein nichtdeterministischer Algorithmus auch zu real implementierbaren deterministischen Algorithmen führen kann (vgl. die Abschnitte über Turingmaschinen ab Seite 108 bzw. über endliche Automaten ab Seite 131). Allerdings können sich das zeitliche Verhalten und der Platzbedarf dadurch erheblich erhöhen. Wir werden im Folgenden für jeden der bisher in deterministischer Variante betrachteten Akzeptoren eine nichtdeterministische Variante einführen. Im Anschluss werden wir untersuchen, inwiefern sich die Sprachmächtigkeit durch Nichtdeterminismus erhöhen kann. In Kapitel 7 werden wir uns schließlich damit beschäftigen, inwiefern Nichtdeterminismus die benötigte Rechenzeit bzw. den benötigten Speicherplatz für das Lösen eines Problems reduzieren kann, inwiefern uns also „Raten helfen kann, Probleme zu lösen“.

3.1 Nichtdeterminismus bei Turingmaschinen Die nichtdeterministische Turingmaschine ist fast genauso definiert wie die deterministische. Der einzige Unterschied besteht darin, dass die Zustandsübergangsfunktion ein Paar (s, b) ∈ S × B aus Zustand und Bandzeichen nicht mehr wie zuvor auf ein einziges Tupel (oder gar keines) aus Zustand, Bandzeichen und Bewegungsrichtung abbildet: δ(s, b) = (s′ , b′ , X) ∈ S × B × {R, L, N} (det.) sondern auf eine beliebige Menge dieser Tupel. Um jede mögliche Menge von Tupeln abzudecken, bilden wir ab in die Menge aller Teilmengen der möglichen Tupel aus Zustand, Bandzeichen und Bewegungsrichtung, also in die Potenzmenge ℘(S × B × {R, L, N}). Auf diese Weise kann δ auf m ∈ N0 verschiedene solche Tupel gleichzeitig abbilden: δ(s, b) = {(s1 , b1 , X1 ), . . . , (s m , b m , X m )} ∈ ℘(S × B × {R, L, N}) (nichtdet.) Jedes der Tupel (s i , b i , X i ) aus der Menge δ(s, b) entspricht dabei einem möglichen Übergang, der durch die Turingmaschine in dem jeweiligen Rechenschritt genommen

3.1 Nichtdeterminismus bei Turingmaschinen

| 103

werden kann. Gilt m ≤ 1, dann ist das äquivalent zum deterministischen Fall; aber für m > 1 hat die Turingmaschine eine echte nichtdeterministische Auswahl. Die Definition der nichtdeterministischen Turingmaschine lautet also wie folgt:

Definition 3.1: Nichtdeterministische Turingmaschine Eine nichtdeterministische Turingmaschine ist ein 6-Tupel: T = (E, B, S, δ, s0 , F) Dabei haben alle Elemente dieselbe Bedeutung wie bei einer deterministischen Akzeptor-Turingmaschine (vgl. Definition 2.2 auf Seite 30), außer der Zustandsübergangsfunktion. Diese ist definiert als: δ∶ S × B → ℘(S × B × {R, L, N}) mit der Bedeutung, dass für einen Zustand s und ein Bandsymbol b jeder der in der Menge δ(s, b) = {(s1 , b1 , X1 ), . . . , (s m , b m , X m )} befindlichen Übergänge genommen werden kann (was das genau heißt, werden wir gleich noch durch die Übergangsrelation ⊢T definieren). Zu Beginn befindet sich T wie zuvor in der Startkonfiguration: (λ, s0 , w)

Wie eine nichtdeterministische Turingmaschine rechnet, haben wir umgangssprachlich schon beschrieben. Formalisieren müssen wir das wie immer anhand der Übergangsrelation für Konfigurationen. Dabei sind die Konfigurationen selbst genauso definiert, wie zuvor bei der deterministischen Turingmaschine (vgl. Definition auf Seite 32). Die Übergangsrelation setzt bei nichtdeterministischen Turingmaschinen zwei Konfigurationen k1 , k2 genau dann zueinander in Beziehung: k1 ⊢ k2 wenn unter den durch δ definierten Regeln für die Situation k1 eine ist, welche die Situation k2 hervorruft. Das entspricht der Übergangsrelation für die deterministische Variante (vgl. Definition 2.4 auf Seite 33), nur dass es diesmal nur um die Existenz einer solchen Regel geht.

e iπ

104 | 3 Nichtdeterminismus: Ratende Automaten?

Definition 3.2: Übergangsrelation für Konfigurationen nichtdeterministischer Turingmaschinen Die Relation

⊢T ⊆ (B⋆ × S × B⋆ ) × (B⋆ × S × B⋆ )

ist Übergangsrelation der Konfigurationen einer nichtdeterministischen Turingmaschine T = (E, B, S, δ, s0 , F), wenn sich für alle Zustandsübergänge δ(s, b) = {d1 , . . . , d m }

mit d i ∈ S × B × {R, L, N}; s ∈ S; b ∈ B

und für alle Zeichenketten v, w ∈ B⋆ sowie für alle durch δ in einem Schritt definierten Regeln d i = (s′ , b′ , X) ∈ δ(s, b) genau die folgenden Beziehungen ergeben (wir beschränken uns auf den Fall, dass der Kopf nicht bewegt wird, weil das Folgende ganz analog zur deterministischen Variante verläuft; der einzige Unterschied ist der fettgedruckte Teil dieses Satzes): – X = N ⇒ (v, s, bw) ⊢T (v, s′ , b′ w) – X = R ⇒ . . . – X = L ⇒ . . . Wie zuvor ist ⊢⋆T die reflexiv-transitive Hülle von ⊢T , und das T lassen wir in der Bezeichnung weg, wenn es eindeutig aus dem Kontext hervorgeht.

Ein Wort w ∈ E wird von einer nichtdeterministischen Turingmaschine T genau dann akzeptiert, wenn es eine Konfigurationenfolge (λ, s0 , w) ⊢⋆ (v1 , f , v2 ) von der Startkonfiguration (λ, s0 , w) in eine Endkonfiguration (v1 , f , v2 ) gibt. Die von T akzeptierte Sprache ist dann wie gewöhnlich: L(T) =def {w ∈ E⋆ ∣ T akzeptiert w} Diese Definition der Übergangsrelation erweitert die deterministische Variante einfach nur um die Möglichkeit mehrerer Optionen pro Zustandsübergang. In diesem Fall gilt die Relation zwischen der aktuellen Konfiguration k a und allen Konfigurationen k1 , . . . , k m , für die ein Übergang existiert, der sie aus k a entstehen lässt: k a ⊢ k1 , k a ⊢ k2 , . . . , k a ⊢ k m

3.1 Nichtdeterminismus bei Turingmaschinen

| 105

Beachten Sie, dass diese Existenzaussage genau der fettgedruckten „für alle“Aussage in Definition 3.2 entspricht. Diese Definition ist nicht sehr kompliziert (mit den vielen „für alle“-Quantoren vielleicht etwas unübersichtlich), und es ist wichtig, sie verstanden zu haben, um wirklich die Idee des Nichtdeterminismus zu begreifen. Wir betrachten als Beispiel eine nichtdeterministische Turingmaschine für die Sprache L mod , deren Wortproblem wir bereits mit einer deterministischen Turingmaschine gelöst haben (vgl. Beispiel auf Seite 37). Beispiel 3.1: Nichtdeterministische Turingmaschine für L mod Sei wieder die Sprache der Wörter über {a, b} gegeben, deren letztes Zeichen u ∈ {a, b} festlegt, dass die Anzahl der Vorkommen von u im Wort geradzahlig sein muss: L mod = {w ∈ {a, b}⋆ ∣ ∀u ∈ {a, b}, v ∈ {a, b}⋆ ∶ w = vu ⇒ ∣w∣u mod 2 = 0} Die deterministische Turingmaschine für diese Sprache musste beim Durchlaufen der Eingabe in vier Zuständen mitzählen, wie viele a’s und b’s modulo zwei im Wort aufgetreten sind, vgl. Seite 37. (Oder wir hätten sie zuerst ganz nach hinten laufen lassen können, um abzulesen, welches Zeichen gezählt werden soll; dann hätte sie aber zweimal über das Wort laufen müssen.) Wir konstruieren nun eine nichtdeterministische Turingmaschine, welche ihre Rate-Fähigkeit nutzt, um diese Sprache einfacher zu erkennen.

„Einfacher“ liegt in diesem Fall im Auge des Betrachters; die Turingmaschine wird nur einen Zustand weniger haben und auch nur einen Rechenschritt weniger brauchen als ihr deterministisches Gegenstück. Aber sie wird in ihrer Arbeitsweise verständlicher sein. Außerdem wird sie zwar ebenfalls 4 Zählzustände haben, aber würden wir L mod für n Zeichen definieren (statt nur für a und b), bräuchte man bei analoger Implementierung 2n Zählzustände im nichtdeterministischen Fall, aber 2n im deterministischen, um alle möglichen Kombinationen aus geraden und ungeraden Anzahlen der n Zeichen erfassen zu können.

Wir werden den Nichtdeterminismus an zwei Stellen nutzen, einmal um zu erraten, ob a’s oder b’s gezählt werden sollen, und ein zweites Mal, um das Wortende zu erraten, ohne zuerst darüber hinauslaufen zu müssen. Zunächst erlauben wir aus dem Startzustand s0 heraus gleich zwei mögliche Folgezustände, wobei jeweils ein Übergang unter der Annahme stattfindet, dass a’s, und der andere, dass b’s gezählt werden sollen. Haben wir schon in s0 das Zeichen gelesen, das wir auch zählen wollen, springen wir gleich in den „ungeraden“ Zustand für dieses Zeichen, sonst in den „geraden“. Die Übergänge aus s0 können etwa folgendermaßen aussehen:

e iπ

106 | 3 Nichtdeterminismus: Ratende Automaten?

s0

a

b



{(s2 , a, R), (s3 , a, R)}

{(s1 , b, R), (s4 , b, R)}



Also ist s1 der „gerade“ Zustand für a und s2 der „ungerade“, bzw. s3 der „gerade“ Zustand für b und s4 der „ungerade“. Dazu müssen wir in s0 auch gleich die Möglichkeit berücksichtigen, dass λ ∈ L mod eingegeben werden kann. Da bei w ≠ λ der Startzustand sofort und für immer verlassen wird, können wir diesen einfach zum Endzustand machen, um das leere Wort zu akzeptieren. Die Zählzustände können wir diesmal übersichtlicher gestalten als in der deterministischen Variante, da a’s und b’s getrennt gezählt werden. Zunächst könnten wir sie einfach wie folgt implementieren:

s1 s2 s3 s4

e iπ

a

b



{(s2 , a, R)} {(s1 , a, R)} ↑ {(s3 , a, R)} {(s4 , a, R)}

{(s1 , b, R)} {(s2 , b, R)} {(s4 , b, R)} {(s3 , b, R)} ↑

∅ ∅ ∅ ∅

Gerade Anzahl a’s Ungerade Anzahl a’s Gerade Anzahl b’s Ungerade Anzahl b’s

Wir springen also immer zwischen zwei Zuständen hin und her, um die Parität (das ist die Teilbarkeit durch zwei) des jeweiligen Zeichens zu erkennen. Wir können genau dann akzeptieren, wenn wir im „ungeraden“ Zustand für das zu zählende Zeichen sind und auch dieses Zeichen lesen (vgl. Symbole ↑ in der Tabelle) – wenn danach das Wortende kommt. Aber woher wissen wir, wann es kommt? Die deterministische Antwort ist: indem wir darüber hinauslaufen, aber das ist langweilig. Die spannendere nichtdeterministische Antwort ist je nach Geschmack. . . – . . . entweder: gar nicht, aber das müssen wir auch nicht; – . . . oder: durch die Rate-Fähigkeit des Nichtdeterminismus.

Den Fall, dass wir im „ungeraden“ Zustand das jeweils andere Zeichen am Wortende lesen, müssen wir nicht berücksichtigen, denn diesen Fall decken ja die anderen beiden Zustände ab. Unsere Turingmaschine hätte sich dann von s0 aus für das andere Zustandspaar entschieden.

Wir bauen die Übergänge für das Wortende nichtdeterministisch als Alternativen zu den bereits vorhandenen Übergängen ein. Dabei springt die Turingmaschine an jeder solchen Möglichkeit auf Verdacht in einen Zwischenzustand s5 , der allerdings eine Sackgasse darstellt, wenn das Wortende noch nicht erreicht sein sollte. Nur falls wir das Wortende genau getroffen haben, in s5 also ⋆ gelesen wird, springen wir in einen Endzustand s f . Das gesamte Programm δ der Turingmaschine ergibt sich also folgendermaßen (die neuen Übergänge sind fettgedruckt):

3.1 Nichtdeterminismus bei Turingmaschinen

s0 s1 s2 s3 s4 s5 sf

| 107

a

b



{(s2 , a, R), (s3 , a, R)} {(s2 , a, R)} {(s1 , a, R), (s5 , a, R)} {(s3 , a, R)} {(s4 , a, R)} ∅ ∅

{(s1 , b, R), (s4 , b, R)} {(s1 , b, R)} {(s2 , b, R)} {(s4 , b, R)} {(s3 , b, R), (s5 , b, R)} ∅ ∅

∅ ∅ ∅ ∅ ∅ {(s f , ⋆, N)} ∅

Die Turingmaschine selbst ist gegeben durch: T = ({a, b}, {a, b, ⋆}, {s0 , . . . , s5 , s f }, δ, s0 , {s0 , s f }) Dass die präsentierten Ideen tatsächlich funktionieren, sieht man exemplarisch am Berechnungsbaum für die Beispieleingabe aabab: kDEDE V  D5 DkEDE V  D5 DDEDE V 

D5 DkEDE V 

D5 DDEDE V 

D5 DDEDE V 

E5

E5

DDEkE V 

DDEkE V 

D5

D5

DDEDE V 

DDEDE V 

E5 DDEDE  V 

E5 DDEDE  V 

E5 DDEDE  V   1

DDEDE  V I

DAR-09 | ID-3762 → Skript: S. 389

108 | 3 Nichtdeterminismus: Ratende Automaten? An jedem Knoten ist der aktuelle Bandinhalt mit der Position des Lese-/Schreibkopfes (wie zuvor als Dach über dem jeweiligen Zeichen) und dem aktuellen Zustand in Klammern dargestellt. Rechteckige Knoten entsprechen Situationen ohne Folgekonfiguration, wenn sie einen doppelten Rahmen haben, handelt es sich um akzeptierende Endkonfigurationen. Die Pfeile entsprechen der Konfigurations-Übergangsrelation ⊢T , wobei auch jeweils das auf das Band geschriebene Zeichen und die Kopfbewegungsrichtung als Pfeilbeschriftung dargestellt werden. Der grau hinterlegte Pfad zeigt einen (hier den einzigen) akzeptierenden Rechenweg; das Wort wird also akzeptiert.

Die nicht-akzeptierenden Pfade entsprechen Situationen, wo sich eine deterministische Turingmaschine „geirrt“ haben könnte, wenn sie ohne Rate-Fähigkeit irgendeinen Übergang genommen hätte. Die nichtdeterministische Turingmaschine „rät“ sich dagegen an diesen Sackgassen vorbei. Die erste Abzweigung unter der Startkonfiguration entspricht der Frage, ob a’s oder b’s gezählt werden sollen. Der gesamte linke Teilbaum, der a’s zählt, ist zum Scheitern verurteilt, weil die Anzahl der a’s nicht gerade ist, aber auch nicht gezählt werden muss. Im rechten wie im linken Teilbaum können außerdem weitere nicht-akzeptierende Pfade abzweigen, die im Zustand s5 auf Verdacht testen, ob das Wortende erreicht ist. Ganz zum Schluss, wo das Wortende wirklich erreicht wird, zweigt umgekehrt ein Sackgassen-Pfad in den Zustand s3 ab, der den Fall abdeckt, dass das Wortende noch nicht erreicht sein könnte. All diese Irrtümer machen aber keine Probleme, weil es ausreicht, dass ein Pfad eine Endkonfiguration erreicht hat. Von außen betrachtet scheint T ebenenweise von oben nach unten durch den Baum zu laufen und nach sechs Schritten akzeptierend anzuhalten, als ob sie an all diesen Verzweigungen richtig geraten oder (entsprechend der „Klon“Metapher) all diese Ebenen gleichzeitig überprüft hätte.

Deterministische Simulation nichtdeterministischer Turingmaschinen Wie das Beispiel zeigt, kann es beim Lösen von Problemen Vorteile haben, nichtdeterministisch rechnen zu können. Aber obwohl viele Probleme durch Nichtdeterminismus „leichter“ gelöst werden können als ohne (inwieweit das wirklich wesentliche Effizienz-Verbesserungen sind, werden wir noch untersuchen), gibt es keine Probleme, die nur nichtdeterministisch gelöst werden können. Die deterministische Turingmaschine bleibt also das berechnungsmächtigste Werkzeug der Informatik, auf einer Ebene mit der nichtdeterministischen. Um das einzusehen, überlegen wir, dass eine deterministische Turingmaschine eine nichtdeterministische simulieren kann. Dabei arbeitet sie im einfachsten Fall die im Berechnungsbaum verzweigten Konfigurationen nacheinander ab, welche die nichtdeterministische Turingmaschine ebenenweise, unter Ignorierung der nicht zielführenden Pfade, abgearbeitet hätte.

3.1 Nichtdeterminismus bei Turingmaschinen

| 109

ŗ Ř

Ş ş

ŝ

ř

Ś

ŗŖ

ŗŗ

ŗŘ

ś

ŗř

ŗŚ

Ŝ

Abb. 3.1. Versuch der Simulation von Nichtdeterminismus durch Tiefensuche. Der Versuch scheitert, weil im allgemeinen Fall nicht-akzeptierende Teilbäume unendlicher Tiefe existieren können.

Eine erste Idee könnte sein, eine Tiefensuche im Berechnungsbaum durchzuführen. Dabei würde bei mehreren möglichen Folgekonfigurationen {k1 , k2 , . . .} zuerst k1 besucht werden und, falls als Folge von k1 weitere Verzweigungen auftreten, wieder eine davon und so rekursiv immer weiter, bis der Unterbaum unter k1 komplett abgearbeitet worden ist; erst danach würde k2 besucht werden usf. Im Beispiel-Berechnungsbaum in Abbildung 3.1 würde sich dadurch etwa die durch den langen Pfeil angedeutete Traversierung (Knotenfolge) ergeben. Diese bräuchte statt der 6 nichtdeterministischen Rechenschritte direkt auf dem grau hinterlegten Pfad schon 14 deterministische Rechenschritte bis zur Endkonfiguration (zusammen mit einem Mehraufwand für die Simulation, vgl. Kapitel 6.3 ab Seite 271). Das Problem bei dieser Art der Simulation ist allerdings, dass es unendlich tiefe nicht-akzeptierende Pfade geben kann, die nicht mehr verlassen werden. Wenn etwa der linke Teil des Berechnungsbaums sich durch eine Endlosschleife unendlich in die Tiefe erstrecken würde, könnte der akzeptierende Pfad in endlicher Zeit nicht gefunden werden. Ein Ausweg ist die Simulation durch Breitensuche, welche einer ebenenweisen Abarbeitung entspricht, ohne dass die richtige Verzweigung im Vorfeld bekannt sein müsste. Dabei werden bei mehreren Folgekonfigurationen {k1 , . . . , k n } zunächst all diese Konfigurationen für einen Rechenschritt besucht, bevor die erste Konfiguration unter k1 besucht wird, dann die zweite usw., vgl. Abbildung 3.2. Statt die korrekten Abzweigungen also nichtdeterministisch zu erahnen, werden einfach alle

110 | 3 Nichtdeterminismus: Ratende Automaten?

ŗ

Ř ř Ś

ś

Ş

ş

Ŝ

ŝ

ŗŖ ŗŗ

ŗŘ

ŗŚ

ŗř

ŽŽ›–’—’œ’œŒ‘Žȱ’–ž•Š’˜— ŗś

Abb. 3.2. Simulation von Nichtdeterminismus durch Breitensuche. Diese Art der Simulation glückt, da eine Endkonfiguration auf jeden Fall gefunden wird, falls sie existiert.

e



Konfigurationen ebenenweise überprüft und so insbesondere auch der korrekte Pfad. Auf diese Weise kann eine beliebige nichtdeterministische Turingmaschine durch eine deterministische Turingmaschine simuliert werden. Allerdings benötigt dieser Prozess in unserem Beispiel schon 15 Rechenschritte (plus einem Mehraufwand für die Simulation) – im Vergleich zu 6 nichtdeterministischen Rechenschritten.

Natürlich ist das eine Argumentation von sehr hoher Warte aus; wie so eine Simulation tatsächlich im Detail aussehen würde, erarbeiten wir hier nicht. (In Kapitel 6.3 werden wir allerdings untersuchen, wie eine deterministische Turingmaschine durch eine andere deterministische Turingmaschine simuliert werden kann, was zu ähnlichen Konstruktionen führt.) Es sollte aber klar geworden sein, dass sie prinzipiell möglich ist.

Das erste wichtige Fazit dieser Untersuchung ist, dass der Nichtdeterminismus bei Turingmaschinen nicht dazu führt, dass mehr Probleme gelöst werden können als durch Determinismus. Insbesondere gilt für die durch Turingmaschinen akzeptierbaren Sprachklassen: LDTM = LTM

3.1 Nichtdeterminismus bei Turingmaschinen

| 111

Im Allgemeinen kann der beschriebene Simulationsprozess aber zu einem extremen Anstieg der Rechenzeit führen. Da ein Baum der Tiefe t bei v Verzweigungen pro Knoten insgesamt 1 + v + v2 + . . . + v t Knoten hat, kann der Anstieg exponentiell sein.

Es ist hier wichtig zu verstehen, dass die Rechenzeit t einer nichtdeterministischen Turingmaschine im Wesentlichen der Tiefe des Berechnungsbaums (bis zur Ebene der ersten Endkonfiguration, falls vorhanden) entspricht.

Nun haben wir mit der Breitensuche nur eine einzige, sehr naheliegende Methode der Simulation betrachtet. Es ist theoretisch denkbar, dass es eine bessere Methode geben könnte, welche zu einer weniger als exponentiellen, im besten Fall nur polynomiellen Verschlechterung der Rechenzeit führt. Heute wird jedoch geglaubt, dass jede deterministische Simulation einer nichtdeterministischen Turingmaschine im schlimmsten Fall exponentiell mehr Zeit benötigt als die nichtdeterministische Rechnung selbst. Das ist der Kern der berühmten P/NP-Problematik, welche wir in Kapitel 7 behandeln werden. Intuitiv scheint diese Vermutung auch plausibel, denn raten zu können müsste doch eine Fähigkeit sein, die einen entscheidenden Vorteil im Lösen von Problemen bieten sollte.

Ein Problem, dessen Lösung erraten werden kann Um diese Intuition zu untermauern, betrachten wir nun ein etwas schwierigeres Problem, das ein Paradebeispiel für eine Fragestellung ist, für die unser Gefühl sagt, dass Nichtdeterminismus bei der Lösung von Vorteil sein müsste. Wie wir gesehen haben, kann Nichtdeterminismus als Wegweiser dienen, um im Berechnungsbaum unter mehreren Abzweigungen diejenige zu erkennen, die zu einer Endkonfiguration führt. Diese Idee heben wir nun eine Ebene höher und betrachten ein Problem, das sich um die Suche eines richtigen Pfades in einem Graphen dreht. Bei der Lösung dieses Problems versuchen wir, die Suche nach einer Endkonfiguration im Berechnungsbaum mit der Suche nach dem richtigen Pfad im Graphen in Einklang zu bringen und so den Nichtdeterminismus direkt auf der Problemebene zu nutzen. Wir lassen also ganz normal nichtdeterministisch den richtigen Weg zu einer Endkonfiguration finden, aber so, dass korrekte Abzweigungen im Berechnungsbaum eine Entsprechung in korrekten Abzweigungen im Graphen haben. (Vgl. zu Graphen auch Anhang A.2.) Beispiel 3.2: Hamiltonpfad-Problem Das Hamiltonpfad-Problem ist ein Entscheidungsproblem, das für die Frage steht, ob es in einem gegebenen ungerichteten Graphen G = (V , E) einen Hamiltonpfad gibt.

e iπ

112 | 3 Nichtdeterminismus: Ratende Automaten?







 







Abb. 3.3. Beispiel eines Hamiltonpfades in einem Graphen. Ein Hamiltonpfad besucht jeden Knoten eines ungerichteten Graphen genau einmal. Im Graphen ist der Hamiltonpfad (a, d, e, g, b, c, f , h) fettgedruckt. Allgemein ist es schwierig festzustellen, ob es in einem beliebigen Graphen einen Hamiltonpfad gibt.

Unter einem Hamiltonpfad versteht man dabei einen zusammenhängenden Kantenzug im Graphen: ({v i , v j }, {v j , v k }, {v k , v l }, . . .) ∈ E∣V∣−1 der jeden Knoten v ∈ V genau einmal „besucht“. Anders – und für unsere angestrebte Lösung geschickter – formuliert, ist es eine Sortierung aller Knoten aus V: (v i , v j , v k , v l , . . .) sodass zwei benachbarte Knoten jeweils durch eine Kante, etwa {v i , v j }, {v j , v k } usw. verbunden sind. (Das bekannte „Problem des Handlungsreisenden“ ist eine verschärfte Variante davon, vgl. Kapitel 7.) Im Beispielgraphen in Abbildung 3.3 ist ein möglicher Hamiltonpfad dargestellt.



Das Hamiltonpfad-Problem gehört zu den NP-vollständigen Problemen (vgl. Kapitel 7.3), die als sehr schwierig gelten, von denen aber angenommen wird, dass sie unter Zuhilfenahme von Nichtdeterminismus (was ja nur theoretisch geht) wesentlich einfacher werden. „Sehr schwierig“ heißt dabei, dass nach heutigem Verständnis ein deterministisches Lösungsverfahren exponentielle Rechenzeit in Bezug auf die Länge ∣w∣ der Eingabe benötigt, während ein nichtdeterministisches Lösungsverfahren nicht mehr als polynomielle Rechenzeit benötigt. e iπ

Wir erarbeiten nun eine Lösung für das Hamiltonpfad-Problem und überlegen dabei, welche Teile des Problems vom Nichtdeterminismus profitieren könnten.

3.1 Nichtdeterminismus bei Turingmaschinen

| 113

Wir werden aber kein Turingmaschinenprogramm im Sinne einer exakten Turingtafel für das Hamiltonpfad-Problem angeben, weil das viel zu aufwändig wäre. Stattdessen werden wir höhersprachliche Algorithmen angeben, wie sie auf einem normalen Rechner – bzw. dessen (vage bestimmtem) nichtdeterministischem Gegenstück – ausgeführt werden könnten. Das klingt hier noch ziemlich schwammig, aber wir werden in Kapitel 6 begründen, dass man bis zu einem gewissen Grad höhersprachliche Konstrukte und Pseudocode benutzen darf, um die Arbeitsweise von Turingmaschinen zu beschreiben.

Es zeigt sich, dass ein Teil des Problems einfach zu lösen ist, nämlich die Überprüfung, ob eine gegebene Knotensortierung ein Hamiltonpfad ist oder nicht. Eine Knotensortierung ist einfach eine Folge F ∈ V ⋆ , die jeden Knoten genau einmal enthält. Wir können nun folgendermaßen durch einen deterministischen höhersprachlichen Algorithmus prüfen, ob F ein Hamiltonpfad ist: input : G = (V , E), F = (v1 , . . . , v n ) ∈ V ⋆ output : wahr ⇐⇒ F ist Hamiltonpfad in G 1 2 3 4

knoten = ∅; if ∣F∣ ≠ ∣V∣ then return falsch; // Pfadlänge passt nicht. end

13

for i = 1 to n − 1 do if v i ∈ knoten ∨ v i+1 ∈ knoten then return falsch; // Knoten v i oder v i+1 kam schon einmal vor. end knoten ∶= knoten ∪ {v i }; if {v i , v i+1 } ∉ E then return falsch; // Knoten v i ist kein Nachbar von v i+1 . end end

14

return wahr;

5 6 7 8 9 10 11 12

Dieser Algorithmus arbeitet offenbar in Linearzeit, da er nicht viel mehr tut, als für alle Knoten des Graphen einige einfache Operationen auszuführen. Der Algorithmus arbeitet in Linearzeit in Abhängigkeit der Anzahl der Knoten ∣V∣, wenn das Überprüfen, ob ein Element in einer Menge existiert und das Hinzufügen eines Elements zu einer Menge in konstanter Zeit

e iπ

114 | 3 Nichtdeterminismus: Ratende Automaten?

möglich ist. Was das in Bezug zur tatsächlichen Eingabelänge, also der Größe einer Instanz, bedeutet, können wir so nicht sagen, da wir keine Sprache für das Hamiltonpfad-Problem angegeben haben (das können Sie als Übung versuchen). Aber unter der Annahme, dass jeder Knoten irgendwie irgendwo als Teil der Eingabe kodiert ist, erhalten wir daraus auch mindestens Linearzeit in Abhängigkeit der Eingabelänge. Linearzeit in einer höheren Programmiersprache bedeutet allerdings nicht unbedingt Linearzeit auf einer Turingmaschine – aber immerhin Polynomialzeit, wie wir noch sehen werden.

Da das Überprüfen eines Pfades in polynomieller Zeit möglich ist, muss der schwierige Teil des Problems, der zu einer exponentiellen Rechenzeit führt, also im Finden des Pfades liegen. Hier kann Nichtdeterminismus eingesetzt werden, um auch diesen Schritt in Polynomialzeit zu bewerkstelligen. Ein Mensch, der einen Wahrsager an der Seite hat, würde dabei vielleicht folgendermaßen vorgehen: (1) Frage den Wahrsager nach einem Startknoten v. (2) Frage den Wahrsager, welche „Abzweigung“ von v aus genommen werden soll, welches also der nächste Knoten v′ ist, für den eine Kante {v, v′ } ∈ E existiert. (3) Setze v ∶= v′ und fahre mit (2) fort, bis der Pfad ∣V∣ Knoten enthält. (4) Führe den ersten Algorithmus zum Überprüfen des Pfades durch und gib dessen Ergebnis als Lösung aus (da der Wahrsager nur dann einen Hamiltonpfad finden kann, wenn es überhaupt einen gibt). So geht jemand vor, der in einem Labyrinth den Ausgang finden will und an jeder Abzweigung unter den verfügbaren Wegen immer den richtigen wählt. Eine nichtdeterministische Turingmaschine kann es sich sogar noch einfacher machen und schlicht den nächsten Knoten raten, ohne vorher zu testen, ob dort überhaupt eine Kante hinführt. Wenn es keine Kante gibt, wird der Nichtdeterminismus schon dafür sorgen, dass der entsprechende Knoten nicht genommen wird. Der folgende nichtdeterministische Algorithmus findet einen Hamiltonpfad in (beinahe) Linearzeit: input : G = (V , E) output : wahr ⇐⇒ es existiert ein Hamiltonpfad in G 1

F = leere Liste;

4

for i = 1 to ∣V∣ do Errate nichtdeterministisch den nächsten Knoten und füge ihn zu F hinzu; end

5

return Ausgabe des ersten Algorithmus auf Eingabe (G, F);

2 3

Sie werden bei diesem extrem einfachen Algorithmus vielleicht stutzen, denn was heißt schon: „Errate nichtdeterministisch den nächsten Knoten“? Woher „weiß“ der Algorithmus überhaupt etwas vom Konzept des Hamiltonpfades, woher kennt er an

3.1 Nichtdeterminismus bei Turingmaschinen

| 115

dieser Stelle überhaupt die Idee des „korrekten nächsten Knotens“? Nehmen wir dazu unsere Rate-Metapher noch einmal genauer unter die Lupe. Der Algorithmus weiß tatsächlich zunächst noch nichts vom Konzept des Hamiltonpfades oder davon, wann ein Knoten korrekt ist. Die tatsächliche nichtdeterministische Turingmaschine steht gerade schlicht in irgendeiner Konfiguration vor der Frage, welchen der möglichen Folgeübergänge sie nehmen soll. Sie wählt definitionsgemäß immer den „korrekten“, aber nicht im Sinne eines korrekten nächsten Knotens im Hamiltonpfad, sondern im Sinne einer korrekten Abzweigung auf dem Pfad hin zu einer akzeptierenden Endkonfiguration. Bevor diese Endkonfiguration erreicht werden kann, muss im Anschluss an den Rateprozess aber noch der erste, deterministische Teil unseres Algorithmus ausgeführt werden (ganz am Ende in Zeile 5). Dieser stellt den eigentlichen Bezug zum Hamiltonpfad-Problem her, indem er genau dann wahr ausgibt, wenn die Eingabe ein Hamiltonpfad war; und nur dann wird die Eingabe akzeptiert. Die Turingmaschine rät also in dem Sinne korrekt, dass sie später die Verifizierung, ob sie korrekt geraten hat, übersteht: Die Verifizierung steuert von hinten her den Rateprozess. Warum die Turingmaschine den Weg so erraten kann, dass die Verifizierung glückt, dürfen wir uns nicht fragen – das ist einfach so. Aber inwiefern das Raten „korrekt“ war, legt allein die anschließende Verifizierung fest. Wir nutzen hier den Begriff „Raten“ wie selbstverständlich (ohne ihn überhaupt definiert zu haben), meist ohne Anführungszeichen und so, als ob es das wirklich gäbe. Das liegt daran, dass ein nichtdeterministischer Prozess von außen ganz einfach wie das aussieht, was man umgangssprachlich unter „Raten“ versteht – und zwar so sehr, dass die oben gezeigte algorithmische Zweiteilung tatsächlich oft praktiziert wird – sogar in halb-formalen Beweisen. Wir tun so, als könnten wir unter Zuhilfenahme von Nichtdeterminismus einfach eine Lösung erraten, die am Schluss nur noch deterministisch überprüft werden muss. Eine wichtige Einschränkung an das Raten gibt es allerdings: Die nichtdeterministischen Verzweigungen sind fest im Programm der Turingmaschine verankert, ihre Anzahl kann also nicht mit der Eingabe mitwachsen. Wir können daher im angegebenen Algorithmus eigentlich nicht in einem einzigen Schritt irgendeinen der ∣V∣ Knoten erraten lassen. Wir brauchen dafür aber auch nicht mehr als O(log(∣V∣)) Rate-Operationen, wenn wir etwa die Knoten in Dezimaldarstellung durchnummerieren und dann nacheinander die erste, zweite, dritte usw. Ziffer des Index erraten lassen. Im Rahmen von PolynomialzeitBetrachtungen ist das unerheblich.

Soll nun das Hamiltonpfad-Problem deterministisch gelöst werden, dann scheint es eigentlich nur Alternativen zu geben, die mehr oder weniger darauf hinauslaufen, alle möglichen Pfade aufzulisten und auf ihre Hamiltoneigenschaft hin zu überprüfen. Eine unmittelbare Lösung, die genau darauf hinausläuft, ist, die nichtdetermi-

e iπ

116 | 3 Nichtdeterminismus: Ratende Automaten?

nistische Turingmaschine einfach deterministisch zu simulieren, wie zuvor beschrieben. Solche Lösungen erfordern allerdings mindestens exponentielle Laufzeit in der Anzahl der Knoten (sogar wenn wir die Pfade klüger wählen, etwa immer darauf achtend, dass es tatsächlich Kanten zwischen den Knoten gibt). Wenn Sie nicht schlauer sind als alle Menschen, die sich bisher mit diesem Problem (und ähnlichen) beschäftigt haben, wird auch Ihnen keine wesentlich bessere Möglichkeit einfallen. Daher ist der derzeitige Konsens, dass alle Probleme in der Art des Hamiltonpfad-Problems (das sind alle NP-vollständigen Probleme, vgl. Kapitel 7) sehr wahrscheinlich exponentielle Rechenzeit erfordern, wenn sie deterministisch gelöst werden sollen. Das bestätigt unsere Intuition, dass Raten einen großen Einfluss auf die Rechenzeit haben kann – aber beweisen konnte es bis heute keiner. Zusammenfassend kann also festgestellt werden, dass bei allgemeinen Turingmaschinen der Einsatz von Nichtdeterminismus zwar nicht zu einer höheren Sprachmächtigkeit führt, aber für eine große Klasse von Problemen vermutlich erheblich effizientere Lösungswege erlaubt.

3.2 Nichtdeterminismus bei LBA Nichtdeterministische LBA sind nichtdeterministische Turingmaschinen; dabei muss nur zusätzlich genauso eine links- und rechtsseitige Beschränkung des Arbeitsbandes implementiert werden, wie bei deterministischen LBA. Viel mehr gibt es dazu aus struktureller Sicht eigentlich nicht zu sagen. Wie zuvor bei deterministischen LBA gilt auch hier, dass so ziemlich alle Beispiele, welche wir für „die Turingmaschine“ betrachten, schon auf einem LBA gelöst werden können. Probleme, die auf einer (nichtdeterministischen) Turingmaschine gelöst werden können, aber nicht auf einem nichtdeterministischen LBA sind im Alltag sehr selten. Als Beispiel eines nichtdeterministischen LBA kann im Prinzip also die Turingmaschine für die Sprache L mod auf Seite 105 betrachtet werden (wo zwar das Band nicht explizit nach links und rechts eingeschränkt ist, aber während der Rechnung ja nur die Felder besucht werden, auf denen das Eingabewort w steht, plus eines der Leerfelder). Auch das HamiltonkreisProblem lässt sich (sowohl deterministisch als auch nichtdeterministisch) auf einem LBA lösen. Die dargestellten Algorithmen basieren ja im Wesentlichen darauf, alle Knoten in einer bestimmten Reihenfolge zu sortieren und dann sehr einfache Tests („existiert eine Kante in E. . . ?“, „gibt es einen Knoten in einer Menge. . . ?“ etc.) darauf auszuführen. Viel mehr als die Kodierung des Graphen (V , E) selbst, der sortierten ∣V∣ Knoten, und einiger zusätzlicher Hilfsmittel wie Zähler, weiterer Mengen, die Knoten enthalten können usw. müssen nicht auf dem Band stehen. All das kann auf linearem Platz locker unterkommen (in Abhängigkeit von ∣V∣ – aber das läuft normalerweise auf dasselbe hinaus wie in Abhängigkeit der Eingabelänge). Die interessante Frage bei LBA ist, ob deterministische LBA und nichtdeterministische LBA dieselbe Sprachklasse erkennen können oder nicht. Bei allgemeinen Tu-

3.3 Nichtdeterminismus bei Kellerautomaten | 117

ringmaschinen haben wir skizziert, wie eine deterministische Turingmaschine eine nichtdeterministische simulieren kann. Die Umkehrung gilt natürlich auch, denn ein nichtdeterministischer Automat kann einen deterministischen simulieren, indem er auf den Nichtdeterminismus einfach verzichtet (die deterministische Turingmaschine für L mod von Seite 37 hätte im Prinzip auch für den nichtdeterministischen Fall als Beispiel dienen können). Daher konnten wir feststellen, dass nichtdeterministische Turingmaschinen dieselbe Sprachklasse erkennen wie deterministische. Die eine Richtung ist auch bei LBA (und ebenso bei allen anderen Automatentypen) leicht einzusehen. Die Sprachklasse der durch deterministische LBA erkennbaren Sprachen ist natürlich eine Teilmenge der durch nichtdeterministische LBA erkennbaren Sprachen: LDLBA ⊆ LLBA Ob aber auch die Umkehrung gilt, ist eine bis heute ungelöste Frage. Die Simulation eines nichtdeterministischen LBA durch einen deterministischen LBA ist noch nicht gelungen, aber es ist auch nicht widerlegt, dass es möglich sein könnte. Die Frage ist bekannt als erstes LBA-Problem, und die Tatsache, dass sie schon seit vielen Jahren zu den wichtigsten offenen Fragen der Informatik gehört und trotzdem nicht gelöst werden konnte, spricht für ihre Komplexität. Bekannt ist allerdings, dass, wie auch auf deterministischer Ebene, nichtdeterministische LBA echt weniger Sprachen akzeptieren können als (nichtdeterministische) Turingmaschinen [HMU11]. Zu den von allgemeinen, aber nicht von linear beschränkten Turingmaschinen akzeptierbaren Sprachen gehören alle in Kapitel 6 als „unentscheidbar, aber semientscheidbar“ bezeichneten Probleme, wie etwa das Halteproblem, das Postsche Korrespondenz-Problem und das Komplement der Diagonalsprache L NA . Es gibt aber auch entscheidbare Probleme, wie das Äquivalenzproblem regulärer Ausdrücke, die kein LBA akzeptieren kann. Zusammen gilt also: ?

LDLBA = LLBA ⊊ LDTM = LTM

3.3 Nichtdeterminismus bei Kellerautomaten Nichtdeterministische Kellerautomaten folgen ebenfalls der Idee, dass für jede Konfiguration eine Menge möglicher Folgekonfigurationen existieren kann. War die Zustandsübergangsfunktion vorher noch definiert für Übergänge in einzelne Paare von Folgezustand und zu schreibendes Kellerwort: δ∶ S × (E ∪ {λ}) × K → S × K ⋆ (det.)

118 | 3 Nichtdeterminismus: Ratende Automaten?

bildet sie jetzt ab in die Menge aller Teilmengen der möglichen solchen Paare, also, wieder ausgedrückt über die Potenzmenge: δ∶ S × (E ∪ {λ}) × K → ℘(S × K ⋆ ) (nichtdet.) Die komplizierten Teile der Definition, etwa Lambdaübergänge u. ä., bleiben gleich wie zuvor (nur die Restriktion bei Lambdaübergängen fällt weg). Nichtdeterministische Kellerautomaten sind folgendermaßen definiert:

Definition 3.3: Nichtdeterministischer Kellerautomat Ein nichtdeterministischer Kellerautomat ist ein 6-Tupel: A = (E, K, S, δ, s0 , F) Dabei haben alle Elemente dieselbe Bedeutung wie bei einem deterministischen Kellerautomaten (vgl. Definition 2.6 auf Seite 49), außer der Zustandsübergangsfunktion. Diese ist definiert als: δ∶ S × (E ∪ {λ}) × K → ℘(S × K ⋆ ) wobei es wieder zwei Varianten gibt. Ist für ein Eingabezeichen e ∈ E der Zustandsübergang δ(s, e, k) = {(s1 , v1 ), (s2 , v2 ), . . .}

Variante 1

definiert, und ist eines der Paare (s i , v i ) ∈ δ(s, e, k), dann wird wie üblich aus Zustand s ∈ S heraus und beim Lesen von e ∈ E auf dem Eingabeband und beim Lesen von k ∈ K im Keller dieses k gelöscht, stattdessen das Wort v i in den Keller geschrieben, und A geht in den Folgezustand s i über. Die Lese-/Schreibköpfe bewegen sich dabei wie im deterministischen Fall. Gibt es dagegen einen Zustandsübergang δ(s, λ, k) = {(s1 , v1 ), (s2 , v2 ), . . .}

Variante 2

dann wird das aktuell gelesene Eingabezeichen nicht beachtet und der Lesekopf auf dem Eingabeband nicht weiterbewegt, ansonsten aber alles wie bei Variante 1 ausgeführt. Im Unterschied zur deterministischen Version darf die zweite Variante δ(s, λ, k) auch dann definiert werden, wenn δ(s, e, k) für ein e ∈ E ebenfalls definiert ist.

Wie bei der nichtdeterministischen Turingmaschine wählt auch der nichtdeterministische Kellerautomat in jedem Schritt eine der Folgekonfigurationen aus δ(s, e, k). Zu

3.3 Nichtdeterminismus bei Kellerautomaten

| 119

beachten ist hier aber, dass auch eine der Folgekonfigurationen der Lambdaübergänge gewählt werden kann, wenn δ(s, λ, k) nicht die leere Menge ist. Für alle s ∈ S, e ∈ E und k ∈ K kann der Kellerautomat also in einem Schritt irgendeinen der Übergänge aus δ(s, e, k) ∪ δ(s, λ, k) nutzen. Die Menge der möglichen Übergänge charakterisiert dabei wie zuvor eine Unsicherheit bezüglich der aktuellen Konfiguration: Je mehr mögliche Übergänge es gibt, desto weniger wissen wir während einer Rechnung „von außen“, in welcher Konfiguration sich ein nichtdeterministischer Kellerautomat befindet. Wir wissen nur, dass er intern immer die richtige Folgekonfiguration auf dem Weg zur Endkonfiguration wählt. Nun müssen wir die Rechnung des nichtdeterministischen Kellerautomaten noch anhand der Übergangsrelation für Konfigurationen beschreiben. Die Konfigurationen selbst sind definiert wie zuvor, vgl. Definition 2.7 auf Seite 57. Die nichtdeterministische Übergangsrelation setzt (genauso wie bei Turingmaschinen) zwei Konfigurationen k1 , k2 genau dann zueinander in Beziehung: k1 ⊢ k2 wenn unter den durch δ definierten Regeln für k1 eine ist, welche k2 hervorruft.

Definition 3.4: Übergangsrelation für Konfigurationen nichtdeterministischer Kellerautomaten Die Relation

⊢A ⊆ (S × E⋆ × K ⋆ ) × (S × E⋆ × K ⋆ )

ist Übergangsrelation der Konfigurationen eines nichtdeterministischen Kellerautomaten A = (E, K, S, δ, s0 , F), wenn für alle Zustandsübergänge δ(s, e, k) = {d1 , . . . , d m }

mit d i ∈ S × K ⋆ , s ∈ S; e ∈ E ∪ {λ}, k ∈ K

und für alle Zeichenketten v ∈ K ⋆ und w ∈ E⋆ sowie für alle durch δ in einem Schritt definierten Regeln d i = (s′ , v′ ) genau die folgenden Beziehungen gelten: – e ≠ λ ⇒ (s, ew, kv) ⊢A (s′ , w, v′ v) – e = λ ⇒ (s, w, kv) ⊢A (s′ , w, v′ v) (Lambda-Übergang) Die reflexiv-transitive Hülle der Übergangsrelation ist wie immer gegeben durch ⊢⋆A , und das A lassen wir wie üblich weg, wenn unmissverständlich ist, was gemeint ist.

Wie bei Turingmaschinen wird auch bei einem nichtdeterministischen Kellerautomaten A ein Wort w ∈ E⋆ genau dann akzeptiert, wenn es eine Konfigurationenfolge von

120 | 3 Nichtdeterminismus: Ratende Automaten? der Startkonfiguration (s0 , w, k0 ) in eine Endkonfiguration (f , λ, v) mit f ∈ F, v ∈ K ⋆ gibt (wobei wie bei deterministischen Kellerautomaten die Eingabe vollständig abgearbeitet sein muss, der Kellerinhalt v aber beliebig sein darf): (s0 , w, k0 ) ⊢⋆ (f , λ, v) Die von A akzeptierte Sprache ist entsprechend: L(A) =def {w ∈ E⋆ ∣ A akzeptiert w} Die Definitionen mögen etwas unübersichtlich erscheinen, aber das folgende Beispiel zeigt gleich, wie Nichtdeterminismus bei Kellerautomaten funktioniert. Beispiel 3.3: Palindrome ohne Kennzeichnung der Mitte Wir betrachten die Sprache allgemeiner Palindrome, die ohne ein Spezialzeichen auskommen, das die Mitte kennzeichnet. Bei deterministischen Kellerautomaten hatten wir noch das Spezialzeichen M ∈ E mitgeführt, um dem Automaten mitteilen zu können, wann die Mitte des Wortes erreicht ist. Nichtdeterministische Kellerautomaten können die Wortmitte nun einfach erraten. Sei also die Sprache der allgemeinen Palindrome gegeben durch (dabei ist w′ das Spiegelbild von w): L Pal = {w ∈ {0, 1}⋆ ∣ w = w′ } Die Grundidee, diese Sprache zu erkennen, ist dieselbe wie bei der deterministischen Variante. In der ersten Hälfte des Wortes wird dieses zeichenweise in den Keller geschrieben. In der Mitte muss der Zustand gewechselt werden – wann das passieren soll, werden wir nichtdeterministisch erraten. Und in der zweiten Hälfte werden die Kellerzeichen nur dann gelöscht, wenn sie den jetzt gelesenen Zeichen der Eingabe entsprechen; anderenfalls gibt es keinen Übergang, und der Automat hält nicht-akzeptierend, weil die Eingabe noch nicht abgearbeitet worden ist. Dabei ergibt sich durch die LIFO-Art des Kellerzugriffs automatisch eine Umkehrung der Reihenfolge der Zeichen aus der ersten Hälfte, wenn sie beim Lesen der zweiten Hälfte wieder abgerufen werden. Die deterministische Variante hatte folgende Übergänge definiert: δ Pal−M (s0 , 0, k0 ) = (s0 , 0k0 ) ⎫ ⎪ ⎪ ⎪ ⎪ ⎪ δ Pal−M (s0 , 0, 0) = (s0 , 00) ⎬ Schreibe 0 in den Keller ⎪ ⎪ ⎪ ⎪ δ Pal−M (s0 , 0, 1) = (s0 , 01) ⎪ ⎭ δ Pal−M (s0 , 1, k0 ) = (s0 , 1k0 ) ⎫ ⎪ ⎪ ⎪ ⎪ ⎪ δ Pal−M (s0 , 1, 0) = (s0 , 10) ⎬ Schreibe 1 in den Keller ⎪ ⎪ ⎪ ⎪ δ Pal−M (s0 , 1, 1) = (s0 , 11) ⎪ ⎭ ⎫ δ Pal−M (s0 , M, k0 ) = (s1 , k0 ) ⎪ ⎪ ⎪ ⎪ ⎪ δ Pal−M (s0 , M, 0) = (s1 , 0) ⎬ Behandle Umkehrpunkt ⎪ ⎪ ⎪ ⎪ δ Pal−M (s0 , M, 1) = (s1 , 1) ⎪ ⎭

3.3 Nichtdeterminismus bei Kellerautomaten | 121

⎫ ⎪ ⎪ ⎬ Lösche aus Keller, solange korrekt ⎪ ⎪ δ Pal−M (s1 , 1, 1) = (s1 , λ) ⎭ δ Pal−M (s1 , λ, k0 ) = (s e , k0 ) Wechsle in Endzustand, wenn Keller leer

δ Pal−M (s1 , 0, 0) = (s1 , λ)

Für die nichtdeterministische Variante bleibt bis auf den Teil mit dem Umkehrpunkt alles beim Alten. Fast – denn wir müssen nun um die rechte Seite der Zuweisungen jeweils Mengenklammern schreiben, da die neue nichtdeterministische Übergangsfunktion δ Pal in Mengen abbildet (auch wenn diese einelementig sind): δ Pal (s0 , 0, k0 ) = {(s0 , 0k0 )} ⎫ ⎪ ⎪ ⎪ ⎪ ⎪ δ Pal (s0 , 0, 0) = {(s0 , 00)} ⎬ Schreibe 0 in den Keller ⎪ ⎪ ⎪ ⎪ δ Pal (s0 , 0, 1) = {(s0 , 01)} ⎪ ⎭ δ Pal (s0 , 1, k0 ) = {(s0 , 1k0 )} ⎫ ⎪ ⎪ ⎪ ⎪ ⎪ δ Pal (s0 , 1, 0) = {(s0 , 10)} ⎬ Schreibe 1 in den Keller ⎪ ⎪ ⎪ ⎪ δ Pal (s0 , 1, 1) = {(s0 , 11)} ⎪ ⎭ ⟨Umkehrpunkt-Behandlung fehlt noch⟩ ⎫ ⎪ δ Pal (s1 , 0, 0) = {(s1 , λ)} ⎪ ⎬ Lösche aus Keller, solange korrekt ⎪ ⎪ δ Pal (s1 , 1, 1) = {(s1 , λ)} ⎭ δ Pal (s1 , λ, k0 ) = {(s e , k0 )} Wechsle in Endzustand, wenn Keller leer Bis hierhin ist der Automat also vollkommen deterministisch. Allerdings kann s1 noch gar nicht erreicht werden, weil dafür erst der Umkehrpunkt gefunden werden muss; hier kommt der nichtdeterministische Ratezauber ins Spiel. Der Kellerautomat weiß nicht, wo die Wortmitte ist, weil er die Länge der Eingabe nicht kennt. Daher ist die nichtdeterministische Antwort auf die Frage, wo der Umkehrpunkt ist, sehr einfach: Er könnte überall sein. Also bauen wir an jeder möglichen Stelle der Eingabe eine Weiche hin zum Zustand s1 ein. Wir können das bewerkstelligen, indem wir für die drei möglichen Zeichen im Keller (k ∈ {0, 1, k0 }) jeweils einen Lambda-Übergang δ(s0 , λ, k) nach s1 definieren. Diese Übergänge können als Alternative zu den anderen regulären Übergängen δ(s0 , e, k) statt dieser ebenfalls genommen werden. Die deterministische Variante δ Pal−M unterscheidet sich also folgendermaßen von der nichtdeterministischen δ Pal (Unterstreichungen deuten die Unterschiede an): δ Pal−M (s0 , M, k0 ) = (s1 , k0 ) δ Pal−M (s0 , M, 0) = (s1 , 0) δ Pal−M (s0 , M, 1) = (s1 , 1)

δ Pal (s0 , λ, k0 ) = {(s1 , k0 )} vs.

δ Pal (s0 , λ, 0) = {(s1 , λ), (s1 , 0)} δ Pal (s0 , λ, 1) = {(s1 , λ), (s1 , 1)}

Der Rest des nichtdeterministischen Kellerautomaten ist wie folgt definiert: A Pal = ({0, 1}, {0, 1, k0 }, {s0 , s1 , s e }, δ Pal , s0 , {s e })

122 | 3 Nichtdeterminismus: Ratende Automaten?

e iπ

Dabei fällt noch auf, dass es für δ Pal (s0 , λ, 0) und δ Pal (s0 , λ, 1) jeweils einen zusätzlichen Übergang nach (s1 , λ) gibt, der in der deterministischen Variante nicht vorhanden war. Der Grund dafür liegt darin, dass Wörter aus L Pal−M immer ungerade Länge hatten (das M mitgezählt); Wörter aus L Pal können aber gerade oder ungerade Länge haben. Haben sie gerade Länge, wie etwa 0110 ∈ L Pal , dann ist das letzte Zeichen, das vor dem Wechsel nach s1 (an der korrekten Umschaltstelle) in den Keller geschrieben wurde, das letzte Zeichen aus der ersten Hälfte, und dieses muss später in s1 auch wieder ausgelesen werden. Daher belassen wir es im Keller – das sind die Übergänge nach (s1 , 0) bzw. (s1 , 1). Haben sie aber ungerade Länge, wie etwa 010 ∈ L Pal , dann wurde vor dem Umschalten nach s1 (an der entsprechenden korrekten Umschaltstelle) das Zeichen 1 in der Mitte bereits in den Keller geschrieben. Es hat aber keine Entsprechung in der zweiten Worthälfte, daher muss es vor dem Übergang nach s1 wieder aus dem Keller gelöscht werden – das sind die beiden Übergänge nach (s1 , λ). Man sieht an diesem Beispiel sehr schön, wie unmittelbar die nichtdeterministischen Übergänge aus den deterministischen hervorgehen. Statt nur beim Lesen von M nach s1 zu wechseln, wenn die Mitte sicher erreicht ist, kann einfach immer, in jedem möglichen Schritt durch die Lambdaübergänge nach s1 gewechselt werden.

Dabei muss allgemein natürlich genau überlegt werden, ob wirklich kein unerwünschter Pfad in eine akzeptierende Endkonfiguration führt. Aber in diesem Fall funktioniert das ohne weitere Schwierigkeiten.

Wir betrachten als Beispiel einen Berechnungsbaum von A pal bei Eingabe von 1001 ∈ L Pal

An jedem Knoten werden Eingabe, Position des Lesekopfes als Dach über dem entsprechenden Zeichen sowie (in der zweiten Zeile) Kellerinhalt und in Klammern der aktuelle Zustand dargestellt. (Die Position des Lesekopfes wird nicht mehr angezeigt, nachdem die Eingabe komplett eingelesen worden ist; die Position des Lese-/Schreibkopfes ist immer auf dem linkesten Zeichen des Kellers; links ist also „oben“.) Rechteckige Knoten entsprechen Situationen ohne Folgekonfiguration, wenn sie einen doppelten Rahmen haben, handelt es sich um akzeptierende Endkonfigurationen. Die Pfeile entsprechen der Konfigurations-Übergangsrelation und sind mit dem vom Eingabeband gelesenen Zeichen (e ∈ E oder λ) beschriftet. Der grau hinterlegte Pfad zeigt den hier einzigen akzeptierenden Rechenweg. (Im Allgemeinen kann es aber beliebig viele akzeptierende Rechenwege geben.)

3.3 Nichtdeterminismus bei Kellerautomaten | 123

 N   V   

 N   V   

 N   V   

 N  V   

 N  V   Ȝ

 N  V 

 Ȝ

 N   V   Ȝ

 N  V 

 Ȝ

 N   V   Ȝ

 N  V 

 Ȝ

 N   V 

 N   V   Ȝ

 N   V 

 Ȝ

 Ȝ

 Ȝ

 N   V H

 Ȝ

 N   V 

 N   V H

 

 N   V   

 N   V   Ȝ

 N   V H

DAR-10 | ID-16456 → Skript: S. 390 Auf dem korrekten Pfad, der zum Akzeptieren des Wortes führt, werden zwei Zeichen in Zustand s0 eingelesen, bevor in den Zustand s1 gewechselt wird. Von diesem Pfad zweigen aber immer wieder nicht-akzeptierende Sackgassen ab, bei denen der Automat testet, ob die Mitte erreicht wurde. Dieses Austesten passiert sowohl in der ersten Hälfte als auch in der zweiten Hälfte des Wortes, da der Automat bis zum Schluss nicht sicher sein kann, dass er die Mitte schon passiert hat. Es gibt sowohl Abzweigungen in zwei Unterpfade als auch solche, an denen drei Unterpfade entstehen. Letztere resultieren daraus, dass es sowohl einen passenden Übergang für das aktuell gelesene Zeichen e als auch zwei Lambdaübergänge gibt. Die Sackgasse, welche sich gleich ganz zu Beginn von der Startkonfiguration abspaltet, steht für den Test, ob die Eingabe das leere Wort λ ∈ L Pal ist.

Durch welche Alternative der zugehörige Übergang δ Pal (s0 , λ, k0 ) = (s1 , k0 )

e iπ

124 | 3 Nichtdeterminismus: Ratende Automaten?

ersetzt werden könnte, um in gewissen Situationen einen Rechenschritt einzusparen, können Sie selbst überlegen.

Weitere Eigenschaften von Kellerautomaten Intuitiv scheint es keine Möglichkeit für einen deterministischen Kellerautomaten zu geben, die im Beispiel behandelte Sprache der allgemeinen Palindrome zu erkennen, da er die Mitte des Wortes nicht erraten kann. Wir werden diese (korrekte) Vermutung nicht beweisen, aber dennoch feststellen, dass deterministische Kellerautomaten nicht alle Sprachen erkennen können, die von nichtdeterministischen Kellerautomaten erkannt werden können. Ein nichtdeterministischer Kellerautomat erkennt allerdings wiederum weniger Sprachen als ein deterministischer LBA (vgl. Tabelle 3.1 am Ende dieses Kapitels). Eine typische Sprache, welche von einem deterministischen LBA, aber nicht von einem Kellerautomaten erkannt werden kann, ist {a n b n c n ∣ n ∈ N}. Intuitiv kann man sich vorstellen, dass ein Kellerautomat zunächst alle a’s einlesen kann, diese danach aber beim Lesen der b’s wieder löschen muss, um die gleiche Anzahl an a’s und b’s zu gewährleisten. Wenn dann die c’s kommen, ist der Keller leer, und es ist nicht mehr bekannt, wie viele c’s es sein müssen. Formal kann diese Einsicht mithilfe des PumpingLemmas für kontextfreie Sprachen bewiesen werden, vgl. Kapitel 5, Seite 219. Insgesamt ergeben sich daher folgende Beziehungen: ?

LDKA ⊊ LKA ⊊ LDLBA = LLBA ⊊ LDTM = LTM Ein nichtdeterministischer Kellerautomat kann in ähnlicher Weise deterministisch simuliert werden, wie wir das bei nichtdeterministischen Turingmaschinen gesehen haben. Bezüglich der Rechenzeit sind sowohl deterministische als auch nichtdeterministische Kellerautomaten etwas unhandlich zu untersuchen. Das liegt an den LambdaÜbergängen, welche die Anzahl der Rechenschritte für eine gegebene Eingabe auf recht unübersichtliche Weise aufblähen können. Ohne Lambda-Übergänge werden, wie bei endlichen Automaten, für jede Eingabe w genau n = ∣w∣ Rechenschritte benötigt. Letztendlich interessiert uns aber vor allem, wie lange die Berechnung auf einem deterministischen und Turing-mächtigen Modell dauert. Eine deterministische Registermaschine bzw. ein höhersprachlicher deterministischer Algorithmus benötigen im schlimmsten Fall O(n3 ) Rechenschritte auf einer Eingabe der Länge n, um das Wortproblem für eine Sprache zu lösen, die von einem nichtdeterministischen Kellerautomaten erkannt werden kann (das leistet etwa der Cocke-Younger-KasamiAlgorithmus, vgl. Kapitel 4, Seite 176; eine 1-Band-Turingmaschine benötigt dagegen mehr, aber immer noch polynomielle Zeit). Für Sprachen, die von einem deterministischen Kellerautomaten erkannt werden können, ist sogar nur lineare Zeit O(n) erforderlich.

3.4 Nichtdeterminismus bei endlichen Automaten | 125

3.4 Nichtdeterminismus bei endlichen Automaten Nichtdeterminismus bei endlichen Automaten ist einfacher zu verstehen als das bei den anderen Automatentypen der Fall war. Nicht dass sich an der Grundidee (der Frage nach der Existenz eines akzeptierenden Rechenweges) etwas ändern würde. Aber da endliche Automaten kein Arbeitsband haben, bezieht sich der Nichtdeterminismus hier nur auf die Unsicherheit bezüglich des aktuellen Zustands. Ein nichtdeterministischer endlicher Automat kann in jedem Schritt aus mehreren Folgezuständen wählen, was aber nur dazu führt, dass er sich während der Rechnung immer nichtdeterministisch in einem Zustand s ∈ S′ aus einer Menge potentieller Zustände S′ ⊆ S befindet. Der Rest seiner Konfiguration, nämlich die Position des Lesekopfes im Eingabewort, bleibt (zumindest ohne Lambdaübergänge) deterministisch. Aus deterministischer Perspektive kann man sich daher die nichtdeterministische Rechnung vorstellen, als durchliefe der endliche Automat nicht einzelne Zustände, sondern die Zustandsteilmengen S′ , wobei in jedem Schritt die gesamte Menge potentieller Zustände, in denen sich der Automat befinden könnte, zu S′ gezählt wird. Am Ende der Rechnung stellt sich nur noch die Frage, ob einer dieser Zustände ein Endzustand ist und die Eingabe somit akzeptiert werden soll. Durch die Nutzung eines Arbeitsbandes ist bei Turingmaschinen (darunter LBA) und Kellerautomaten die Menge der möglichen Konfigurationen unbeschränkt. Deshalb werden nichtdeterministische Rechnungen im Allgemeinen durch Bäume dargestellt, die sich beliebig verzweigen können und durch die sich der Automat auf mystische Weise zielsicher von der Wurzel aus auf eine Endkonfiguration zubewegt. Dagegen kann bei endlichen Automaten auf Intuitionsstützen wie „Raten“ und „Klonen“ eigentlich verzichtet werden, weil der Nichtdeterminismus hier als eine Art verkleideter Determinismus angesehen werden kann. Da es nur endlich viele Zustände gibt, gibt es auch nur endlich viele Teilmengen potentieller Zustände. Daher kann die nichtdeterministische Rechnung durch die Vorstellung ersetzt werden, dass sich ein deterministischer endlicher Automat durch einen (viel größeren, aber immer noch endlichen) Zustandsraum dieser Teilmengen bewegt. In diesem Sinn bewirkt der Nichtdeterminismus letztendlich nur eine Kompression der Zustandszahl, ohne wirklich ein neues Berechnungskonzept einzuführen. Das ist überhaupt nicht mystisch und kann sogar sehr schön graphisch dargestellt werden. Bevor wir zur formalen Beschreibung des Nichtdeterminismus bei endlichen Automaten kommen, betrachten wir daher einfach einmal als Beispiel einen beliebigen nichtdeterministischen endlichen Automaten. Die Frage, welche Sprache er erkennt, interessiert uns hier noch nicht. Wir wollen zunächst einfach versuchen, intuitiv nachzuvollziehen, was während der nichtdeterministischen Rechnung dieses Automaten passiert.

126 | 3 Nichtdeterminismus: Ratende Automaten?

e iπ

Laden Sie den Automaten am besten auch im XWizard (indem Sie unter www.xwizard.de „ID-16463“ ins Eingabefeld tippen und auf „Draw“ klicken) und klicken Sie ein paarmal auf „Simuliere einen Schritt“. Sie werden daraufhin den Berechnungsablauf des Automaten auf der Eingabe babaabbb sehen. Intuitiv wird sehr schnell klar, wie die Rechnung abläuft.

Nicht vergessen werden darf allerdings, dass das eine deterministische Sicht auf die nichtdeterministische Rechnung ist. Die markierten Zustände stellen im nichtdeterministischen Sinne die Zustandsmenge dar, aus denen sich der Automat einen ausgesucht hat. In der deterministischen Vorstellung tun wir so, als hätte er sie alle gleichzeitig besucht.

Beispiel 3.4: Irgendein nichtdeterministischer endlicher Automat Gegeben sei also „irgendein“ nichtdeterministischer endlicher Automat wie folgt (nichtdeterministisch ist er etwa schon ganz zu Beginn, wenn vom Startzustand aus über b sowohl nach s0 als auch nach s6 gesprungen werden kann): A = ({a, b}, {s0 , . . . , s6 }, δ, s0 , {s0 , s2 }) δ:













 

 



 



 

  





 

 

DAR-11 | ID-16463 → Skript: S. 390

3.4 Nichtdeterminismus bei endlichen Automaten

| 127

Auf eine Eingabe hin springt der Automat, wie zuvor sein deterministisches Gegenstück, durch die Zustandsmenge, nur dass jetzt mehrere Folgezustände (oder auch gar keiner) für ein Eingabezeichen existieren können. Für die Beispieleingabe babaabbb startet A also wie immer in s0 ; damit ist zu Beginn S′ ∶= {s0 } die Menge potentieller Zustände. Danach entwickelt sich diese Menge folgendermaßen weiter: – Der Automat springt über b in einen der Folgezustände s0 oder s6 , wodurch die Menge potentieller Zustände zu S′ ∶= {s0 , s6 } wird. – Über a kann er jetzt s3 (von s0 aus) und s4 (von s6 aus) erreichen, also ergibt sich S′ ∶= {s3 , s4 }. – Über die b-Pfeile aus s4 heraus kann er nun nach s1 oder s4 kommen, während s3 eine Sackgasse darstellt; also erhalten wir S′ ∶= {s1 , s4 }. – Dann führen beide a-Pfeile nach s5 , also wird S′ ∶= {s5 }. – Von dort aus geht es über a wieder in die zweielementige Menge S′ ∶= {s4 , s6 }, – dann über b nach S′ ∶= {s1 , s6 }, – von wo aus über b gleich eine Menge aus fünf Zuständen S′ ∶= {s0 , s1 , s2 , s4 , s5 } erreicht werden kann, – die über b endlich zur finalen Menge von sechs Zuständen führt: S′ ∶= {s0 , s1 , s2 , s4 , s5 , s6 } Sie werden erraten, dass die Tatsache, dass mindestens einer der Zustände in der finalen Menge s′ ein Endzustand ist, dazu führt, dass das Wort akzeptiert wird. Das ist bei endlichen Automaten äquivalent dazu, dass ein akzeptierender Pfad von der Start- in eine Endkonfiguration existiert. Diese intuitive Beschreibung müssen wir nun noch formalisieren, um mit nichtdeterministischen endlichen Automaten auch sauber in Algorithmen und Beweisen arbeiten zu können. Das werden wir insbesondere benötigen, wenn wir später einen (sehr einfachen) Algorithmus zur Umwandlung eines nichtdeterministischen in einen deterministischen endlichen Automaten kennenlernen. Ein nichtdeterministischer endlicher Automat ist daher folgendermaßen definiert (auf Lambdaübergänge verzichten wir wieder – der Einfachheit halber):

Definition 3.5: Nichtdeterministischer endlicher Automat Ein nichtdeterministischer endlicher Automat A ist ein 5-Tupel: A = (E, S, δ, s0 , F) wobei alle Elemente dieselbe Bedeutung haben wie bei deterministischen endlichen Automaten (vgl. Definition 2.9 auf Seite 66), außer der Übergangsfunktion, die für s ∈ S und e ∈ E wie folgt definiert wird: δ∶ S × E → ℘(S) ∶ δ(s, e) = {s1 , s2 , . . .}

128 | 3 Nichtdeterminismus: Ratende Automaten?

Der Automat wechselt also vom Zustand s aus beim Lesen von e in einen der Zustände aus der Menge δ(s, e). Da diese Menge auch leer sein darf, kann ein nichtdeterministischer endlicher Automat auch halten, bevor die Eingabe abgearbeitet worden ist. Er akzeptiert seine Eingabe, wenn ein Berechnungspfad existiert, der nach Abarbeiten der ganzen Eingabe zu einem Endzustand führt.

Bei der Rechnung eines nichtdeterministischen endlichen Automaten kann kein beliebig weitverzweigter Berechnungsbaum entstehen; stattdessen definiert die Teilmenge S′ ⊆ S der Zustände, in denen er sich gerade potentiell befinden kann, seinen inneren Zustand während einer Rechnung hinreichend. Wie im Beispiel gezeigt, können wir für eine deterministische Simulation daher einfach in jedem Rechenschritt diese potentielle Zustandsmenge bestimmen, die größer und kleiner und sogar leer werden kann. Aus dieser Sicht wechselt ein nichtdeterministischer endlicher Automat A, der sich gerade in der potentiellen Zustandsmenge S′ ⊆ S befindet und ein Eingabezeichen e liest, im nächsten Zustand in die folgende potentielle Zustandsmenge: ⋃ δ(s, e)

s∈S′

Die Konfigurationen nichtdeterministischer endlicher Automaten definieren wir, wie bei der deterministischen Variante (vgl. Definition 2.10 auf Seite 69), als Tupel aus aktuellem Zustand und zu verarbeitendem Restwort: (s, w) ∈ S × E⋆



Wir könnten stattdessen die Konfigurationen auch als Tupel (S′ , w) ∈ ℘(S) × E⋆ (von aktueller potentieller Zustandsteilmenge S′ und noch zu verarbeitendem Restwort w) definieren. Das würde direkt zu einer deterministischen Version des nichtdeterministischen endlichen Automaten führen. Dabei könnte die Übergangsrelation identisch zur deterministischen Variante definiert werden, wenn die potentiellen Zustandsmengen S′ ⊆ S wie eigene Zustände s[S′ ] eines erweiterten Zustandsraums aufgefasst würden. Tatsächlich kann auf diese Weise der nichtdeterministische endliche Automat ganz direkt in einen äquivalenten deterministischen endlichen Automaten überführt werden, vgl. Seite 131.

Die Übergangsrelation wird dann ganz analog zu den anderen nichtdeterministischen Modellen definiert:

3.4 Nichtdeterminismus bei endlichen Automaten

| 129

Definition 3.6: Übergangsrelation für Konfigurationen nichtdeterministischer endlicher Automaten Die Relation

⊢A ⊆ (S × E⋆ ) × (S × E⋆ )

ist Übergangsrelation der Konfigurationen eines nichtdeterministischen endlichen Automaten A = (E, S, δ, s0 , F), wenn sich für alle Zustandsübergänge δ(s, e) = {s1 , . . . , s m }

mit s, s i ∈ S; e ∈ E

und für alle Zeichenketten w ∈ E⋆ genau die folgenden Beziehungen ergeben: ∀s i ∈ δ(s, w) ∶ (s, ew) ⊢A (s i , w) Wie immer ist die reflexiv-transitive Hülle der Übergangsrelation gegeben durch ⊢⋆A , wobei das A weggelassen wird, wann immer diese Vereinfachung nicht zu Missverständnissen führen kann.

Wir betrachten nun als weiteres Beispiel einen nichtdeterministischen endlichen Automaten für die Sprache L mod (vgl. Seite 36). Beispiel 3.5: Nichtdeterministischer endlicher Automat für die Sprache L mod Der endliche Automat wird sehr ähnlich zu der nichtdeterministischen Turingmaschine konstruiert, die wir auf Seite 105 für diese Sprache betrachtet haben. Ihr Verhalten ist durch folgende Turingtafel gegeben:

s0 s1 s2 s3 s4 s5 sf

a

b



{(s2 , a, R), (s3 , a, R)} {(s2 , a, R)} {(s1 , a, R), (s5 , a, R)} {(s3 , a, R)} {(s4 , a, R)} ∅ ∅

{(s1 , b, R), (s4 , b, R)} {(s1 , b, R)} {(s2 , b, R)} {(s4 , b, R)} {(s3 , b, R), (s5 , b, R)} ∅ ∅

∅ ∅ ∅ ∅ ∅ (s f , ⋆, N)} ∅

Die Turingmaschine läuft in jedem Rechenschritt nach rechts, ohne das Band zu verändern (anders ausgedrückt, schreibt sie immer das Zeichen, das sie gelesen hat, auch wieder auf das Band zurück). Sie „nutzt“ ihren Bandspeicher daher nicht und verhält sich im Wesentlichen wie ein nichtdeterministischer endlicher Automat. Wir können

130 | 3 Nichtdeterminismus: Ratende Automaten?

e iπ

diese Turingmaschine als Vorlage nehmen und den endlichen Automaten analog konstruieren. Dabei wird er sogar noch etwas einfacher, weil endliche Automaten am Ende der Eingabe automatisch halten. Wir müssen also nur alle Zustandsübergänge zwischen den Zuständen s0 bis s5 genauso für den endlichen Automaten umsetzen, und können uns den Zustand s f sparen, wenn gleich s5 als Endzustand deklariert wird. Beim endlichen Automaten ist also die Bedeutung der Zustände von s0 bis s5 genau dieselbe wie bei der Turingmaschine. Von s0 aus wird nichtdeterministisch entschieden, ob a’s oder b’s gezählt werden sollen, das tatsächliche Zählen findet in den Zustandspaaren s1 , s2 (a) bzw. s3 , s4 (b) statt und in Zustand s5 wird geprüft, ob das Wortende erreicht wurde. Der einzige Unterschied zur Turingmaschinen-Version ist, dass diese letzte Prüfung nicht durch das Lesen des ⋆-Symbols passiert, da der endliche Automat am Ende des Wortes automatisch hält und genau dann akzeptiert, wenn er sich in einem Endzustand befindet. Wird also der Endzustand s5 erreicht, bevor das Wort zu Ende gelesen wurde, kann auf dem entsprechenden Pfad nicht akzeptiert werden, weil es keine Folgezustände mehr gibt. Nur falls dieser Zustand am Wortende erreicht wird (bzw. falls im Berechnungsbaum mindestens ein Pfad dazu führt, dass dieser Zustand am Wortende erreicht wird), akzeptiert der Automat. Es ergibt sich der im Folgenden abgebildete nichtdeterministische endliche Automat für L mod . Als Beispiel ist der akzeptierende Weg durch das Zustandsüberführungsdiagramm bei Eingabe des Wortes aabab ∈ L mod in der Abbildung fett gezeichnet. Versuchen Sie selbst, alle nicht-akzeptierenden Wege für dieses Wort zu finden (es gibt zwei).

A = ({a, b}, {s0 , . . . , s5 }, δ, s0 , {s5 }) δ:

  





  

 





  

  





DAR-12 | ID-3763 → Skript: S. 391

3.4 Nichtdeterminismus bei endlichen Automaten | 131

Umwandlung nichtdeterministischer in deterministische endliche Automaten Wie das Beispiel zeigt, ist die Sprache L mod durch einen nichtdeterministischen endlichen Automaten erkennbar, also ohne Arbeitsband und mit einem Speicher von konstanter Größe. Turingmaschine, LBA und Kellerautomat sind dafür also eigentlich „überqualifiziert“. Es bleibt die Frage, ob auch ein deterministischer endlicher Automat diese Sprache erkennen könnte, bzw. allgemeiner, ob es überhaupt Sprachen gibt, die ein nichtdeterministischer endlicher Automat erkennen kann, aber ein deterministischer nicht. Wir haben diese Frage eigentlich schon beantwortet, indem wir erkannt haben, dass für die deterministische Simulation eines nichtdeterministischen endlichen Automaten A = (E, S, δ, s0 , F) nicht mehr erforderlich ist als die potentielle Zustandsmenge S′ ⊆ S während der gesamten Rechnung mitzuführen. Da es nur endlich viele solcher Teilmengen von S geben kann, kann ein deterministischer endlicher Automat A det = (E, S det , δ det , s0det , F det ) das leisten, wenn er für jede (erreichbare) Zustandskombination S′ ⊆ S von A einen eigenen Zustand erhält. Anders gesagt fassen wir jede potentielle Zustandsmenge {s1 , s2 , . . .} einfach als eigenen Zustand auf, und A det merkt sich das aktuelle S′ in der Rechnung von A, indem er genau dann in den Zustand S′ springt, wenn A’s potentielle Zustandsmenge S′ gewesen wäre.

Lassen Sie sich nicht davon verwirren, dass die Zustände nun wie Zustandsteilmengen aussehen. Das sind nur Benennungen, die beliebig gewählt werden dürfen. Später und in der Praxis werden wieder handlichere Symbole zur Benennung eingeführt, um den entstehenden deterministischen Automaten zu konstruieren.

Da A akzeptiert, wenn ein akzeptierender Rechenweg existiert, wenn also die potentielle Zustandsmenge nach dem Einlesen der Eingabe einen Endzustand enthält, müssen auch alle Zustände S′ zu Endzuständen von A det werden, für die S′ einen Endzustand von A enthält. Das „Verfahren“ zur Umwandlung eines nichtdeterministischen endlichen Automaten in einen deterministischen endlichen Automaten (die sogenannte Potenzmengenkonstruktion) ist zunächst also nur eine Umdefinition. Die Zustandsteilmengen von A werden in A det jeweils als eigene Zustände aufgefasst, sodass der neue Automat „durch die Mengen potentieller Zustände des alten Automaten springt“. Die Funktion δ wird entsprechend angepasst, sodass aus einem Zustand, der einer gewissen Zustandsteilmenge im alten Automaten entspricht, in den Folgezustand gesprungen

e iπ

132 | 3 Nichtdeterminismus: Ratende Automaten?

wird, welcher der korrekten Folge-Teilmenge des alten Automaten entspricht. Der deterministische endliche Automat ist durch folgende Elemente definiert: S det =def ℘(S),

Alle Teilmengen der Zustandsmenge

s0det =def {s0 }

Menge, die Startzustand enthält





F det =def {S ⊆ F ∣ S ∩ F ≠ ∅}

Teilmengen, die Endzustand enthalten

δ det ∶ S det × E → S det mit δ det (S′ , e) =def ⋃ δ(s, e) s∈S′

e iπ

für alle S′ ⊆ S, e ∈ E

Diese Definition setzt die Idee wie gewünscht um, was leicht eingesehen werden kann. Der neue Automat A det startet in der einelementigen Menge, welche den alten Startzustand s0 von A enthält. Alle Zustände aus S det , die einen Endzustand aus F enthalten, werden auch zu Endzuständen im neuen Automaten A det . Die Übergangsfunktion δ det vereinigt alle Folgezustände aus allen Übergängen für die aktuelle potentielle Zustandsmenge von A, sodass der neue Zustand von A det gerade der neuen potentiellen Zustandsmenge von A entspricht. Auf diese Weise durchläuft A det für eine Eingabe w in seinen Zuständen genau diejenigen Zustandsteilmengen von A, die der Folge potentieller Zustandsmengen von A bei derselben Eingabe entsprechen. Und da am Ende der Rechnung genau diejenigen Zustandsteilmengen von A Endzustände in A det sind, welche einen Endzustand aus A enthalten, akzeptiert A det genau die Wörter, die A akzeptiert.

Falls Sie bei dieser Beschreibung nicht mitgekommen sind, versuchen Sie sie anhand des Beispiels auf Seite 126 bzw. der Simulation durch den XWizard nachzuvollziehen.

e iπ

Nun könnten wir es rein formal dabei belassen, denn wir haben damit gezeigt, dass jeder nichtdeterministische endliche Automat eine direkte deterministische Entsprechung hat. Auch eine deterministische Simulation kann auf Basis des ursprünglichen nichtdeterministischen Automaten genauso durchgeführt werden, wie nach der Umwandlung in einen deterministischen (vgl. beispielsweise die Simulation im XWizard). Oft ist diese Umwandlung, die mit einer exponentiellen Aufblähung der Zustandsanzahl einhergeht (denn es gilt ∣℘(S)∣ = 2∣S∣ ), also gar nicht nötig. In der Praxis gibt es aber Situationen, wo endliche Automaten (bzw. daraus hervorgehende Modelle) tatsächlich „gebaut“ werden sollen. So kann in der Chipherstellung der Entwurf einer logischen Schaltung durch endliche Automaten modelliert werden. In diesen Fällen kann man tatsächlich an der Konstruktion eines deterministischen endlichen Automaten interessiert sein. Deshalb wollen wir obiges Schema in ein etwas handlicheres Format überführen und dabei gleich durch das Ignorieren unerreichbarer Zustandsteilmengen eine Effizienzsteigerung erzielen.

3.4 Nichtdeterminismus bei endlichen Automaten | 133

Auf diese Weise kann in manchen Fällen (aber nicht immer!) die exponentielle Aufblähung der Zustandsmenge vermieden werden. Minimal ist der entstehende Automat im Allgemeinen aber nicht. Ist das erwünscht, muss im Anschluss noch der Reduktionsalgorithmus für deterministische endliche Automaten aus Kapitel 2, ab Seite 72, durchgeführt werden.

Dieses einfache Verfahren führen wir beispielhaft an unserem nichtdeterministischen endlichen Automaten für die Sprache L mod vor, um einen deterministischen endlichen Automaten zu erhalten. Die Beschreibung erfolgt also während der Anwendung. Beispiel 3.6: Potenzmengenkonstruktion für die Sprache L mod Wir stellen zunächst eine Zustandsübergangstabelle auf, in der die Übergänge des nichtdeterministischen endlichen Automaten für L mod (vgl. Seite 129) bei Eingabe von a bzw. b für jeden Zustand eingetragen sind:

s0 s1 s2 s3 s4 s5

a

b

{s2 , s3 } {s2 } {s1 , s5 } {s3 } {s4 } ∅

{s1 , s4 } {s1 } {s2 } {s4 } {s3 , s5 } ∅

Nun beginnen wir mit der Potenzmengenkonstruktion, wodurch Zustandsmengen an die Stelle von Zuständen treten. Die Zustände in der ersten Spalte der Tabelle für den nichtdeterministischen Automaten werden deshalb durch Zustandsmengen in der Tabelle für den deterministischen Automaten ersetzt. In die übrigen Zellen werden weiterhin Mengen eingetragen, nur stehen diese in der neuen Tabelle für neue einzelne Zustände. Die Menge {s0 } ist als Startzustand auf jeden Fall in der Zustandsmenge S det des deterministischen Automaten enthalten; das ist einleuchtend, da {s0 } dem neuen und gleichzeitig s0 dem alten Startzustand entspricht. Daher schreiben wir {s0 } zu Beginn mit allen Übergängen von s0 aus in die erste Zeile der Zustandsübergangstabelle des neuen Automaten:

{s0 }

a

b

{s2 , s3 }

{s1 , s4 }

Nun kennen wir zwei weitere erreichbare Zustände, nämlich die Zustandsmengen {s2 , s3 } und {s1 , s4 }. Diese schreiben wir als nächstes in die Tabelle und geben

134 | 3 Nichtdeterminismus: Ratende Automaten?

als ihre Folgezustände die Vereinigungen der Folgezustandsmengen der jeweiligen beiden Zustände im nichtdeterministischen Automaten an:

{s0 } {s2 , s3 } {s1 , s4 }

a

b

{s2 , s3 } {s1 , s5 } ∪ {s3 } {s2 } ∪ {s4 }

{s1 , s4 } {s2 } ∪ {s4 } {s1 } ∪ {s3 , s5 }

Auch durch diese vier neuen Übergänge werden weitere Zustände erreicht, jeweils zwei sind aber identisch, sodass es nun die zwei neuen erreichbaren Zustände {s1 , s3 , s5 } und {s2 , s4 } gibt. Sie kommen als nächstes in die Tabelle:

{s0 } {s2 , s3 } {s1 , s4 } {s1 , s3 , s5 } {s2 , s4 }

a

b

{s2 , s3 } {s1 , s3 , s5 } {s2 , s4 } {s2 } ∪ {s3 } ∪ ∅ {s1 , s5 } ∪ {s4 }

{s1 , s4 } {s2 , s4 } {s1 , s3 , s5 } {s1 } ∪ {s4 } ∪ ∅ {s2 } ∪ {s3 , s5 }

Auch diesmal sind zwei Zustände entstanden, die wir noch nicht behandelt haben: {s1 , s4 , s5 } und {s2 , s3 , s5 }. Auch diese tragen wir in die Tabelle ein (nun gleich als einzelne Mengen geschrieben):

{s0 } {s2 , s3 } {s1 , s4 } {s1 , s3 , s5 } {s2 , s4 } {s1 , s4 , s5 } {s2 , s3 , s5 }

a

b

{s2 , s3 } {s1 , s3 , s5 } {s2 , s4 } {s2 , s3 } {s1 , s4 , s5 } {s2 , s4 } {s1 , s3 , s5 }

{s1 , s4 } {s2 , s4 } {s1 , s3 , s5 } {s1 , s4 } {s2 , s3 , s5 } {s1 , s3 , s5 } {s2 , s4 }

Die neuen Übergänge führen nun alle zu Zuständen, die wir bereits eingetragen haben, also sind wir fertig. Der neue Automat hat sieben Zustände, und die Zustandsübergangsfunktion δ det ist durch die Tabelle gegeben. Wir könnten also direkt den neuen Automaten aus der Tabelle ablesen, indem die Mengen als Zustandsnamen behandelt werden. Um den neuen Automaten etwas übersichtlicher zu gestalten, benennen wir zuvor allerdings die Zustände nach dem bekannten Muster s0 , s1 , s2 usw. um. Die Benennung ist völlig willkürlich; wir wählen hier aber aus Konsistenzgründen die Benennung, welche auch der Algorithmus des XWizards nutzt (sie entsprechen nicht exakt der Reihenfolge der Zustände in der Tabelle):

3.4 Nichtdeterminismus bei endlichen Automaten | 135

– – – – – – –

s0 =ˆ {s0 }, s1 =ˆ {s1 , s4 }, s2 =ˆ {s2 , s3 }, s3 =ˆ {s2 , s4 }, s4 =ˆ {s1 , s3 , s5 }, s5 =ˆ {s1 , s4 , s5 }, s6 =ˆ {s2 , s3 , s5 }

Dabei müssen s4 , s5 und s6 als Endzustände definiert werden, da sie den ursprünglichen Endzustand s5 enthalten. Nun können wir den deterministischen endlichen Automaten für L mod folgendermaßen angeben: A = ({a, b}, {s0 , . . . , s6 }, δ det , s0 , {s4 , s5 , s6 }) δ det :



 

 

 



 



 

 



 







DAR-13 | ID-3764 → Skript: S. 391 Die Übergänge bei der Abarbeitung des Wortes aabab ∈ L mod sind wieder fett hervorgehoben. In diesem Fall ist der entstandene Automat sogar minimal, wie Sie zur Übung durch Aufstellen einer Minimierungstabelle selbst zeigen können.

Ein oft vergessener Spezialfall entsteht, wenn in der Tabelle der Potenzmengenkonstruktion von einem Zustand aus gar keine Übergänge existieren (so wie es in unserem Beispiel der Fall wäre, wenn etwa der Zustand {s5 } erreichbar wäre). Die entsprechenden Zellen der Tabelle sind dann nicht etwa leerzulassen, sondern es muss ordnungsgemäß die leere Menge ∅ eingetragen werden, welche auch als normaler Zustand des neuen Automaten berücksichtigt werden muss. Sie wird automatisch zum nicht-akzeptierenden „Senkenzustand“, der nur Übergänge zu sich selbst hat.

e iπ

136 | 3 Nichtdeterminismus: Ratende Automaten?

Weitere Eigenschaften endlicher Automaten Die Potenzmengenkonstruktion zeigt, dass nichtdeterministische und deterministische endliche Automaten dieselben Sprachen erkennen können. Damit ist auch klar, dass nichtdeterministische endliche Automaten weniger Sprachen erkennen können als deterministische Kellerautomaten, da wir das bereits für deterministische endliche Automaten festgestellt haben. Es ergeben sich insgesamt folgende Beziehungen: ?

LDEA = LEA ⊊ LDKA ⊊ LKA ⊊ LDLBA = LLBA ⊊ LDTM = LTM

e iπ

Der Zeit- und Platzbedarf endlicher Automaten ist sehr einfach zu bestimmen. Sowohl nichtdeterministische als auch deterministische endliche Automaten führen immer genau n Schritte auf einer Eingabe der Länge n aus, und beide haben einen konstanten Speicher endlicher Größe, welche der Anzahl der Zustände entspricht. Endliche Automaten sind strukturell ähnlich zu Turingmaschinen. Diese können die Arbeitsweise endlicher Automaten simulieren, indem sie auf die Beschreibbarkeit des Arbeitsbandes verzichten und die Eingabe schrittweise von links nach rechts einlesen, ohne sie zu verändern. Deshalb sind Probleme, die auf endlichen Automaten lösbar sind, auch auf Turingmaschinen in linearer Zeit bzw. mit konstantem Platz lösbar. Probleme, die durch endliche Automaten gelöst werden können, gehören zu den einfachsten, die es gibt.

Der Platz, den die Eingabe verbraucht, darf dabei natürlich nicht mitgezählt werden. Zu diesem Zweck werden üblicherweise drei Bänder eingeführt, wie in Kapitel 2 auf Seite 43 beschrieben.

3.5 Zusammenfassung Wir haben in diesem und dem vorangegangenen Kapitel insgesamt acht Automatentypen kennengelernt (vier deterministische und jeweils eine dazugehörige nichtdeterministische Variante). Dabei haben wir insbesondere überlegt, welche Sprachklassen durch diese Automatentypen akzeptiert werden können. Diese Ergebnisse fassen wir im Folgenden zunächst zusammen. Danach rekapitulieren wir die wichtigsten weiteren Resultate zum Nichtdeterminismus (und einen Aspekt, den wir bewusst ausgeklammert haben). Insbesondere befassen wir uns noch einmal mit den Grenzen der intuitiven Metaphern, mit denen wir uns dem Nichtdeterminismus – einem eigentlich rein mathematischen Konzept – genähert haben.

3.5 Zusammenfassung

| 137

Tab. 3.1. Von Automaten erkennbare Sprachklassen. Die Bezeichnungen Li in der ersten Spalte stehen für die zu dem jeweiligen Automatentypen gehörenden Klassen der Chomsky-Hierarchie, die im nächsten Kapitel eingeführt wird. Die Abkürzung „Det.“ steht für deterministische Automaten. Chomsky-Klasse

Automaten

L0

Turingmaschine

=

L1 ?

LBA Det. LBA

=

L2 LR(k), vgl. Unterkapitel 4.5

Kellerautomat Det. Kellerautomat

L3

Endlicher Automat

Det. Turingmaschine

?

=

Det. endlicher Automat

Sprachmächtigkeit der vorgestellten Automatentypen In Tabelle 3.1 sind die Ergebnisse zur Sprachmächtigkeit der verschiedenen Automatentypen zusammengefasst. Für nichtdeterministische Automaten lassen wir hier das Wort „nichtdeterministisch“ weg und kennzeichnen nur die deterministischen Varianten explizit. Die Bezeichnung Li für i ∈ {0, . . . , 3} bezieht sich auf die Sprachklassen nach Chomsky. Erstaunlicherweise können die durch Automaten definierten Sprachklassen auch auf andere einfache Arten definiert werden, insbesondere durch die sogenannten Chomsky-Grammatiken, die wir im nächsten Kapitel kennenlernen werden. Sogar die Sonderstellung der deterministischen Kellerautomaten kann dabei durch eine spezielle Grammatikform, die LR(k)-Grammatiken, erfasst werden. Auf Automatenebene erkennen Turingmaschinen die größte Klasse an Sprachen. Wir haben gesehen, dass dabei die nichtdeterministische Variante nicht mehr Sprachen erkennen kann als die deterministische. Bei LBA ist die Frage offen, ob durch Nichtdeterminismus mehr Sprachen erkannt werden können als ohne. Die ChomskyKlasse L1 bezieht sich hier auf nichtdeterministische LBA, es könnte also sein, dass deterministische LBA zu einer Zwischenklasse gehören, die nicht alle Sprachen des Typs 1 erkennen können. Für diese hypothetische Zwischenklasse ist allerdings kein Grammatiktyp bekannt. Für Kellerautomaten ist dagegen bekannt, dass durch Nichtdeterminismus echt mehr Sprachen erkannt werden können als ohne. In der Chomsky-Hierarchie gehören zu L2 alle Sprachen, die durch nichtdeterministische Kellerautomaten erkannt werden können. Deterministische Kellerautomaten gehören zu einer Zwischenklasse, die mehr als die von endlichen Automaten erkennbaren Sprachen enthält, aber nur einen Teil der L2 -Sprachen. Wie wir noch sehen werden, ist gerade diese Zwischenklasse besonders wichtig bei der Beschreibung von Programmiersprachen (da das Wortproblem effizient gelöst werden kann und dabei trotzdem auch komplexe Strukturen, etwa korrekte Klammerausdrücke, beschrieben werden können.) Die Klasse L3 bilden schließlich die endlichen Automaten, bei denen, wie

138 | 3 Nichtdeterminismus: Ratende Automaten?

ŚĂƌĂŬƚĞƌŝƐŝĞƌƵŶŐ ĚƵƌĐŚƵƚŽŵĂƚĞŶ ŚŽŵƐŬLJͲ ƚ͘  dƵ ůĞƌĂƵ > 0 die entstehenden Sprachklassen LLR(k) alle gleich sind: ∀k > 0∶ LLR(k) = LLR(k+1) = LDKA Diese Sprachklasse nennen wir auch die deterministisch kontextfreien Sprachen. Nur für k = 0 gilt: LLR(0) ⊊ LLR(1) = LLR(2) = . . . e iπ

Mit 0 Symbolen für den Lookahead erhalten wir also eine Sprachklasse, die echt kleiner ist als LLR(1) , aber echt größer als die Menge der Typ-3-Sprachen, die wir im nächsten Abschnitt betrachten werden.

Es gibt noch andere Grammatiktypen, die in diesem (aus der hier angenommen Sichtweise kleinen, aber in der Praxis wichtigen) Zwischenbereich liegen. Zu den bedeutendsten gehören die LL(k)-Grammatiken, die sogar eine echte unendliche Sprachenhierarchie innerhalb dieses Bereichs bilden. Anders als bei LR(k)-Grammatiken, gilt bei diesen nämlich: L3 ⊊ LLL(1) ⊊ LLL(2) ⊊ LLL(3) ⊊ . . . ⊊ LLR(1) = LDKA ⊊ L2 = LKA LL(k)-Grammatiken spielen im Übersetzerbau eine wichtige Rolle. [GJ08]

4.6 Rechtslineare Grammatiken (Chomsky-Typ 3) |

183

4.6 Rechtslineare Grammatiken (Chomsky-Typ 3) Nach den etwas unintuitiven LR(k)-Grammatiken wenden wir uns jetzt wieder einem Grammatiktyp zu, der durch eine Einschränkung der zugelassenen Produktionen definiert werden kann. Rechtslineare Grammatiken sind zunächst kontextfrei, die Produktionen haben also nur ein Symbol auf der linken Seite. Darüber hinaus dürfen sie außerdem nur nach einem der folgenden drei Muster konstruiert werden: A → λ,

A → a,

A → aB

mit A, B ∈ N, a ∈ T. Anders ausgedrückt muss bei einer rechtslinearen Grammatik (N, T, P, S) für die Menge der Produktionen gelten: P ⊆ N × ({λ} ∪ T ∪ TN) Diese Einschränkungen verhindern, dass beliebig verzweigte Ableitungsbäume entstehen können. Stattdessen sind Ableitungen dieses Grammatiktyps „rechtslinear“ in dem Sinne, dass in jedem Ableitungsschritt höchstens ein Zeichen hinzukommen und die Ableitung ausschließlich nach rechts weitergehen kann.

e iπ

Die Rechtsableitung entsteht bei Produktionen des Typs . Bei den ersten beiden Typen wird dagegen direkt auf das Terminal a bzw. das (ebenfalls terminale) leere Wort abgeleitet, sodass die Ableitung in diesen Richtungen endet. Bei rechtslinearen Grammatiken werden die Terminalzeichen während der Ableitung immer rechts ans bisher abgeleitete Wort gehängt (obwohl in der Produktion das Terminalzeichen links vom Nichtterminalzeichen steht). Für Produktionen A → aB, B → bB könnte etwa abgeleitet werden: A ⇒ a B ⇒ ab B ⇒ abb B ⇒ . . . ↑





Ohne die Sprachmächtigkeit zu verändern, könnten auch etwas allgemeinere Produktionen zugelassen werden, die statt eines einzigen Terminalzeichens ein ganzes Wort aus T ⋆ links des Nichtterminalzeichens auf der rechten Seite haben.

Analog zu rechtslinearen können auch linkslineare Grammatiken definiert werden, indem statt Muster Produktionen wie A → Ba zugelassen werden. Diese können genau dieselben Sprachen erzeugen; wir nennen die Klasse dieser Sprachen L3 .

e iπ

184 | 4 Grammatiken und die Chomsky-Hierarchie

Lässt man jedoch beide Typen von Produktionen – rechts- und linkslineare gleichzeitig – zu, entsteht eine Zwischenklasse, die mehr Sprachen enthält als L3 .

Wir betrachten nun wieder als Beispiel eine rechtslineare Grammatik für unsere wohlbekannte Sprache L mod : Beispiel 4.5: Typ-3-Grammatik für die Sprache L mod Die folgende rechtslineare Grammatik erzeugt genau die Sprache L mod : G mod−3 = ({A0 , A1 , B0 , B1 , S}, {a, b}, P mod−3 , S) P mod−3 = {S → aA1 ∣ aB0 ∣ bA0 ∣ bB1 , A0 → aA1 ∣ bA0 , A1 → a ∣ aA0 ∣ bA1 , B0 → bB1 ∣ aB0 , B1 → b ∣ bB0 ∣ aB1 } Um zu erklären, was sie tut, könnten wir eigentlich direkt auf den nichtdeterministischen endlichen Automaten von Seite 130 verweisen. Nichtdeterministische endliche Automaten und rechtslineare Grammatiken sind eigentlich nur zwei unterschiedliche Arten, dieselbe Idee auszudrücken. Da jedes Nichtterminalzeichen pro Ableitungsschritt genau ein Terminalzeichen produziert und dabei „sich selbst in ein anderes Nichtterminalzeichen verwandelt“, entsprechen Nichtterminalzeichen in rechtslinearen Grammatiken ziemlich genau Zuständen in einem nichtdeterministischen endlichen Automaten. Der nichtdeterministische endliche Automat für L mod funktionierte folgendermaßen: (a) Er hatte je zwei Zustände, um mitzuzählen, ob die Anzahl der a’s (Zustände s1 und s2 ) bzw. die Anzahl der b’s (Zustände s3 und s4 ) im bisher eingelesenen Wort gerade war. (b) Immer wenn sie ungerade war, konnte mit einem weiteren a bzw. b in einen Endzustand (s5 ) gesprungen werden, weil dann die Gesamtanzahl des jeweiligen Zeichens gerade war. (c) Ob a’s oder b’s gezählt werden sollen, wurde nichtdeterministisch aus den Startzustand s0 heraus entschieden. Nach derselben Idee ist die Grammatik G mod−3 aufgebaut, nur dass hier Wörter erzeugt und nicht akzeptiert werden: (a) Die Nichtterminalzeichen A0 bzw. A1 stehen für eine gerade bzw. ungerade Anzahl an a’s, B0 bzw. B1 entsprechend für eine gerade bzw. ungerade Anzahl an

4.6 Rechtslineare Grammatiken (Chomsky-Typ 3) |

185

b’s. Wird durch eine der A ... -Produktionen ein a generiert, wird gleichzeitig in die andere A ... -Produktion gewechselt; wird dagegen ein b generiert, wird die aktuelle A ... -Produktion nicht verlassen. Genau umgekehrt läuft es bei den B ... Produktionen. (b) Von A1 aus hat das aktuelle Wort eine ungerade Anzahl an a’s, also fehlt noch ein a, damit es in der Sprache liegt. Daher kann aus A1 heraus ein einzelnes terminales a erzeugt werden, was den Ableitungsprozess beendet. Entsprechend kann von B1 aus durch das Erzeugen eines einzelnen b’s der Ableitungsprozess beendet werden. Ein spezielles Nichtterminalzeichen für den Endzustand s5 ist also nicht nötig. (c) Ob a’s oder b’s in gerader Anzahl erzeugt werden sollen, wird aus S heraus entschieden, wobei (wie auch im endlichen Automaten) beim Wechsel in die A ... bzw. B ... -Produktionen bereits ein a oder b generiert wird. Stattdessen könnte auch mit zwei Produktionen S → A0 ∣ B0 dorthin gewechselt werden, was zwei Produktionen einsparen würde (das entspräche Lambda-Übergängen im endlichen Automaten). Im Anschluss ist noch einmal der nichtdeterministische endliche Automat für die Sprache L mod dargestellt, wobei die Zustände entsprechend den zugehörigen Nichtterminalzeichen der Grammatik G mod−3 umbenannt sind: – s0 =ˆ S – s1 =ˆ A0 – s2 =ˆ A1 – s3 =ˆ B0 – s4 =ˆ B1 – s5 hat keine Entsprechung und bleibt s5 . A = ({a, b}, {A0 , A1 , B0 , B1 , S, s5 }, δ, S, {s5 }) δ:

 % 



%

 6



 $





  

  

$



DAR-21 | ID-16824 → Skript: S. 395

186 | 4 Grammatiken und die Chomsky-Hierarchie Wundern Sie sich nicht, wenn die dynamisch generierte Darstellung im XWizard etwas von der Darstellung hier abweicht. Zur Übersichtlichkeit sind im obigen Automaten die Knotenpositionen vom Automaten auf Seite 130 übernommen worden. Im XWizard hängt die Platzierung der Knoten allerdings auch von den Beschriftungen ab und kann sich deshalb auch für zwei Automaten unterscheiden, die topologisch gleich sind.

Wenn Sie am Zustandsdiagramm dieses Automaten die Arbeitsweise der Grammatik nachvollziehen, wird deutlich, wie sehr diese beiden Strukturen einander ähneln. Wie rechtslineare Grammatiken und nichtdeterministische endliche Automaten allgemein ineinander überführt werden können, untersuchen wir im Anschluss. Aber viel mehr, als schon im Beispiel deutlich wurde, steckt gar nicht dahinter. Der folgende Verzweigungsbaum zeigt jeweils eine Ableitung aller terminalen Wörter w ∈ L mod der Länge ∣w∣ ≤ 4 durch die Grammatik G mod−3 : 6

E$ 



EDD

E%  

ED$ 

EE$  

EDE$ 

EED$ 

EEE%  

EDED

EEDD

EEEE

EE

EE% 

EDE

D% 

ED%  

DE%  

EDD%  

DEE

EDDE

DD% 

DED%  

DDE%  

DEDE

DDEE

D$  

DD

DD$ 

DE$ 

DDD$ 

DED

DDDD

DEE$ 

DEED

DAR-22 | ID-16836 → Skript: S. 396

4.6 Rechtslineare Grammatiken (Chomsky-Typ 3) |

187

Der folgende Ableitungsbaum zeigt als Beispiel die Ableitung des Wortes abbaaa: 























DAR-23 | ID-16837 → Skript: S. 396 Der Baum hat die typische Struktur rechtslinearer Ableitungsbäume, bei denen sich von jedem inneren Knoten immer genau ein Terminalzeichen links und ein Nichtterminalzeichen rechts abspaltet. Wir können das auch folgendermaßen als Sequenz von Ableitungsschritten darstellen: S ⇒ aA1 ⇒ abA1 ⇒ abbA1 ⇒ abbaA0 ⇒ abbaaA1 ⇒ abbaaa Das Wort wächst während der Ableitung nach rechts hin um ein Zeichen pro Ableitungsschritt, bis im letzten nur noch das Nichtterminalzeichen in ein einzelnes Terminalzeichen umgewandelt wird. Bei rechtslinearen Grammatiken gibt es übrigens keinen Unterschied zwischen Links- und Rechtsableitungen, da in jedem Schritt nur ein einziges Nichtterminalzeichen im Wort existiert. Das Wortproblem bei rechtslinearen Sprachen: Ist für eine Sprache L eine rechtslineare Grammatik G mit L(G) = L bekannt, können Wörter aus L in Linearzeit bezüglich G geparst werden; insbesondere benötigt also auch die Lösung des Wortproblems für rechtslineare Sprachen nur lineare Zeit (in der Länge des Eingabewortes w). Soll nur das Wortproblem gelöst werden, können wir das mit den Methoden, die wir bereits kennen, etwas umständlich, aber in Linearzeit bewerkstelligen: Zunächst kann die Grammatik in einen äquivalenten nichtdeterministischen endlichen Automaten umgewandelt werden (nach dem im Beispiel angedeuteten und im Anschluss genauer ausgeführten Verfahren). Aus diesem kann ein äquivalenter deterministischer endlicher Automat erzeugt werden (nach dem Verfahren aus Kapitel 3, Seite 131; dabei kann

188 | 4 Grammatiken und die Chomsky-Hierarchie

die Zustandsanzahl exponentiell anwachsen – aber das zählt nicht zum Aufwand für das Wortproblem, weil es nur einmal im Vorfeld gemacht werden muss). Der entstehende deterministische endliche Automat hat keine Lambda-Übergänge, daher läuft er auf jeder Eingabe w für genau ∣w∣ Schritte. Also löst er das Wortproblem für L in Linearzeit. Sprachmächtigkeit der rechtslinearen Grammatiken: Wie wir bereits im Beispiel gesehen haben, haben rechtslineare Grammatiken große Ähnlichkeit mit (nichtdeterministischen) endlichen Automaten. Während der Ableitung existiert immer nur ein einziges Nichtterminalzeichen im Wort, da auf der rechten Seite von Produktionen maximal ein Nichtterminalzeichen vorhanden sein darf. Auf die Nichtterminalzeichen bezogen, „befindet sich ein Wort während der Ableitung immer in genau einem von ∣N∣ möglichen Zuständen“, genauso, wie sich ein endlicher Automat während der Rechnung in einem von ∣S∣ möglichen Zuständen befindet. Außerdem wächst das Wort zeichenweise von rechts nach links, gerade so, wie es von einem endlichen Automaten von links nach rechts eingelesen wird. Der Prozess der Worterzeugung bei rechtslinearen Grammatiken ist also komplementär zum Prozess der Worterkennung bei endlichen Automaten. Dass ein Nichtterminalzeichen auf mehrere unterschiedliche Nichtterminalzeichen bei gleichem Terminalzeichen abgebildet werden kann (also etwa A → aA ∣ aB), entspricht der Möglichkeit, nichtdeterministisch mehrere Zustandsübergänge aus einem Zustand heraus für dasselbe Eingabezeichen zu definieren. Diese Beobachtungen können genutzt werden, um zu beweisen, dass die Klasse der von kontextfreien Grammatiken erzeugbaren Sprachen genau die Klasse der von endlichen Automaten erkennbaren Sprachen ist. Anders ausgedrückt, müssen die folgenden beiden Aussagen gezeigt werden: – LEA ⊆ L3 und – L3 ⊆ LEA . Da wir bereits wissen, dass LEA = LDEA gilt, können wir es uns aussuchen, ob wir mit deterministischen oder nichtdeterministischen endlichen Automaten argumentieren. Für die erste Richtung („LEA ⊆ L3 “) könnte man meinen, es wäre einfacher, von einem deterministischen endlichen Automaten auszugehen, aber beide Richtungen sind ohnehin einfach, sodass sich diese Einschränkung nicht lohnt. Zu einem (nichtdeterministischen oder deterministischen) endlichen Automaten A = (E, S, δ, s0 , F) können wir wie folgt eine rechtslineare Grammatik G = (N, T, P, S) mit L(A) = L(G) angeben: – Für jeden Zustand s ∈ S wird zunächst ein Nichtterminalzeichen N s ∈ N eingeführt. – Wenn der Automat von einem Zustand t ∈ S aus über das Eingabezeichen e ∈ E in den Zustand u ∈ S wechseln kann (wenn also δ(t, e) = u gilt), dann wird das in der Grammatik durch die Produktion N t → eN u ∈ P ausgedrückt. – Ist der Zustand u ein Endzustand (gilt also u ∈ F), wird außerdem die Produktion N u → λ eingeführt.

4.6 Rechtslineare Grammatiken (Chomsky-Typ 3) |

189

Dieser Prozess entspricht genau der Art, wie wir im Beispiel auf Seite 184 die Grammatik G mod−3 aus dem endlichen Automaten konstruiert haben. Intuitiv sollte klar sein, dass auf diese Weise eine Grammatik entsteht, welche dieselbe Sprache akzeptiert wie der ursprüngliche endliche Automat. Formal beweisen kann man es durch vollständige Induktion über die Länge der Eingabe w für A. Umgekehrt kann aus einer rechtslinearen Grammatik G = (N, T, P, S) folgendermaßen ein äquivalenter (im Allgemeinen nichtdeterministischer) endlicher Automat A = (E, S, δ, s0 , F) erzeugt werden: – Für jede Produktion X → aY ∈ P (mit a ∈ T; X, Y ∈ N) werden folgende Aktionen ausgeführt: – Füge die Zustände s X und s Y zu S hinzu, falls sie noch nicht vorhanden sind. – Füge eine Transition δ(s X , a) = s Y zu δ hinzu. (Genauer heißt das, dass die eventuell nichtdeterministische Übergangsmenge δ(s X , a) um den Zustand s Y erweitert wird.) – Für jede Produktion X → λ ∈ P (mit X ∈ N), füge s X sowohl zu F als auch zu S hinzu (falls noch nicht vorhanden). Das ist bis hierhin einfach die umgekehrte Prozedur zu der Umwandlung des Automaten in die Grammatik. Dort ist allerdings ein Typ von Produktionen nicht vorgekommen, nämlich Produktionen der Form X → x ∈ P mit X ∈ N, x ∈ T. Diese können wie folgt umgesetzt werden: – Füge einen neuen Endzustand s f zu S und F hinzu, der vorher noch nicht vorhanden war. – Erzeuge eine Transition von s X über x zu s f : δ(s X , x) = s f . (Im nichtdeterministischen Fall gilt genauer wieder, dass die Übergangsmenge δ(s X , x) um den Zustand s f erweitert wird.) Da s f keine ausgehenden Transitionen hat, muss allerdings im gesamten Automaten nur ein einziger solcher Zustand eingefügt werden, auf den auch andere auf diese Art entstandenen Transitionen verweisen können, also etwa s f ∈ δ(s Y , y) für die Produktion Y → y. Auch hier kann diese intuitiv einleuchtende Argumentation durch eine vollständige Induktion über die Länge der abgeleiteten Wörter formal bewiesen werden. Nun haben wir also eingesehen, dass es zu jeder rechtslinearen Grammatik G einen endlichen Automaten A gibt mit L(A) = L(G) und umgekehrt. Anders ausgedrückt, sind die von rechtslinearen Grammatiken erzeugbaren Sprachen genau dieselben wie die durch endliche Automaten erkennbaren: L3 = LEA = LDEA Wir haben also die letzte Lücke geschlossen und zu jedem der in den Kapiteln 2 und 3 behandelten Automatentypen einen äquivalenten Grammatiktyp gefunden.

e iπ

190 | 4 Grammatiken und die Chomsky-Hierarchie

Fast! Da bis heute unbekannt ist, ob nichtdeterministische und deterministische LBA dieselbe Sprachklasse erkennen oder nicht, müssen wir die Einschränkung hinzufügen, dass wir eventuell für LDLBA noch keinen äquivalenten Grammatiktyp gefunden haben.

Es gilt insgesamt: LDEA = LEA = L3 ⊊ LDKA = LLR(k) ⊊ LKA = L2 ?

⊊ LDLBA = LLBA = L1 ⊊ LDTM = LTM = L0

4.7 Grammatiken mit endlicher Auswahl (Chomsky-Typ 4?) Der Vollständigkeit halber soll nicht unerwähnt bleiben, dass in der Parsing-Theorie manchmal noch eine weitere Grammatik-Stufe betrachtet wird, die von Noam Chomsky ursprünglich nicht vorgesehen war [GJ08]. Für diese Stufe, die trotzdem „vierte Stufe der Chomsky-Hierarchie“ genannt wird (da bei 0 zu zählen begonnen wurde, sind es dann also insgesamt fünf Stufen) werden die Produktionen so weit eingeschränkt, dass nur noch solche erlaubt sind, die auf der rechten Seite ausschließlich Nichtterminalzeichen enthalten: S→ϕ mit ϕ ∈ T ⋆ (und S ist Startzustand). Anders ausgedrückt gilt für die Menge der Produktionen P: P ⊆ N × T⋆ In diesem Fall gibt es bei der Ableitung nur die Wahl zwischen endlich vielen Möglichkeiten, S auf eine konstante Zeichenkette abzubilden, daher heißen diese Grammatiken auch im Englischen „finite-choice grammar“ (FCG). Da keine Nichtterminalzeichen außer S existieren, erfolgt die Ableitung immer in einem einzigen Schritt. Die Möglichkeiten zur Ableitung von Wörtern sind hier soweit eingeschränkt, dass man eigentlich nur eine Liste von Wörtern angibt, welche in der Sprache der Grammatik liegen sollen. Trotzdem kann es sinnvoll sein, diesen Grammatiktyp zu definieren, da Beweise vereinfacht werden können, wenn er zur Verfügung steht. In der Praxis werden Teile von Grammatiken oft ganz automatisch zu FCGs, wenn eine Produktion nicht mehr tun soll, als aus einer endlichen Auswahl von Möglichkeiten eine zu wählen. In Programmiersprachen wird diese Art von Produktionen genutzt, um die auf einer bestimmten Ebene erlaubten Schlüsselwörter zu spezifizieren; und auch unsere einfache Grammatik für deutsche Sätze (vgl. Seite 151) nutzt sie, um mehrere verschiedene „Vokabeln“ bei der Ableitung von V , DS, NP und VD zuzulassen. Auch zu diesen Grammatiken kann man leicht einen äquivalenten Typ von Automaten angeben: Das sind alle nichtdeterministischen endlichen Automaten ohne

4.7 Grammatiken mit endlicher Auswahl (Chomsky-Typ 4?)

| 191

Schleifen. Sei G = (N, T, P, S) eine Typ-4-Grammatik; dann kann folgendermaßen ein nichtdeterministischer endlicher Automat ohne Schleifen A = (E, S, δ, s0 , F) erzeugt werden mit L(G) = L(A): Zunächst fügen wir einen Startzustand s0 zu S hinzu. Dann beginnen wir mit einer beliebigen Produktion: S → a1 a2 . . . a n ∈ P und fügen die Zustände s11 , . . . , s1n sowie die Transitionen δ(s0 , a1 ) = s11 und δ(s1i , a i+1 ) = s1,i+1 für i ∈ 1, . . . , n − 1 hinzu. (Genauer muss auch diesmal im nichtdeterministischen Fall der jeweilige Folgezustand s 11 bzw. s1,i+1 zur jeweiligen Menge δ(s0 , a1 ) bzw. δ(s1i , a i+1 ) hinzugefügt werden; auch wenn alle Übergänge, außer denen von s0 aus, garantiert deterministisch sind). Als Endzustand deklarieren wir s1n . Entsprechend wird mit den übrigen Produktionen verfahren, wobei jeweils neue Zustände s j1 , . . . , s jm (für die j-te Produktion mit m Zeichen auf der rechten Seite) eingeführt werden. Es ergibt sich also eine (normalerweise nichtdeterministische) Auswahl von s0 aus, und die übrigen Zustände sind nur in linearen Ketten miteinander verbunden (vgl. auch das Beispiel im Anschluss). Umgekehrt kann zu jedem nichtdeterministischen endlichen Automaten ohne Schleifen A eine äquivalente Grammatik G des Typs 4 angegeben werden. Dabei kann sich der Graph von A nicht nur von s0 aus in verschiedene lineare Zweige aufspalten, sondern es können in jedem Zustand Aufspaltungen stattfinden, und es kann etwas geben, das wir „Schlaufen“ nennen – das seien Übergänge von einem Zweig in einen anderen, ohne dass dabei rückführende Kanten auftreten (etwa: s0 → s1 → s2 und s0 → s3 → s2 ). Trotzdem läuft es letztendlich nur darauf hinaus, von s0 aus alle Pfade zu einem Endzustand zu verfolgen und dabei die zu den besuchten Transitionen gehörenden Eingabezeichen zu Wörtern zu verknüpfen; aus diesen Wörtern w1 , w2 , . . . werden in G die Produktionen S → w1 ∣ w2 ∣ . . . Damit haben wir wieder (wenn auch nur der Vollständigkeit halber) einen Automatentyp gefunden, der zu den Typ-4-Grammatiken äquivalent ist.



Überlegen Sie selbst, wie ein entsprechender deterministischer Automatentyp aussehen könnte, der genau die Typ-4-Sprachen erkennen kann.

Beispiel 4.6: Grammatik und Automat des Typs 4 Eine Grammatik des Typs 4 sieht etwa folgendermaßen aus: G sehr−einfach = ({S}, {a, b}, P se , S) P se = {S → abba ∣ aaa} DAR-24 | ID-3772 → Skript: S. 397

192 | 4 Grammatiken und die Chomsky-Hierarchie

Und der entsprechende sehr einfache endliche Automat ohne Schleifen ergibt sich aus G sehr−einfach wie folgt: A sehr−einfach = ({a, b}, {s0 , s11 , . . . , s14 , s21 , . . . , s23 }, δ se , s0 , {s14 , s23 }) δ se :  

 



 

 



 



 



 

 

 

DAR-25 | ID-3773 → Skript: S. 397 Mehr gibt es zu diesen Grammatiken nicht zu sagen.

4.8 Zusammenfassung In diesem Kapitel haben wir die Sprachenhierarchie der Chomsky-Grammatiken kennengelernt. Eine Chomsky-Grammatik definiert eine Sprache, indem sie zunächst vorgibt, wie, ausgehend von einem immer ableitbaren Startwort S, die Menge der ableitbaren Wörter durch Veränderungen der bereits abgeleiteten Wörter erweitert werden kann. Als zweites gehört zu einer Grammatik eine Unterteilung der Zeichen, aus denen Wörter gebildet werden können, in eine Menge von Terminalzeichen T und eine Menge von Nichtterminalzeichen N. Nur ableitbare Wörter, die ausschließlich aus Terminalzeichen bestehen, gehören zur Sprache der Grammatik. Die Art, wie Wörter aus bereits abgeleiteten Wörtern weiter abgeleitet werden dürfen, wird bei Chomsky-Grammatiken durch eine Menge von Produktionen oder Regeln P festgelegt. Eine Produktion p ∈ P ist dabei ein Tupel (ϕ, ψ) (wobei wir die Klammern weglassen und statt des Kommas einen Pfeil zeichnen): p = ϕ → ψ ∈ (N ∪ T)⋆ /T ⋆ × (N ∪ T)⋆ Dabei drückt die Produktion p aus, dass für jedes abgeleitete Wort w, das ϕ enthält: w = αϕβ mit α, β ∈ N ∪ T auch das Wort αψβ abgeleitet werden kann. Jedes Vorkommen von ϕ in jedem bereits abgeleiteten Wort kann also durch ψ ersetzt werden. Ist diese maximal mögliche Freiheit für die Produktionen zugelassen, sprechen wir von allgemeinen Grammatiken oder dem Chomsky-Typ 0. Die Menge der Sprachen, die durch diese Grammatiken erzeugt werden können, haben wir L0 genannt,

4.8 Zusammenfassung

| 193

und wir haben gesehen, dass es sich um dieselben Sprachen handelt, die von Turingmaschinen akzeptiert werden können (wobei die Turingmaschine im nichtakzeptierenden Fall nicht unbedingt anhalten muss). Das Wortproblem für Typ-0Sprachen ist entsprechend nicht entscheidbar, aber semientscheidbar (vgl. Kapitel 6). Von den allgemeinen Grammatiken aus haben wir die Produktionen sukzessive eingeschränkt (wie wir bei den Automaten die Art des Speicherzugriffs eingeschränkt haben), um die dann noch erzeugbaren Sprachen zu untersuchen. Werden die Produktionen so eingeschränkt, dass: – entweder: die rechte Seite immer mindestens so viele Zeichen enthalten muss wie die linke: ∣ϕ∣ ≤ ∣ψ∣; – oder: während der Ableitung immer nur ein einziges Nichtterminalzeichen von der linken Seite durch eine beliebige nichtleere Zeichenkette ersetzt werden darf: ϕ = ϕ1 Aϕ2 und ψ = ϕ1 ψ′ ϕ2 mit A ∈ N und ψ′ ∈ (N ∪ T)+ ; erhalten wir monotone Grammatiken, die im zweiten Fall auch kontextsensitiv sind. Um auch das leere Wort erzeugen zu können, haben wir dabei als Ausnahme jeweils die Produktion S → λ zugelassen, solange S auf keiner rechten Seite einer Produktion aufgetreten ist. Beide Definitionen können dieselben Sprachen erzeugen, deren Gesamtmenge wir als Typ-1-Sprachen oder L1 bezeichnet haben. Hier stellte sich heraus, dass es dieselben Sprachen sind, die von einem nichtdeterministischen LBA erkannt werden können. Das Wortproblem für Typ-1-Sprachen ist entscheidbar, aber PSPACE-vollständig und gilt daher als sehr schwer. Was das genau bedeutet, werden wir in Kapitel 7 sehen. Die Sprachklasse der nichtdeterministischen Kellerautomaten erreichten wir durch die kontextfreien Grammatiken, welche die Klasse der Typ-2-Sprachen L2 erzeugen. Dabei dürfen Produktionen, wie bei den kontextsensitiven Grammatiken, nur ein einzelnes Nichtterminalzeichen auf eine beliebige Zeichenkette abbilden (wobei hier auch die leere Zeichenkette erlaubt ist), es darf aber kein Kontext „ϕ1 , ϕ2 “ angegeben werden. Das Nichtterminalzeichen darf also durch die Zeichenkette ersetzt werden, egal, wo im Wort es auftritt. Die erlaubten Produktionen sind also von der Form A → ϕ mit A ∈ N und ϕ ∈ (N ∪ T)⋆ . Ist eine Typ-2-Grammatik für eine Sprache gegeben, kann ein Wort w bezüglich dieser Grammatik in einer Laufzeit von O(∣w∣3 ) geparst werden. Damit ist insbesondere auch das Wortproblem für Typ-2-Sprachen in kubischer Zeit entscheidbar. Das ist bereits wesentlich schneller als noch bei den Typ-1-Sprachen, aber für praktische Anwendungen oft trotzdem noch zu langsam. Als letzte Stufe der (normalen) Chomsky-Hierarchie haben wir schließlich die rechtslinearen Grammatiken kennengelernt, welche die Typ-3-Sprachen oder L3 erzeugen. Bei ihnen sind nur Produktionen der folgenden Formen erlaubt (wobei A, B ∈ N und a ∈ T gilt): A → λ, A → a, A → aB. Wir haben gesehen, dass diese Grammatiken das Wort zeichenweise von links nach rechts aufbauen und sich dabei ähnlich (komplementär) zu einem nichtdeterministischen endlichen Automaten verhalten. Entsprechend konnten wir leicht zeigen, dass zu jeder rechtslinearen

194 | 4 Grammatiken und die Chomsky-Hierarchie

Grammatik ein äquivalenter nichtdeterministischer endlicher Automat gehört und umgekehrt. Daher ist auch klar, dass das Wortproblem für Typ-3-Sprachen in linearer Zeit entschieden werden kann, da ein endlicher Automat zum Verarbeiten einer Eingabe w immer genau ∣w∣ Schritte benötigt. Dafür ist die Ausdruckskraft der Typ3-Sprachen sehr gering, was sie für manche praktische Anwendungen unbrauchbar machen kann. Neben den vier Haupt-Stufen der Chomsky-Hierarchie haben wir außerdem eine Stufe zwischen Typ 2 und Typ 3 kennengelernt: die LR(k)-Grammatiken. Diese sind nicht durch eine Einschränkung der erlaubten Produktionen definiert, sondern durch eine Eigenschaft des Parsens solcher Grammatiken. Versucht man nämlich, von einem Wort w aus die rückwärtsgerichtete Ableitungsfolge („Reduktionsfolge“) hin zum Startsymbol S zu finden, dann bestimmen die ersten k Symbole in jedem abgeleiteten Wort, welche Produktion gewählt worden sein muss, um zu dieser Ableitung zu kommen. Aufgrund dieser Eigenschaft können LR(k)-Grammatiken in Linearzeit geparst werden. Da sie darüber hinaus wesentlich komplexere Sprachen erzeugen können als die Typ-3-Grammatiken, werden sie gerne als Grundlage für Programmiersprachen gewählt. Die Sprachklasse LLR(k) der durch LR(k)-Grammatiken erzeugbaren Sprachen enthält genau dieselben Sprachen, die von deterministischen Kellerautomaten erkannt werden können. Zuletzt haben wir noch eine technische Erweiterung gesehen, die Grammatiken mit endlicher Auswahl (auch Typ-4-Grammatiken genannt), welche nur eine Liste terminaler Wörter von S aus ableiten können. Diese Grammatiken können nur endliche Sprachen erzeugen und sind damit nur in Spezialfällen von Interesse.

Fünf Fragen zur Selbstkontrolle

e iπ

(1) Warum wird üblicherweise bei allen Grammatiken verlangt, dass linke Seiten von Produktionen mindestens ein Nichtterminalzeichen enthalten? (2) Welche Konsequenzen hätte es, wenn ein Grammatiktyp gefunden würde, der genau die Klasse LDLBA der von deterministischen LBA erkennbaren Sprachen erzeugt? Unterscheiden Sie drei Fälle, je nachdem, wie das Verhältnis des neuen Typs zu den Typ-1-Grammatiken wäre (gleich, ungleich oder unbekannt). (3) Warum bewirkt die Befreiung vom Kontext bei Typ-2-Grammatiken (gegenüber Typ-1) eine Eingrenzung der Ausdrucksfähigkeit und damit eine Verkleinerung der Sprachmächtigkeit?

Die Frage ist rein formal ganz einfach zu beantworten – und wir haben das auch früher im Kapitel bereits getan. Erfahrungsgemäß macht es vielen Anfängern aber Probleme, das auch wirklich von Herzen zu

4.8 Zusammenfassung

| 195

begreifen. Wenn auch Sie dazugehören, nehmen Sie sich ein paar Minuten, um darüber nachzudenken. (4) Warum kann die Sprache L Pal = {v ∈ {0, 1}⋆ ∣ v = v′ } der Palindrome über {0, 1} nicht durch eine LR(k)-Grammatik erzeugt werden, die Sprache L Pal−M = {vMv′ ∣ v ∈ {0, 1}⋆ } der Palindrome mit Kennzeichnung der Mitte aber schon? (5) Erklären Sie in eigenen Worten, inwiefern rechtslineare Grammatiken und endliche Automaten „fast dasselbe“ sind. Worin genau liegt eigentlich überhaupt der Unterschied?

∃ – – – – – –

Folgende Übungsaufgaben passen zu diesem Kapitel (aus dem Buch „100 Übungsaufgaben zu Grundlagen der Informatik, Band I: Theoretische Informatik“ [KPBS14]):

Zu Grammatiken allgemein: 28, 41c, 47, 81 bis 83 Zu Typ-0-Grammatiken: 87, 88 Zu Typ-1-Grammatiken: 84 bis 87 Zu Typ-2-Grammatiken: 48, 49a, 49b, 50 bis 53, 63b, 77a Zu Typ-3-Grammatiken: 10a, 29c, 30 bis 32a, 33b, 34a, 49c Zum CYK-Algorithmus: 55b, 56b, 57 bis 59b

Lösungen zu den fünf Kontrollfragen und sonstige Themen des Kapitels können hier diskutiert werden: www.dasinfobuch.de/links/k4

5 Weitere strukturelle Eigenschaften der vorgestellten Sprachklassen Die Sprachklassen L0 bis L3 , welche zu den Automaten- und Grammatiktypen gehören, die wir in den vorausgegangenen Kapiteln erarbeitet haben, gehören zur Chomsky-Hierarchie (den exotischen Typ 4 werden wir im Folgenden außer Acht lassen). Sie stehen zueinander in Teilmengenbeziehungen, wobei jeweils die Klassen mit höherer Zahl echte Teilmengen jeder der Klassen mit niedrigerer Zahl sind. Beachten Sie aber, dass auf struktureller Ebene der Grammatiken diese Teilmengenbeziehung nicht immer gilt. Wie wir gesehen haben, sind beispielsweise nicht alle kontextfreien Grammatiken monoton bzw. kontextsensitiv. Trotzdem kann jede kontextfreie Sprache durch eine kontextsensitive Grammatik definiert werden. Das mag zunächst befremdlich erscheinen, ist es aber überhaupt nicht! Denken Sie an die Automaten-Seite, wo die von Turingmaschinen erkennbaren Sprachen eine Obermenge der von endlichen Automaten erkennbaren Sprachen sind – aber natürlich ist ein endlicher Automat trotzdem keine Turingmaschine. Bei den Grammatiken ist es eher ein netter Nebeneffekt, dass die Teilmengenbeziehung in vielerlei Hinsicht auch strukturell gilt, aber eben nicht immer. Der syntaktische Mechanismus zum Definieren einer Sprache darf hier nicht mit der Sprache selbst verwechselt werden.

Abbildung 5.1 fasst diese Verhältnisse zusammen und erweitert somit Tabelle 3.1 zur Sprachmächtigkeit, die wir in Kapitel 3.5 aufgestellt haben, sowie die dortige Abbildung 3.4. Neben „normalen“ Automaten und Grammatiken gibt es noch weitere gängige Arten, Sprachen und ähnliche Strukturen zu definieren. Dabei können sowohl ChomskyKlassen herauskommen als auch andere Klassen zwischen, quer oder ohne Beziehung zu den Chomsky-Klassen. Einige Beispiele für letztere sind etwa die biologisch inspirierten Lindenmayer-Systeme, die im Prinzip wie Chomsky-Grammatiken funktionieren, aber auch parallele Ableitungen erlauben (und bei der Erzeugung von Fraktalen verwendet werden können) [Lin68, PL96, Ric07, GS13, Fer94], stochastische oder probabilistische Automaten [Weg05] (die weder deterministisch noch nichtdeterministisch sind und in enger Beziehung zu Markow-Ketten [Beh00] stehen), ωAutomaten [Far02], welche die Eingabe unendlicher Wörter erlauben, stochastische und parametrisierte Grammatiken [MS99], die vor allem in der Linguistik Anwendung finden, Graphgrammatiken [Roz97], welche Ableitungen statt auf Wörtern auf Graphen durchführen und Figur-Grammatiken [SG72, Sti06], die eher künstlerische Anwendungen hervorbringen. Auf Details soll hier im Interesse der klassischen Informatikthemen verzichtet werden, obwohl jedes dieser Gebiete spannende und man-

e iπ

198 | 5 Weitere strukturelle Eigenschaften der vorgestellten Sprachklassen

ŝĞŶƚƐĐŚĞŝĚďĂƌ

Ğ ƐĞŵ ƐĐŚŝŶ Ă Őŵ ƌ Ϳ ƌŝŶ ĞŝĚďĂ ;>͍ ƚ͘  dƵ Ś ůĞƌĂƵ >