Theoretische Informatik für Dummies [1 ed.] 3527714316, 9783527714315

Theoretische Informatik stellt für viele Studenten ein Angstfach dar, sie gilt als abstrakt, stark formalisiert und dem

1,456 151 20MB

German Pages 286 [341] Year 2019

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

Theoretische Informatik für Dummies [1 ed.]
 3527714316, 9783527714315

Table of contents :
Über den Autor
Inhaltsverzeichnis
Einleitung
Was ist theoretische Informatik?
Über dieses Buch
Wie dieses Buch aufgebaut ist
Symbole in diesem Buch
Wie Sie dieses Buch lesen sollten
Teil I: Endliche Automaten
Kapitel 1: Deterministische Endliche Automaten (DFAs)
Einführung
Erste Beispiele
Grundlegende Definitionen
Reguläre Sprachen
Minimalautomaten
DFAs mit Ausgabe (Moore- und Mealy-Automaten)
Aufgaben zu DFAs
Hinweis
Kapitel 2: Nichtdeterministische Endliche Automaten (NFAs)
Nichtdeterminismus
Definition eines NFA
Der Satz von Rabin-Scott
NFAs mit ε-Übergängen
Reguläre Ausdrücke
Stochastische Automaten und Markov-Ketten
Aufgaben zu NFAs
Kapitel 3: Kellerautomaten (PDAs)
Nichtdeterministische Kellerautomaten
Deterministische Kellerautomaten
Die Grenzen von PDAs
Aufgaben zu PDAs
Hinweis
Kapitel 4: Turing-Maschinen
Deterministische Turing-Maschinen
Turing-Berechenbarkeit
Mehrband-Turing-Maschinen
Registermaschinen
Nichtdeterministische Turing-Maschinen
Linear beschränkte Turing-Maschinen
Universelle Turing-Maschine (UTM)
Die Grenzen von Turing-Maschinen
Aufgaben zu Turing-Maschinen
Hinweis
Teil II: Formale Sprachen
Kapitel 5: Grammatiken
Einführung
Definition einer Grammatik
Chomsky-Hierarchie
Aufgaben zu Grammatiken
Kapitel 6: Reguläre (Typ-3-)Sprachen
Beispiele für Typ-3-Sprachen
Das Wortproblem für Typ-3-Sprachen
Aufgaben zu Typ-3-Sprachen
Kapitel 7: Kontextfreie (Typ-2-)Sprachen
Erste Beispiele
Backus-Naur-Form (BNF)
Chomsky-Normalform
Die Grenzen kontextfreier Sprachen
Ein äquivalentes Maschinenmodell
Das Wortproblem für kontextfreie Sprachen
Abschlusseigenschaften
Aufgaben zu kontextfreien Sprachen
Kapitel 8: Kontextsensitive und Phasen-Struktur-Sprachen
Ein erstes Beispiel
Das Wortproblem für Typ-1-Sprachen
Das Wortproblem für Typ-0-Sprachen
Äquivalente Maschinenmodelle
Teil III: Harte Probleme
Kapitel 9: Zeitkomplexität von Algorithmen
Einführende Überlegungen
Zeit- und Speicherkomplexität von Algorithmen
Die O-Notation
Komplexitätsklassen von Sprachen
Aufgaben zur Komplexität von Algorithmen
Kapitel 10: Die Klassen P und NP
Die Klasse P
Die Klasse NP
Das SAT-Problem
Reduktion
SAT, KNF-SAT und 3-SAT
Reduktion und Entscheidbarkeit
Aufgaben zu P und NP
Kapitel 11: NP-Vollständigkeit
Der Satz von Cook
Beispiele NP-vollständiger Sprachen
Ist P = NP?
Quantencomputer
Aufgaben zur NP-Vollständigkeit
Teil IV: Mathematische Grundlagen
Kapitel 12: Logische Grundlagen
Boolesche Variablen und boolesche Formeln
Aussagen und Beweise
Aufgaben zur Logik
Kapitel 13: Mengen und Relationen
Grundbegriffe
Mengenoperationen
Relationen
Funktionen
Aufgaben zu Mengen und Relationen
Kapitel 14: Graphen und Bäume
Graphen und ihre Eigenschaften
Bäume
Tourenprobleme
Gewichtete Graphen
Aufgaben zu Graphen und Bäumen
Teil V: Top-Ten-Teil
Kapitel 15: Top-Ten-Theoretiker
Charles Babbage (1791–1871)
Ada Lovelace (1815–1852)
Alonzo Church (1903–1995)
Alan Turing (1912–1954)
Claude Shannon (1916–2001)
Richard Feynman (1918–1988)
Noam Chomsky (geboren 1928)
Michael Rabin (geboren 1931) und Dana Scott (geboren 1932)
Stephen Cook (geboren 1939)
Peter W. Shor (geboren 1959)
Kapitel 16: Die Top-Ten-Bücher zum Weiterlesen
Teil I: Endliche Automaten
Teil II: Formale Sprachen
Teil III: Harte Probleme
Teil IV: Mathematische Grundlagen
Teil V: Top-Ten-Teil
Symbolverzeichnis
Index
End User License Agreement

Citation preview

Theoretische Informatik für Dummies

Schummelseite ÄQUIVALENTE MASCHINENTYPEN Deterministischer Typ Nichtdeterministischer Typ Äquivalenz siehe Kapitel DFA

NEA

Ja

2

DPDA

NPDA

Nein

3

TM

NTM

Ja

4

LBTM

NLBTM

?

4

ÄQUIVALENTE SPRACHKLASSEN UND MASCHINENTYPEN Maschinen-Typ

Sprachklasse

Äquivalenz siehe Kapitel

DFA

Regulär

Ja

6

DPDA

Deterministisch Kontextfrei

Ja

7

NPDA

Kontextfrei

Ja

7

NLBTM

Kontextsensitiv

Ja

8

LBTM

Kontextsensitiv

?

8

TM

Phasen-Struktur

Ja

8

KOMPLEXITÄT DES WORTPROBLEMS       Sprachklasse

Entscheidbar Komplexität siehe Kapitel

Regulär

Ja

6

Deterministisch Kontextfrei

Ja

7

Kontextfrei

Ja

7

Kontextsensitiv

Ja

8

Phasen-Struktur

Nein

-

8

DIE CHOMSKY-HIERARCHIE

VERMUTETE BEZIEHUNG DER KOMPLEXITÄTSKLASSEN P, NP UND BQP

Theoretische Informatik für Dummies 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. 1. Auflage 2019 © 2019 WILEY-VCH Verlag GmbH & Co. KGaA, Weinheim All rights reserved including the right of reproduction in whole or in part in any form. This book published by arrangement with John Wiley and Sons, Inc. Alle Rechte vorbehalten inklusive des Rechtes auf Reproduktion im Ganzen oder in Teilen und in jeglicher Form. Dieses Buchwird mit Genehmigung von John Wiley and Sons, Inc. publiziert. Wiley, the Wiley logo, Für Dummies, the Dummies Man logo, and related trademarks and trade dress are trademarks or registered trademarks of John Wiley & Sons, Inc. and/or its affiliates, in the United States and other countries. Used by permission. Wiley, die Bezeichnung »Für Dummies«, das Dummies-Mann-Logo und darauf bezogene Gestaltungen sind Marken oder eingetragene Marken von John Wiley & Sons, Inc., USA, Deutschland und in anderen Ländern. Das vorliegende Werk wurde sorgfältig erarbeitet. Dennoch übernehmen Autoren und Verlag für die Richtigkeit von Angaben, Hinweisen und Ratschlägen sowie eventuelle Druckfehler keine Haftung. Coverfoto: Moussa81 - ThinkstockPhotos Korrektur: Claudia Lötschert Print ISBN: 978-3-527-71431-5 ePub ISBN: 978-3-527-81199-1

Über den Autor Roland Schmitz studierte von 1986 bis 1991 Mathematik an der TU Braunschweig und war danach dort bis 1995 wissenschaftlicher Mitarbeiter. 1994 promovierte er zum Dr. rer. nat. Danach wechselte er in die Industrie als wissenschaftlicher Mitarbeiter zum Technologiezentrum der Deutschen Telekom in Darmstadt. Von 1995 bis 2001 war er dort unter anderem in die Standardisierung der UMTS-Sicherheitsarchitektur eingebunden. Seit 2001 ist er Professor für Internet - Security im Studiengang Medieninformatik an der Hochschule der Medien, Stuttgart. Neben Vorlesungen zur IT-Sicherheit hält er dort seit Langem Grundlagenvorlesungen in den Bereichen Mathematik und Theoretische Informatik.

Inhaltsverzeichnis Cover Über den Autor Einleitung Was ist theoretische Informatik? Über dieses Buch Wie dieses Buch aufgebaut ist Symbole in diesem Buch Wie Sie dieses Buch lesen sollten

Teil I: Endliche Automaten Kapitel 1: Deterministische Endliche Automaten (DFAs) Einführung Erste Beispiele Grundlegende Definitionen Reguläre Sprachen Minimalautomaten DFAs mit Ausgabe (Moore- und Mealy-Automaten) Aufgaben zu DFAs Hinweis

Kapitel 2: Nichtdeterministische Endliche Automaten (NFAs) Nichtdeterminismus Definition eines NFA Der Satz von Rabin-Scott NFAs mit -Übergängen Reguläre Ausdrücke Stochastische Automaten und Markov-Ketten Aufgaben zu NFAs

Kapitel 3: Kellerautomaten (PDAs) Nichtdeterministische Kellerautomaten Deterministische Kellerautomaten Die Grenzen von PDAs Aufgaben zu PDAs Hinweis

Kapitel 4: Turing-Maschinen

Deterministische Turing-Maschinen Turing-Berechenbarkeit Mehrband-Turing-Maschinen Registermaschinen Nichtdeterministische Turing-Maschinen Linear beschränkte Turing-Maschinen Universelle Turing-Maschine (UTM) Die Grenzen von Turing-Maschinen Aufgaben zu Turing-Maschinen Hinweis

Teil II: Formale Sprachen Kapitel 5: Grammatiken Einführung Definition einer Grammatik Chomsky-Hierarchie Aufgaben zu Grammatiken

Kapitel 6: Reguläre (Typ-3-)Sprachen Beispiele für Typ-3-Sprachen Das Wortproblem für Typ-3-Sprachen Aufgaben zu Typ-3-Sprachen

Kapitel 7: Kontextfreie (Typ-2-)Sprachen Erste Beispiele Backus-Naur-Form (BNF) Chomsky-Normalform Die Grenzen kontextfreier Sprachen Ein äquivalentes Maschinenmodell Das Wortproblem für kontextfreie Sprachen Abschlusseigenschaften Aufgaben zu kontextfreien Sprachen

Kapitel 8: Kontextsensitive und Phasen-Struktur-Sprachen Ein erstes Beispiel Das Wortproblem für Typ-1-Sprachen Das Wortproblem für Typ-0-Sprachen Äquivalente Maschinenmodelle

Teil III: Harte Probleme Kapitel 9: Zeitkomplexität von Algorithmen Einführende Überlegungen

Zeit- und Speicherkomplexität von Algorithmen Die O-Notation Komplexitätsklassen von Sprachen Aufgaben zur Komplexität von Algorithmen

Kapitel 10: Die Klassen P und NP Die Klasse P Die Klasse NP Das SAT-Problem Reduktion SAT, KNF-SAT und 3-SAT Reduktion und Entscheidbarkeit Aufgaben zu P und NP

Kapitel 11: NP-Vollständigkeit Der Satz von Cook Beispiele NP-vollständiger Sprachen Ist P = NP? Quantencomputer Aufgaben zur NP-Vollständigkeit

Teil IV: Mathematische Grundlagen Kapitel 12: Logische Grundlagen Boolesche Variablen und boolesche Formeln Aussagen und Beweise Aufgaben zur Logik

Kapitel 13: Mengen und Relationen Grundbegriffe Mengenoperationen Relationen Funktionen Aufgaben zu Mengen und Relationen

Kapitel 14: Graphen und Bäume Graphen und ihre Eigenschaften Bäume Tourenprobleme Gewichtete Graphen Aufgaben zu Graphen und Bäumen

Teil V: Top-Ten-Teil

Kapitel 15: Top-Ten-Theoretiker Charles Babbage (1791–1871) Ada Lovelace (1815–1852) Alonzo Church (1903–1995) Alan Turing (1912–1954) Claude Shannon (1916–2001) Richard Feynman (1918–1988) Noam Chomsky (geboren 1928) Michael Rabin (geboren 1931) und Dana Scott (geboren 1932) Stephen Cook (geboren 1939) Peter W. Shor (geboren 1959)

Kapitel 16: Die Top-Ten-Bücher zum Weiterlesen Teil I: Endliche Automaten Teil II: Formale Sprachen Teil III: Harte Probleme Teil IV: Mathematische Grundlagen Teil V: Top-Ten-Teil

Symbolverzeichnis Index End User License Agreement

Illustrationsverzeichnis Kapitel 1 Abbildung 1.1: Hardware-Modell eines Deterministischen Endlichen Automaten Abbildung 1.2: Die Geschichte vom Bauern, dem Wolf, der Ziege und dem Kohlkopf Abbildung 1.3: Ein erstes Übergangsdiagramm eines DFA Abbildung 1.4: Ein DFA, der prüft, ob das Eingabewort auf zwei Nullen endet. Abbildung 1.5: Verarbeitung eines langen Worts im DFA Abbildung 1.6: Ein sequenzieller Addierer als Mealy-Automat

Kapitel 2 Abbildung 2.1: Übergangsdiagramm eines NFA Abbildung 2.2: Mögliche Verarbeitungswege für Abbildung 2.3: Ein zu

äquivalenter DFA

Abbildung 2.4: Ein zu

äquivalenter DFA

Abbildung 2.5: NFA mit -Übergängen

durch den NFA aus Abb. 2.1

Abbildung 2.6: Markov-Prozess für winterliches Wetter

Kapitel 3 Abbildung 3.1: Hardware-Modell eines PDAs Abbildung 3.2: Übergangsgraph eines NPDA

Kapitel 4 Abbildung 4.1: Eine Turing-Maschine mit

Zuständen

Abbildung 4.2: Ein Zustandsübergang einer TM im Übergangsdiagramm Abbildung 4.3: Übergangsgraph einer TM, die bei Eingabewörtern, di... Abbildung 4.4: Eine 2-Band-TM Abbildung 4.5: Eine einfache nichtdeterministische TM Abbildung 4.6: Berechnungsbaum für Abbildung 4.7: Linear beschränkte Turing-Maschine (LBTM) Abbildung 4.8: Universelle Turing-Maschine

Kapitel 5 Abbildung 5.1: Ein Syntaxbaum Abbildung 5.2: Die Chomsky-Hierarchie

Kapitel 6 Abbildung 6.1: Ein zu

äquivalenter NFA

Kapitel 7 Abbildung 7.1: Syntaxbaum für

. Der Weg von jedem der Blätter ...

Kapitel 10 Abbildung 10.1: Das Wortproblem für

wird durch auf das für

reduziert.

Abbildung 10.2: Ein 3-färbbarer und ein nicht 3-färbbarer Graph Abbildung 10.3: Syntaxbaum für

Kapitel 11 Abbildung 11.1: boolescher Schaltkreis für

.

Abbildung 11.2: Eine TM, die entscheidet Abbildung 11.3: Zeitliche Abfolge der Situation auf dem Ein-/Ausgabeband Abbildung 11.4: Arbeitsweise eines verallgemeinerten Gates Abbildung 11.5: Alternative Arbeitsweisen eines verallgemeinerten Gates zur Simul... Abbildung 11.6: Boolescher Schaltkreis für Abbildung 11.7: Ein Diamant

aus

mit nummerierten Gates. Knoten für die Variable

Abbildung 11.8: Ein modifizierter Diamant

für den Fall, dass

Abbildung 11.9: Ein modifizierter Diamant

für den Fall, dass ...

Abbildung 11.10: Zwei Diamanten

und

, die über ...

...

das Literal

en...

Abbildung 11.11: Knoten und Kanten in Abbildung 11.12: Hamiltonkreise in Abbildung 11.13:

und

bzw.

bzw.

, wobei

Abbildung 11.14: Erzeugen von

, falls ...

keinen Hamilton-Kreis enthält. Offensichtlich e...

aus

Abbildung 11.15: Die Knoten

bilden eine 4-Clique in diesem Graphen.

Abbildung 11.16: Der zu Graph

gehörende

Abbildung 11.17: Zwei isomorphe Graphen

und

Kapitel 13 Abbildung 13.1: Illustration der Mengenoperationen

und

Kapitel 14 Abbildung 14.1: Ein ungerichteter Graph Abbildung 14.2: Ein gerichteter Graph Abbildung 14.3: Ein vollständiger Graph mit vier Knoten Abbildung 14.4: Beispiele für zusammenhängende und nicht zusammenhängende Graphen Abbildung 14.5: Die Anzahl der Wege der Länge gegeben.

von

nach

ist durch

Abbildung 14.6: Der Graph mit der Adjazenzmatrix Abbildung 14.7: Ein Graph

und zwei mögliche Spannbäume

Abbildung 14.8: Ein Baum in ungeordneter und in geordneter Darstellung Abbildung 14.9: Beispiele für eulersche und nicht-eulersche Graphen. Der Graph au... Abbildung 14.10: Konstruktion des minimalen Spannbaums zum gewichteten Graphen Abbildung 14.11: Beispielgraph für den Christofides-Algorithmus Abbildung 14.12: Minimaler Spannbaum von Abbildung 14.13: Euler-Graphen für den Christofides-Algorithmus

Einleitung Was ist theoretische Informatik? »It is unnecessary to design various new machines to do various computing processes. They can all be done with one digital computer, suitably programmed for each case.« (Es ist nicht nötig, immer neue, verschiedene Maschinen für verschiedene Rechenprozesse zu entwerfen. Sie können alle von einem einzigen digitalen Computer bearbeitet werden, der für jeden Fall geeignet programmiert wird.) Alan Turing, in »Computing Machinery and Intelligence«, Mind, 1950 Für uns heute, die wir gewohnt sind, Computer als allgegenwärtige und universelle Werkzeuge anzusehen, ohne die unsere Alltag fast undenkbar wäre, bedeuten diese Sätze nicht viel mehr als eine Selbstverständlichkeit. Aber als Alan Turing sie 1950 in der philosophischen Zeitschrift Mind veröffentlichte, dürften die meisten seiner Leser unter dem Wort »Computer« noch eine menschliche Person, die Rechenaufgaben mit Papier und Bleistift löst, verstanden haben. Natürlich gab es bereits mechanische und elektromechanische Rechenmaschinen auf dem Markt, aber dies waren Maschinen, die ausschließlich addieren, subtrahieren, multiplizieren oder dividieren konnten. Die Idee, dass es eine einzige Maschine für eine Vielzahl von Aufgaben geben könnte, war für die breite Öffentlichkeit neu. Und was sollte es bedeuten, diese Maschine geeignet zu »programmieren«? Die theoretischen Grundlagen für seine Aussagen von 1950 hatte Turing bereits 1936 in einem bahnbrechenden Aufsatz gelegt, in dem er ein einfaches mathematisches Modell einer »Logic Computing Machine« entwarf und dann zeigte, dass so eine Maschine tatsächlich universell ist, also alle möglichen Aufgaben übernehmen kann, wenn man sie nur mit den richtigen Eingabedaten füttert. Gleichzeitig bewies er aber auch, dass auch der universelle Computer nicht alles und jedes berechnen kann, indem er Probleme angab, die mit einer solchen Maschine prinzipiell nicht gelöst werden können. Die Vision einer universellen Maschine hatten vor Turing schon andere gehabt, aber erst Turing konnte beweisen, dass es sie tatsächlich gibt, und zeigen, welche Konponenten sie benötigt. In den fünfziger Jahren gingen dann Turing und seine Kollegen in England und den USA daran, die Vision Wirklichkeit werden zu lassen. Für mich verkörpert Alan Turings Aufsatz von 1936 »On Computable Numbers, with an Application to the Entscheidungsproblem« die Quintessenz der theoretischen Informatik: Mit Hilfe eines mathematischen Modells wird eine abstrakte Maschine beschrieben, die mächtig genug ist, um im Prinzip alle Aufgaben lösen zu können, die auch heutige Computer lösen können. Andererseits ist die Maschine so einfach gebaut, dass es möglich

ist, sowohl ihre Universalität als auch ihre Beschränkungen mit mathematischen Mitteln zu beweisen. Die theoretische Informatik nutzt also mathematische Konzepte und Beweisverfahren, um allgemeingültige Aussagen über das Wesen und die Fähigkeiten von Computern und den von ihnen bearbeiteten Problemen treffen zu können. Deswegen besitzt die theoretische Informatik einen hohen Mathematisierungs- und Abstraktionsgrad, der auf viele abschreckend wirkt und sie nicht gerade zum Lieblingsfach angehender InformatikerInnen im Grundstudium werden lässt. Aber die Abstraktion ist kein Selbstzweck, sondern hat eine wichtige Konsequenz: Die Aussagen der theoretischen Informatik sind unabhängig von der verwendeten Hard- und Software, von CPUTaktfrequenzen, Betriebssystemen und Programmiersprachen. Was man hier einmal bewiesen hat, das gilt (und hat durchaus auch Konsequenzen für den Alltag eines Informatikers).

Über dieses Buch Machen wir uns nichts vor – die Wahrscheinlichkeit, dass Sie dieses Buch gekauft haben, um den Stoff einer Vorlesung in theoretischer Informatik an einer Hochschule oder Universität besser zu verstehen, ist relativ hoch. Genau dabei möchte Ihnen dieses Buch helfen, und zwar durch möglichst ausführliche Erklärungen, viele komplett ausgeführte Rechnungen und, wenn möglich, bildliche Darstellungen. Das bedeutet aber auch, dass dieses Buch nicht ohne einen gewissen mathematischen Formalismus auskommen kann. Die theoretische Informatik liegt nun einmal an der Schnittstelle zwischen Informatik und Mathematik und macht ausgiebig von den Methoden und Begriffen der Mathematik Gebrauch. Ich habe aber - vor allem zu Beginn - versucht, Ihnen den Einstieg in den Formalismus der theoretischen Informatik zu erleichtern, indem ich viele Formeln auch noch einmal in Umgangssprache erklärt habe. Natürlich wäre es auch möglich, die wesentlichen Konzepte der theoretischen Informatik »formelfrei« zu besprechen, aber ein solches Buch wird Ihnen nicht dabei helfen, Ihre Hausaufgaben und Klausuren in theoretischer Informatik zu bestehen. Ebensowenig ist es möglich, bei Stoffauswahl und darstellung komplett neue, nie dagewesene Wege zu beschreiten. Ein solches Buch wäre vielleicht für Spezialisten interessant, die den Standard-Stoff ohnehin beherrschen, wäre aber für den durchschnittlichen Studenten so gut wie nutzlos. Machen Sie sich also - trotz des unkonventionellen Titels - auf ein relativ konventionelles Lehrbuch gefasst. Ich habe meine Vorlesungen immer so gehalten, wie ich als Student mir eine Vorlesung gewünscht hätte, und ich habe versucht, beim Schreiben dieses Buches der gleichen Devise zu folgen: Ich wollte ein Buch schreiben, wie ich es mir für mich selbst beim Erlernen der Inhalte in diesem Buch gewünscht hätte. Dies mag eine Selbstverständlichkeit sein, aber ich möchte es hier trotzdem erwähnen, um zu zeigen, dass Lehren und Lernen sehr subjektive, vom Individuum abhängige Dinge sind und es den einen Königsweg nicht gibt.

Wie dieses Buch aufgebaut ist Das Buch beginnt in Teil I mit der Automatentheorie. Ausgehend von sehr einfachen Automaten und ihren mathematischen Modellen fügen wir den Automaten nach und nach weitere Fähigkeiten hinzu, bis wir beim bis heute gültigen mathematischen Modell für unsere Computer angekommen sind, der Turing-Maschine. Die Beweise dafür, dass die Turing-Maschine einerseits wirklich eine universelle Maschine darstellt und andererseits trotzdem gewisse Einschränkungen bei dem besitzt, was sie berechnen kann, bilden einen ersten inhaltlichen Höhepunkt. Nachdem es in Teil I unter anderem darum ging, formale Sprachen mithilfe von Automaten zu »erkennen« und sie durch die Art der erkennenden Automaten zu charakterisieren, geht es in Teil II um das »Erzeugen« formaler Sprachen mit Hilfe von Regelsätzen, so genannten Grammatiken. Der Nachweis, dass bestimmte Grammatiktypen bei der Erzeugung bzw. Akzeptanz von Sprachen äquivalent zu den in Teil I betrachteten Automatentypen sind, bildet das Leitmotiv in diesem Teil. Teil I und Teil II handelten davon, was mit Computern prinzipiell möglich und was prinzipiell unmöglich ist - in Teil III fragen wir schließlich danach, wie schnell ein Problem auf dem Computer lösbar ist. In der Komplexitätstheorie wird die Schwierigkeit von Problemen grob in so genannte Komplexitätsklassen eingeteilt, und wir werden sehen, dass es bestimmte, besonders schwierige Probleme gibt, die mit dem Computer nicht effizient gelöst werden können. Der Nachweis, dass es einen harten Kern von besonders schwierigen Problemen gibt, auf die alle anderen schwierigen Probleme zurückgeführt werden können, bildet den Höhepunkt und Abschluss von Teil III und damit auch den Abschluss des klassischen Stoffs der Theoretischen Informatik, den man im Rahmen einer vierstündigen Vorlesung abdecken kann. Ich gehe davon aus, dass die meisten meiner Leser bereits eine oder mehrere Anfängervorlesungen in Mathematik gehört haben, da die Theoretische Informatik zumeist im zweiten oder dritten Semester auf dem Lehrplan steht. Trotzdem finden es manche vielleicht nützlich, wenn sie für die Theoretische Informatik wichtige mathematische Grundbegriffe direkt hier im Buch nachschlagen können. In Teil IV habe ich diese Grundbegriffe kurz und knapp und zumeist ohne Beweis zusammen gestellt. Eine Ausnahme bildet die Graphentheorie, die ich etwas ausführlicher als unbedingt nötig dargestellt habe, weil sie zum einen nicht unbedingt zum Standard-Kanon der ersten Semester gehört, zum anderen relativ leicht zugänglich ist und nicht nur ein Hilfskonzept für die Theoretische Informatik darstellt, sondern auch eine Fülle von Anwendungsbeispielen und Problemen mit praktischer Relevanz bietet. Kein Buch der »für Dummies« - Reihe ohne abschließenden Top-Ten-Teil. Anstatt hier noch einmal die wichtigsten Aussagen zu wiederholen (in gewisser Weise passiert dies auf den Schummelseiten zu Beginn), habe ich mich dazu entschlossen, hier noch kurz auf die

Menschen hinter den wichtigsten Resultaten der Theoretischen Informatik einzugehen. Wie oben beschrieben, war das Jahr 1936 wie der Startschuss der Theoretischen Informatik, und bekanntermaßen waren die dreißiger Jahre des letzten Jahrhunderts auch sonst eine sehr bewegte Zeit. Dies spiegelt sich auch in den Lebensläufen der beteiligten Wissenschaftler wider, die keineswegs immer geradlinig verliefen. Gerade Alan Turing, von seiner Persönlichkeit her eigentlich der Prototyp des »Nerds«, war alles andere als ein akademischer Stubenhocker und schaffte es mit seiner intellektuellen Brillianz, den Lauf der Weltgeschichte zu beeinflussen.

Symbole in diesem Buch In diesem Buch werden Sie immer wieder bestimmte Symbole zu Ihrer Orientierung finden: Mit diesem Symbol werden Definitionen markiert. In Definitionen werden neue Begriffe mit Hilfe bereits eingeführter Begriffe erklärt. Der neue Begriff ist dabei in Fettdruck hervorgehoben.

Ein Beispielsatz Mit diesem Symbol werden wichtige neue Aussagen bzw. Sätze, die wir aus dem, was wir schon wissen, hergeleitet haben (oder noch herleiten müssen), hervorgehoben. Zusätzlich sind diese Aussagen durch einen grauen Kasten hervorgehoben.

Dieses Symbol ist für das Verständnis der Inhalte des Buches besonders wichtig, denn es markiert Beispiele, in denen Definitionen oder neue Aussagen illustriert werden. Die Rechnungen in Beispielen sind im Normalfall sehr detailliert gehalten, damit Sie sie gut nachvollziehen können.

Wie Sie dieses Buch lesen sollten Idealerweise lesen Sie in diesem Buch die Teile I, II und III hintereinander und schlagen gegenenfalls einen mathematischen Begriff in Teil IV nach. Falls Ihnen die Zeit fehlt und Sie schon gewisse Vorkenntnisse besitzen, können Sie auch versuchen, die Teile I bis III unabhängig voneinander zu lesen. Dabei sollten Sie immer einen Bleistift und Papier zur Hand haben. Vollziehen Sie die Beispiele selbst nach und denken Sie sich eigene Beispiele aus. Am Ende jedes Kapitels finden Sie einige Aufgaben. Diese sind normalerweise nicht besonders schwer und dienen vor allem dazu, dass Sie für sich selbst testen können, ob Sie die Inhalte des Kapitels verstanden haben. Als kleine Hilfe, so zur

Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wileyvch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. Und nun wünsche ich Ihnen viel Spaß und Erfolg bei Ihrer Reise durch die theoretische Informatik!

Teil I

Endliche Automaten

IN DIESEM TEIL… beschäftigen wir uns mit sogenannten endlichen Automaten, das sind abstrakte mathematische Modelle für Systeme mit diskreter Ein- und Ausgabe. Auch unsere Computer sind solche, wenn auch sehr komplizierte, endliche Automaten. Das Ziel dieses Teils ist es, ein mathematisches Modell zu finden, das einerseits hinreichend mächtig ist, um die Verhaltensweisen unserer Computer nachbilden zu können, und andererseits noch einfach genug ist, um allgemeine Ausagen über das Verhalten von Computern beweisen zu können. Mit Hilfe dieser Modelle läßt sich also klären, was Computer im Prinzip leisten können und was nicht. Zu diesem Zweck beginnen wir mit sehr einfachen Modellen, den Deterministischen Endlichen Automaten (DEAs). Wir werden deren Fähigkeiten nach und nach erweitern, bis wir schließlich mit den TuringMaschinen ein geeignetes mathematisches Modell finden werden, das tatsächlich im Prinzip die Fähigkeiten unserer heutigen Computer besitzt, obwohl Turing-Maschinen bereits 1936 beschrieben wurden.

Kapitel 1

Deterministische Endliche Automaten (DFAs) IN DIESEM KAPITEL lernen Sie sogenannte Deterministische Endliche Automaten, kurz DFAs, kennen erfahren Sie wie ein DFA funktioniert lernen Sie die Möglichkeiten und Grenzen von DFAs kennen

DFAs stellen die einfachsten mathematischen Modelle für unsere Computer dar. Diese Modelle bekommen als Input einen String aus Eingabezeichen. Der Output besteht aus einer Entscheidung darüber, ob das Wort »akzeptiert« wird oder nicht, d. h., der Automat kann erkennen, ob das Eingabewort eine bestimmte Eigenschaft besitzt oder nicht. In diesem Kapitel werden wir die Möglichkeiten und Grenzen dieser Automaten erkunden.

Einführung »The Analytical Engine has no pretensions whatever to originate anything. It can do whatever we know how to order it to perform.« (Die Analytical Engine hat keinerlei Ambitionen, irgendetwas entstehen zu lassen. Sie kann die Dinge tun, von denen wir wissen, wie wir ihr befehlen können, sie auszuführen.) »Ada Lovelace, in »Notes of the Translator«, Taylor's Scientific Memoirs, 1843. Dieses Zitat zum näheren Einstieg. Das Verhalten unserer Computer wird von zwei Faktoren bestimmt: Ihrem inneren Zustand, d. h. den Bits und Bytes in ihren Speicherzellen, die die aktuelle Konfiguration des Computers bestimmen, und den Eingaben, die wir als User machen. Im Folgenden versuchen wir, einfache mathematische Modelle für Computer zu finden und so ihr Verhalten besser zu verstehen. Dabei müssen wir darauf achten, dass wir uns von möglichst vielen unnötigen Details befreien (z. B. sollte es für unsere Zwecke egal sein, ob die Eingaben von einer Tastatur oder von einer Maus kommen). Anderenfalls wird unser Modell zu kompliziert, und es wird zu schwierig, allgemeine Aussagen über ihr Verhalten zu machen. Ist unser Modell auf der anderen Seite zu einfach, so sind die Möglichkeiten des Modells zu stark eingeschränkt, und wir können nicht erwarten, über das Modell interessante Informationen zu erhalten, da es zu stark von der Wirklichkeit abweicht.

Das einfachste dieser Modelle bilden die Deterministischen Endlichen Automaten (engl. Deterministic Finite Automata, DFAs). In ihnen setzen wir die Eigenschaft realer Computer um, bei Eingaben von außen ihren Zustand zu wechseln. Das Wort Determinismus kommt aus dem Lateinischen und bedeutet so viel wie »vorherbestimmt«. DFAs verarbeiten eine Folge von Eingabezeichen und setzen diese anhand eines vorgegebenen Regelwerks (man könnte auch sagen, Programms) in Wechsel ihres inneren Zustands um. Deterministische Automaten besitzen die Eigenschaft, dass sich ihr zukünftiges Verhalten anhand ihres aktuellen Zustands und der Eingabezeichen vorhersagen lässt. Niemand würde auf die Idee kommen, abstrakte DFAs, wie wir sie hier diskutieren, tatsächlich zu bauen. Dennoch hilft es vielleicht Ihrer Intuition, einen Hardware-DFA bildlich vor sich zu sehen:

Abbildung 1.1: Hardware-Modell eines Deterministischen Endlichen Automaten

Der Automat liest die Folge von Eingabezeichen von einem Eingabeband. Der Lesekopf kann sich immer nur um ein Feld weiter und nur in einer Richtung bewegen. Eine Steuereinheit verarbeitet die Eingabezeichen und veranlasst die Zustandswechsel. Wichtig dabei: Die Anzahl der Zustände der Steuereinheit ist endlich (so wie auch unsere Computer nur endlich viele Speicherzustände besitzen) und die Zustandswechsel sind, wie schon gesagt, bei Kenntnis des vorherigen Zustands und des Eingabezeichens

vorhersagbar, also deterministisch.

Erste Beispiele DFAs lassen sich zur Modellierung vieler alltäglicher Situationen benutzen, die auf den ersten Blick nichts mit Computern zu tun haben. Wir beginnen hier mit einigen Beispielen, bevor wir im nächsten Abschnitt eine formale Definition eines DFAs geben. Ein Aufzug kann als DFA betrachtet werden. Die Zustände des Automaten sind dabei die Stockwerke, die der Aufzug anfahren kann. Die Eingabe in den Automaten stellt das gewünschte Stockwerk dar. Sie erfolgt über Tastendrücke im Aufzug oder über die »Holtaste«. Je nachdem, ob der Aufzug über eine Stockwerksanzeige verfügt oder nicht, handelt es sich um einen DFA mit bzw. ohne Ausgabe. Unser nächstes Beispiel stellt ein altes Rätsel für Kinder dar. Vielleicht haben Sie schon einmal davon gehört: Ein Bauer , ein Wolf , eine Ziege und ein Kohlkopf stehen am linken Ufer eines Flusses. Es gibt zwar ein Boot, in das aber nur der Bauer und ein weiteres Objekt hineinpassen. Zudem sollten der Wolf und die Ziege bzw. Ziege und Kohlkopf niemals allein an einem Ufer stehen, da es sonst zu unerwünschten Nebeneffekten kommt. Wie können alle vier sicher den Fluss überqueren? Auch dieses alte Problem lässt sich mit Hilfe eines DFAs (ohne Ausgabe) modellieren. Die Zustände sind dabei die Menge der Objekte, die sich aktuell am linken Ufer befinden. Da zu Beginn noch alle am linken Ufer sind, ist das System am Anfang also im sogenannten Startzustand . Die Eingaben in das System bestehen aus den Objekten, die der Bauer mit zu sich ins Boot holt, kommen also aus der Menge . Der Bauer muß immer mitfahren (sonst ließe sich das Boot nicht steuern) und wird deshalb nicht eigens aufgeführt. Das Zeichen steht für den Fall, dass der Bauer alleine fährt. Der gewünschte Endzustand ist erreicht, wenn alle Objekte am anderen Ufer sind. Nach diesen Vorbereitungen ist es nicht allzu schwer, sich zu überlegen, wie der Bauer vorgehen muss. Er muss bei den Überfahrten lediglich darauf achten, dass das System nicht in einen der verbotenen Zustände gerät. Visualisiert man sich die aus den erlaubten Bootsfahrten resultierende Abfolge der Zustände und lässt verbotene Zustände und Überfahrten, die in verbotene Zustände führen, der Übersichtlichkeit halber weg, erhält man den gerichteten Graphen in Abbildung 1.2. Der Endzustand wurde doppelt umrandet.

Abbildung 1.2: Die Geschichte vom Bauern, dem Wolf, der Ziege und dem Kohlkopf

Die Frage ist nun: Wie kommen wir vom Start- in den Endzustand? Aus Abbildung 1.2 lässt sich ablesen, dass eine Abfolge von Zügen der Form oder den Bauern zum erwünschten Ziel führt. Dies sind aber längst nicht die einzig möglichen Lösungen: Hat der Bauer Spaß am Boot fahren, kann er auch nach dem Schema bzw. vorgehen, solange die Anzahl der Wiederholungen von bzw. ungerade ist. Wir werden später sehen, dass die Möglichkeit, Teile derjenigen Eingabewörter, die den Automaten in den Endzustand überführen, wiederholen zu können, typisch für DFAs ist. Das letzte Beispiel enthält bereits alle wichtigen Zutaten der formalen Definition eines DFAs: Es gibt einen Start- und einen Endzustand, und wir sehen, dass sich die Zustandsübergänge eines DFA mit Hilfe eines Graphen gut visualisieren lassen. Dieser Graph bildet gewissermaßen die Software bzw. das Räderwerk im Innern der Steuereinheit des DFA s.

Unser letztes einführendes Beispiel kommt aus der IT-Welt: Netzwerkprotokolle lassen sich in der Regel gut über DFAs veranschaulichen, da sie ihre Zustände nach genau vorgeschiebenen (d. h. standardisierten) Regeln wechseln. Wäre das anders, wäre die Kommunikation zwischen Rechnern, die zuvor noch keinen Kontakt hatten, sehr mühsam. Ein Server, der im Internet einen Dienst anbietet, erzeugt dazu zunächst einen so genannten Socket (Sockel) und wartet dann auf Verbindungswünsche von Clients über das TCP-Protokoll. Der Socket besteht aus der IP-Adresse des Servers und der Portnummer des angebotenen Diensts (z.B. 80 für http). Auch Clients können Sockets mit selbst gewählten Portnummern erzeugen und von dort aus Verbindungen zu Servern initiieren. Dabei läuft zunächst der sogenannte Three-Way-Handshake des TCP-Protokolls ab, bei dem ein Verbindungsaufbauwunsch (zu erkennen am gesetzten SYN-Flag) mit einem SYN-ACK-Paket (SYN- und ACK-Flag gesetzt) beantwortet wird. Ein finales ACK-Paket beendet den Handshake. Nach geglücktem Verbindungsaufbau werden TCP-Pakete mit gesetztem ACK-Flag zwischen Client und Server ausgetauscht, bis die Verbindung von einer der Parteien mit einem FIN-Paket beendet wird. Jedes Mal wenn ein Paket gesendet oder empfangen wird, wechselt der Socket in genau vorherbestimmter Weise seinen Zustand. Sein Verhalten kann also als DFA modelliert werden, wobei die Zustandsübergänge durch die Flags (das sind bestimmte wohldefinierte Bits im Header der Pakete, die die Art des Pakets festlegen) der empfangenen Pakete ausgelöst werden.

Grundlegende Definitionen Wir sind nun bereit, einen DFA als mathematisches Modell formulieren zu können. Dazu müssen wir die Zustände, die Eingaben und die Reaktion des DFA auf die Eingaben modellieren.

Symbole und Wörter Wir beginnen mit der Modellierung der Eingaben in den DFA, also den Zeichen bzw. Zeichenketten auf dem Eingabeband in Abb. 1.1: sei eine endliche Menge, das Alphabet. Die Elemente von Symbole oder Zeichen.

heißen

Ein Wort oder String ist eine endlich lange Folge von Symbolen. Die Menge aller Wörter, die aus den Symbolen in gebildet werden können, wird mit bezeichnet. Die Länge eines Worts

wird mit

bezeichnet.

steht für die Anzahl der

Symbole, aus denen genannte leere Wort Eine Teilmenge

besteht. enthält auch ein besonderes Wort, das so . Es besteht aus keinem Symbol, hat also die Länge null. von Wörtern heißt formale Sprache über .

Sie kennen natürlich den Begriff des Alphabets aus dem Alltag. Die englische Sprache kommt mit dem Alphabet aus. Die Menge enthält sinnvolle Wörter wie oder , aber natürlich auch sprachlich sinnlose Strings wie oder . Da wir in diesem Buch nicht an menschlichen Sprachen interessiert sind, unterscheiden wir an dieser Stelle nicht zwischen sinnvollen und sinnlosen Strings. Typische Alphabete, die wir in diesem Buch immer wieder benutzen werden, sind und . Für ist . Offenbar lässt sich aus einer endlichen Menge von Symbolen eine abzählbar unendliche Menge1 von Wörtern formen. Das gilt sogar, wenn nur aus einem Symbol besteht: Für zum Beispiel ist . Oft werden wir zwei Wörter aneinander hängen: Aus

und

, die aus derselben Menge kommen, einfach und wird das Wort . Diese Operation bezeichnen wir als Konkatenation. Natürlich gilt der Zusammenhang . Voranstellen oder Anhängen des leeren Worts an ein Wort ändert nichts: . Konkateniert man ein Wort mit sich selbst, erhält man das Wort z. B.

und

. Allgemeiner setzen wir , so ist

. Ist also .

Die Definition eines DFAs Wir können nun die komplette Definition eines DFAs angeben. Zentrales Element wird dabei die so genannte Übergangsfunktion sein, die die Zustandswechsel des Automaten als Reaktion auf ein Eingabezeichen beschreibt. Lassen Sie sich von dem mathematischen Formalismus nicht abschrecken. Er ist nötig, weil es sich bei einem DFA um ein mathematisches Modell handelt. Nur durch einen gewissen Grad an Abstraktion ist es möglich, sich von überflüssigen oder vom wesentlichen ablenkenden Details (wie z.B. der Frage, wie ein DFA in Hardware realisiert ist) zu befreien. Mit zunehmender Beschäftigung mit DFAs und ihren Varianten werden Sie auch an Vertrautheit mit dem Formalismus gewinnen. Ein Deterministischer Endlicher Automat (DFA) ist ein 5-Tupel , bestehend aus:

einer endlichen Zustandsmenge einem Eingabealphabet

, die die Zustände enthält.

, wobei

.

einer Übergangsfunktion einem Startzustand

. .

einer Menge von Endzuständen

.

Lassen Sie uns die fünf Zutaten eines DFAs nacheinander durchsprechen. Die endliche Zustandsmenge ist für das D (wie finite) in DFA verantwortlich. Auch die Automaten, denen wir im Alltag begegnen, kennen nur eine endliche Anzahl von Zuständen. Das Eingabealphabet besteht aus den Zeichen, die in den Automaten eingegeben werden können und damit Zustandsübergänge bewirken. Natürlich müssen wir deutlich zwischen Eingabezeichen auf der einen Seite und Zuständen auf der anderen Seite unterscheiden, deshalb die Forderung . Die Übergangsfunktion beschreibt das Verhalten des Automaten, d. h., die Zustandsübergänge, wenn Symbole in den Automaten eingegeben werden. Der neue Zustand hängt sowohl vom alten Zustand als auch vom Eingabesymbol ab. Deshalb kommt der Input für die Funktion aus der Menge , also der Menge der geordneten Paare von Zuständen und Eingabesymbolen. Der Output hingegen ist ein einzelner, genau festgelegter Zustand aus der Zustandsmenge . Ein allgemeiner Zustandsübergang hat also die Form

für ein Symbol und . Beispielsweise lautet einer der Übergänge des Bauer-Ziege-Wolf-Kohlkopf-Automaten oben: Eine sogenannte Wertetabelle listet alle diese Zustandsübergänge auf. Im Prinzip lässt sich die Übergangsfunktion und damit das Verhalten des Automaten durch eine Wertetabelle komplett beschreiben. So eine Liste wird aber schnell unübersichtlich, und das Verhalten des Automaten lässt sich nur schwer daraus ablesen. Zum Glück lässt sich ein DFA mit Hilfe eines gerichteten Graphen auch grafisch darstellen, wie wir am Beispiel des Bauer-Ziege-Wolf-Kohlkopf-Automaten gesehen haben. Dabei entsprechen die Knoten des Graphen den Zuständen und die Pfeile den Zustandsübergängen. Der Graph wird auch als Übergangsdiagramm des DFAs bezeichnet. Schließlich besitzt jeder DFA einen speziellen Startzustand , in dem er sich befindet, bevor irgendwelche Eingaben gemacht werden, und einen oder mehrere Endzustände, die gewissermaßen das Ziel des Automaten vorgeben. Wie das folgende Beispiel zeigt, können Start- und Endzustand durchaus zusammenfallen.

Wir betrachten den DFA

Die Übergangsfunktion definiert: 0

des Automaten wird durch die folgende Wertetabelle

1

Der dazugehörige Übergangsgraph sieht damit so aus wie in Abbildung 1.3.

Abbildung 1.3: Ein erstes Übergangsdiagramm eines DFA

Was macht dieser Automat? Anders gefragt, welche Strings überführen den Startzustand in den Endzustand? Da der Startzustand gleichzeitig auch Endzustand ist, brauchen wir gar nichts einzugeben und sind schon gewissermaßen am Ziel. Das leere Wort gehört also sicherlich zu den gesuchten Strings. Ist das Eingabewort nicht leer, so bewirkt jede 0 einen Sprung über den (gedachten) Graben zwischen und . Zwei Sprünge (oder ein Vielfaches davon) bringen uns wieder zurück nach . Also bewirken alle Strings mit der Eigenschaft, eine gerade Anzahl von 0 zu enthalten, dass der Automat vom Start- in den Endzustand übergeht. Das leere Wort passt auch in dieses Schema, da es null mal das Symbol 0 enthält. Man kann also sagen: Der Automat in Abbildung 1.3 prüft, ob ein Eingabewort eine gerade Anzahl von 0 enthält.

Reguläre Sprachen Die Frage, welche Menge von Wörtern (bzw. welche Sprache) einen DFA vom Start- in den Endzustand überführt, ist eine typische Aufgabenstellung in der Automatentheorie. In diesem Abschnitt werden wir weitere Beispiele für solche Mengen anschauen und

untersuchen, welche Eigenschaften sie haben.

Die erweiterte Übergangsfunktion Die Übergangsfunktion sagt uns, wie ein Automat auf einzelne Eingabezeichen reagiert. Wenn wir aber wissen möchten, welcheWörter einen Automaten vom Start- zum Endzustand überführen, wäre eine Art erweiterte Übergangsfunktion nützlich, die uns die Reaktion des Automaten auf ganze Eingabewörter liefert. Welche Eigenschaften müsste eine solche erweiterte Übergangsfunktion (sprich: Delta-Dach) haben? Zunächst einmal bekommt ein Paar aus einem Zustand und einem Wort als Input, das heißt, muss auf der Menge operieren. Der Output ist dann derjenige Zustand, in den der DFA vom Zustand nach Eingabe des Worts übergeht. Insgesamt muss also gelten:

Gibt man das leere Wort in den Automaten ein, soll sich am aktuellen Zustand nichts ändern:

Außerdem darf es natürlich keine Konflikte mit der bestehenden Übergangsfunktion geben. Gibt man nur ein einziges Symbol ein, so muss der Output von mit dem von übereinstimmen. Diese Überlegung lässt sich dazu ausnutzen, die Wirkung von mit Hilfe von rekursiv zu definieren:

Tatsächlich reichen diese beiden Eigenschaften aus, um vollständig festzulegen. Als Beispiel betrachten wir noch einmal den Automaten aus Abb. 1.3, also

und berechnen

:

Das erscheint unnötig aufwendig und kompliziert. Wir haben zwar das erwartete Ergebnis bekommen, aber warum kann man nicht einfach bei starten und das Eingabewort dann Symbol für Symbol von links nach rechts mit Hilfe von abarbeiten? Tatsächlich wird man, wenn man bei einem konkreten DFA für einen konkreten Zustand und ein konkretes Wort ausrechnen möchte, immer das Wort von links nach rechts bearbeiten, ohne auf die Definition von zurückzugreifen. Aber für abstrakte Argumentationen in Beweisen oder Defintionen, die nicht einem konkreten Wort arbeiten, ist es Gold wert, die erweiterte Übergangsfunktion als formales Werkzeug zur Hand zu haben. Dies zeigt schon die nächste Definition, in der wir die Menge der Wörter, die einen DFA vom Start- in den Endzustand überführen, mit Hilfe von auf elegante Weise charakterisieren können: Ein DFA Anfangszustand

durch

Die Menge aller von Sprache :

akzeptiert ein Wort , wenn der in einen Endzustand überführt wird, d. h., wenn gilt:

akzeptierten Wörter heißt die von

Eine formale Sprache heißt regulär, falls es einen DFA akzeptierte Sprache hat.

akzeptierte

gibt, der

als

Beispiele regulärer Sprachen Eine reguläre Sprache haben wir bereits kennengelernt: Die Sprache der Wörter mit einer geraden Anzahl von Nullen. Es folgen nun einige weitere Beispiele für reguläre Sprachen mit den dazugehörigen DFAs. Wir betrachten die Sprache

über dem Alphabet . Es geht also um die Menge der binären Strings, die auf 00 enden. Ein dazugehöriger Automat , der akzeptiert, sieht so aus:

Abbildung 1.4: Ein DFA, der prüft, ob das Eingabewort auf zwei Nullen endet.

Zum Beispiel ist und . Aber woher wissen wir, dass genau die Wörter aus akzeptiert? Bei diesem einfachen Automaten können wir direkt nachrechnen, dass alle Wörter aus akzeptiert werden. Dazu prüfen wir mit Hilfe von nach, dass alle Wörter der Form von in den Endzustand führen:

Damit ist klar, dass . Außerdem können wir leicht prüfen, dass auch keine anderen Wörter akzeptiert werden. Das sind nämlich alle Wörter, die auf 1 enden, alle, die auf 10 enden, sowie das Wort :

Somit gilt

, und wir wissen, dass es sich bei um eine reguläre Sprache

handelt. Beginnen wir diesmal mit dem Automaten arbeitet:

, der wieder über dem Alphabet

Welche Sprache akzeptiert dieser Automat? Bei genauerem Hinsehen stellt sich heraus, dass man mindestens drei aufeinanderfolgende Nullen benötigt, um vom Startzustand in den Endzustand zu gelangen. Ist man einmal im Endzustand, kann dieser nicht mehr verlassen werden. Tatsächlich bilden alle Wörter, die drei aufeinanderfolgende Nullen enthalten, die von akzeptierte Sprache:

Zum Beweis rechnen wir wieder als Erstes nach, dass alle Wörter der Sprache akzeptiert werden:

Auf der anderen Seite gibt es keine andere Möglichkeit, in den Endzustand zu gelangen, als mit Hilfe dreier aufeinanderfolgender Nullen. Es werden also keine Wörter akzeptiert, die nicht in liegen. Schließlich möchte ich Ihnen einen Automaten über dem Alphabet zeigen, der gewissermaßen rechnen kann:

Gibt man probeweise einige Wörter in den Automaten ein, zeigt sich folgendes Verhalten: Die Nullen im Eingabewort sorgen dafür, dass man sich im Uhrzeigersinn durch den Automaten bewegt: Nach vier Nullen ist man wieder im Startzustand, der gleichzeitig auch Endzustand ist. Die Einsen sorgen für eine gegenläufige Bewegung. Beispielweise ist und . Offenbar ist also die Differenz zwischen der Anzahl der Nullen und Einsen im Eingabewort entscheidend dafür, in welchem Zustand man am Ende landet. Stellt diese Differenz

ein Vielfaches von 4 dar, hat man den Automaten mehrfach umrundet, und das Wort wird akzeptiert. Etwas präziser formuliert: Ist Einsen in einem Eingabewort

bzw. , so gilt:

die Anzahl der Nullen bzw.

Der Automat kann also prüfen, ob die Differenz der Anzahl der Nullen und Einsen im Eingabewort ein Vielfaches von 4 darstellt. Ist man an einem anderen Rest beim Teilen durch 4 interessiert, kann man einfach den Endzustand verändern: Erklärt man z. B. anstelle von zum Endzustand, so erhält man natürlich die Sprache

Diese Beispiele zeigen, dass es durchaus eine große Vielfalt regulärer Sprachen gibt. Können wir irgendwelche allgemeinen Aussagen darüber treffen, welche Sprachen regulär sind? Wie steht es beispielsweise mit Sprachen, die nur aus einer endlichen Zahl von Wörtern bestehen? Für solche Sprachen lässt sich tatsächlich immer ein passender DFA finden.

Endliche Sprachen sind regulär. sei ein Alphabet. Dann ist jede endliche Teilmenge eine reguläre Sprache.

Zum Beweis dieser Aussage gehen wir ohne Beschränkung der Allgemeinheit davon aus, dass ist. Wir konstruieren einen zu passenden DFA , indem wir seinen Übergangsgraphen im Prinzip als Binärbaum anlegen mit dem Startzustand als Wurzelknoten. Für jedes der Wörter reservieren wir einen eigenen Endzustand als Blattknoten. Wir konstruieren den Baum so, dass der Weg von der Wurzel zu einem Endzustand der Abfolge der Symbole in entspricht. Da es nur endliche viele Wörter in gibt, brauchen wir dafür auch nur endlich viele Zustände. Für ungültige Symbolfolgen, also Teilwörter, die keine Chance mehr haben, zu einem der Wörter in zu werden, stellen wir noch zusätzlich einen Fehlerzustand bereit, der nicht mehr verlassen werden kann und den wir mit einem markieren. Leider zerstört die Notwendigkeit des Fehlerzustands die schöne Baumstruktur des Übergangsgraphen. An der Gültigkeit der Konstruktion ändert dies jedoch nichts. Schauen wir uns ein Beispiel an:

. Der zu dieser Sprache passende DFA hat drei

Endzustände

und den folgenden Übergangsgraphen:

Das Pumping Lemma Gibt es eigentlich auch nicht-reguläre Sprachen? Die Sprache

über dem Alphabet bildet ein klassisches Beispiel einer nicht-regulären Sprache: So lange einen festen Wert besitzt, ist die Sprache endlich und somit regulär. Läßt man jedoch alle Werte für zu, bräuchte ein Automat, der akzeptiert, eine Möglichkeit, sich zu merken, wie viele das Eingabewort enthält. Die einzige Speichermöglichkeit für einen DFA besteht jedoch in seinen Zuständen. Kann beliebig groß werden, braucht man also auch beliebig viele Zustände zum Speichern. Der Automat kann also nicht endlich sein. Tatsächlich kann man einer Sprache in vielen Fällen ansehen, dass sie nicht-regulär ist. Reguläre Sprachen müssen notwendigerweise bestimmte Eigenschaften erfüllen, und wenn eine Sprache diese Eigenschaften nicht besitzt, kann sie auch nicht-regulär sein. Stellen wir uns einen DFA Angenommen, ein Wort

mit

Zuständen und akzeptierter Sprache vor. hat oder mehr Symbole: Dann muss beim

Abarbeiten des Worts mindestens ein Zustand von mehrfach besucht werden (so genanntes Schubfachprinzip bzw. im Englischen auch pigeonhole principle: Wenn Tauben Löcher anfliegen, wobei , dann gibt es mindestens ein Loch, dass von mehreren Tauben besucht wird). Das Wort

zerfällt also in einen ersten Bestandteil

einen mittleren Bestandteil

mit

mit

,

und einen End-Bestandteil

. Im Übergangsgraphen von

mit

sieht das ungefähr so aus:

Insgesamt gilt nach Abb. 1.5 also , wobei für einen Kreis durch den Übergangsgraphen sorgt, der bei beginnt und endet. Dabei ist klar, dass der KreisBestandteil auch weggelassen werden kann, ohne dass wir aus herausfallen: Das Restwort führt immer noch von nach , also ist .

Abbildung 1.5: Verarbeitung eines langen Worts im DFA

Mehr noch: Der Kreis kann auch mehrfach durchlaufen oder auch gepumpt werden, ohne dass das Wort aus herausfällt. Beide Eigenschaften lassen sich in der Form

zusammenfassen. Diese Überlegung bildet den Kern des Beweises für das so genannte Pumping Lemma (mit Lemma bezeichnet man in der Mathematik eine wichtige Hilfsaussage):

Pumping Lemma sei eine reguläre Sprache. Dann gibt es eine Zahl , sodass sich jedes Wort in der Form schreiben lässt, wobei für die Bestandteile gilt: 1. 2. 3.

mit

Die zweite und dritte Bedingung ergeben sich direkt aus unseren obigen Überlegungen. Die erste Bedingung ergibt sich aus der Tatsache, dass wir bei Eingabe von Zeichen in den Automaten genau mal einen Zustand besuchen. Da der Automat nur Zustände besitzt, muss also ein Zustand mehrfach besucht werden, und das bedeutet, dass der Schleifenbestandteil und sein Vorgängerbestandteil beide innerhalb der ersten Zeichen liegen müssen. Jedes hinreichend lange Wort in muss also einen Bestandteil enthalten, der sich beliebig oft wiederholen (»aufpumpen«) lässt, ohne dass man die Sprache verlässt. Das Pumping Lemma bildet somit ein notwendiges Kriterium dafür, dass eine formale Sprache regulär ist. Betrachten wir z.B. die Sprache über dem Alphabet . Wir wissen bereits, dass diese Sprache regulär ist, und tatsächlich erfüllt sie die Bedingungen des Pumping Lemma: Alle Wörter mit besitzen einen pumpbaren Bestandteil , nämlich das erste Symbol von . Dieses kann weggelassen oder beliebig wiederholt werden, ohne dass sich an der Zugehörigkeit zu etwas ändert (als nehmen wir einfach das leere Wort, somit ist , und ist der Rest des Worts nach dem ersten Symbol). Wie steht es mit endlichen Sprachen? Wir wissen, dass alle endlichen Sprachen regulär sind, aber eine endliche Aufzählung von Wörtern enthält doch sicher keine pumpbaren Bestandteile? Nein, das nicht, aber im Pumping Lemma ist auch nur von Wörtern die Rede, die eine gewisse Mindestlänge überschreiten (und diese Mindestlänge dürfen wir selbst festlegen). Wählen wir also größer als die größte vorkommende Wortlänge in , dann gibt es gar keine Wörter mit , so dass sich die Prüfung der drei Bedingungen im Pumping Lemma erübrigt. Nur unendliche reguläre Sprachen müssen also pumpbare Bestandteile enthalten. Das Pumping Lemma wird in erster Linie dazu genutzt, um zu zeigen, dass eine Sprache nicht regulär ist: Wie wir gesehen haben, muß eine reguläre Sprache das Pumping Lemma erfüllen. Enthält also eine Sprache keine pumpbaren Bestandteile, kann sie auch nichtregulär sein. Dieses Beweisverfahren wird in der formalen Logik Kontraposition genannt: Das Pumping Lemma stellt eine Aussage der Form dar. Dazu ist die Aussage logisch äquivalent (siehe auch Kapitel 12). Da das Pumping Lemma praktisch ausschließlich in dieser Form angewendet wird, formulieren wir die Kontraposition des Pumping Lemma noch einmal explizit:

Kontraposition des Pumping Lemma

sei eine formale Sprache. Gibt es keine Zahl , so dass sich jedes Wort der Form schreiben lässt, wobei für die Bestandteile gilt:

mit

in

1. 2. 3. so ist

nicht regulär.

Benutzen wir also das Pumping Lemma in der Kontrapositionsform, um zu zeigen, dass eine Sprache nicht-regulär ist. Konkret gehen wir dabei von einer Mindestlänge aus. Gelingt es uns dann, zu jedem auch nur ein Wort mit zu finden, für das die drei Eigenschaften aus dem Pumping Lemma nicht erfüllt sind, kann nicht-regulär sein. Für diese Sprache haben wir uns bereits weiter oben überlegt, dass sie nicht-regulär sein kann. Mit dem Pumping Lemma können wir nun einen formalen Beweis dafür angeben, indem wir annehmen, es gäbe eine Zahl , so dass jedes Wort mit die drei Bedingungen aus dem Pumping Lemma erfüllt. Betrachten wir speziell das Wort . Offenbar ist und , so dass sich nach dem Pumping Lemma zerlegen lassen muss:

Da die ersten Symbole von lauter 's sind, bestehen auch die Teilwörter und aus lauter 's. Wir können also schreiben: und , wobei . Nach der dritten Bedingung des Pumping Lemma muß aber z.B. auch das Wort sein. enthält 's und 's, da sich durch das Verdoppeln von an der Anzahl der 's nichts geändert hat. Also ist . Widerspruch! Es gibt also keine Zahl nicht-regulär.

mit den gewünschten Eigenschaften, und

ist damit

Wir betrachten also lange Listen von Einsen und würden gerne mit einem DFA prüfen, ob die Länge der Liste eine Quadratzahl darstellt. Leider zeigt uns das

Pumping Lemma, dass es einen solchen DFA nicht geben kann. Wir gehen wieder davon aus, dass die Sprache regulär ist und dass die drei Bedingungen des Pumping Lemma für eine bestimmte Zahl gelten. Betrachten wir speziell das Wort , dann ist und nach dem Pumping Lemma muß gelten: mit und für . Insbesondere ist also auch . Wegen gilt jetzt:

Und wegen

gilt:

Wir haben also die Länge von

Aber weil

zwischen zwei Zahlen einschränken können:

, gilt

Deshalb kann selbst keine Quadratzahl sein und das Wort nicht in . Widerspruch!

liegt

Minimalautomaten Hat man eine reguläre Sprache , so ist der akzeptierende DFA keineswegs eindeutig. Es lassen sich immer verschiedene Automaten konstruieren, die die gleiche Sprache akzeptieren. Alle diese Automaten nennen wir äquivalent. Unter allen äquivalenten Automaten ist natürlich derjenige am interessantesten, der beim Erkennen von mit den wenigsten Zuständen auskommt: Er arbeitet in gewisser Weise am effizientesten von allen äquivalenten Automaten (während alle äquivalenten Automaten effektiv sind in dem Sinn, dass sie alle akzeptieren). sei formale Sprache über dem Alphabet und ein DFA, der akzeptiert. Dann heißt Minimalautomat für , wenn es keinen zu äquivalenten DFA gibt, der weniger Zustände hat als . Betrachten wir den folgenden DFA

über dem Alphabet

:

Welche Sprache akzeptiert er? Der Endzustand kann nur über eine 1 erreicht werden. Akzeptierte Wörter müssen also auf 1 enden. Auf der anderen Seite werden aber auch alle Wörter, die auf 1 enden, akzeptiert:

Damit ist klar, dass

.

Woher aber wußten wir, dass niemals sein kann? Weil von nur Pfeile ausgehen, aber keine Pfeile in enden, kann niemals angenommen werden. Man nennt solche Zustände nicht erreichbar. Offenbar ändert es nichts an der akzeptierten Sprache, wenn man nicht erreichbare Zustände einfach weglässt. Wir erhalten einen kleineren, zu äquivalenten Automaten:

Ist das nun der Minimalautomat für unsere Sprache ? Nein, natürlich geht es noch etwas kleiner:

Hier wurden die Zustände und zu einem einzigen Zustand zusammengelegt. Man kann dies immer dann tun, wenn zwei Zustände in einem gewissen Sinne äquivalent sind, den wir gleich exakt definieren werden.

sei ein DFA.

Ein Zustand

mit der Eigenschaft

heißt

nicht erreichbar. Nun sei ein erreichbarer Zustand. Mit bezeichnen wir die Sprache, die akzeptieren würde, wenn anstelle von der Startzustand wäre. Wir definieren eine Äquivalenzrelation auf der Zustandsmenge via

Im Beispiel oben ist . Wie genau funktioniert nun das Zusammenlegen äquivalenter Zustände? Wie üblich bezeichnen wir mit die Menge der zu äquivalenten Zustände, also die Äquivalenzklasse von . Die äquivalenten Zustände in werden zu einem neuen Zustand zusammengelegt. Ziel ist es, alle Zustände in durch den neuen Zustand zu ersetzen, ohne dass sich etwas an der von akzeptierten Sprache ändert. Dazu müssen wir insbesondere für den neuen Zustand die Funktionswerte definieren. Da aus mehreren Zuständen bestehen kann, schauen wir uns dazu im Übergangsdiagramm von an, in welche Zustände die Pfeile führen, die von den äquivalenten Zuständen in ausgehen. Um keine Informationen zu verlieren, vereinigen wir vorläufig alle diese von aus erreichten Zustände in einer Menge:

Im Beispiel oben gilt

Die so erhaltenen Mengen von Zuständen identifizieren wir mit den Äquivalenzklassen ihrer Elemente. Aber was passiert, wenn bei der Vereinigung Mengen aus mehr als einem Zustand entstehen? Zum Glück sorgt dann die Äquivalenz der Zustände in dafür, dass auch die Zustände zueinander äquivalent sind. Es gilt nämlich die folgende Hilfsaussage:

Sind und

Weil

und

Ist nun

Also sind

und

äquivalente Zustände, so sind auch für alle

äquivalent.

äquivalent sind, gilt für jedes

für ein Symbol

und

:

, folgt daraus

äquivalent.

Folglich sind auch alle zueinander äquivalent: Egal welches man auswählt, man erhält am Ende immer die gleiche Äquivalenzklasse. Bestimmt man also für alle Zustände ihre Äquivalenzklassen und definiert dadurch neue Zustände , so erhalten wir wieder eine wohldefinierte Übergangsfunktion durch

Wir überlegen uns noch, dass der Automat mit den neuen Zuständen die gleiche Sprache wie akzeptiert. Dazu brauchen wir zunächst eine Menge von Endzuständen: Wir setzen

und betrachten ein beliebiges Wort

. Dann gilt:

was bedeutet, dass eine Folge von Zuständen existiert mit

All dies spielt sich im ursprünglichen Automaten ab. Können wir diese Folge irgendwie auf die neuen Zustände übertragen? Wegen und ist auf jeden Fall . Da es auf den Repräsentanten der Äquivalenzklasse nicht ankommt, dürfen wir schließen:

und die gleiche Schlussweise funktioniert natürlich auch für die anderen Zustandsübergänge der Folge. Am Ende steht der Übergang

wird also auch von dem neuen Automaten akzeptiert. Die beiden Reduktionsschritte »Weglassen nicht erreichbarer Zustände« und »Zusammenlegen äquivalenter Zustände« reichen aus, um aus jedem Automaten den Minimalautomaten zu destillieren:

Konstruktion des Minimalautomaten sei ein DFA und

die von ihm akzeptierte Sprache.

Der Automat , der aus durch Weglassen nicht erreichbarer Zustände und Zusammenlegen äquivalenter Zustände entsteht, ist der Minimalautomat für .

Betrachten wir zur Gewöhnung an die obigen Begriffe den folgenden, etwas größeren DFA:

Er enthält keine nicht erreichbaren Zustände, aber und scheinen sich in ihrem Verhalten sehr ähnlich zu sein. Tatsächlich sind sie äquivalent, wie man sofort

erkennt, wenn man bzw. zum Startzustand erklärt. Dann werden nämlich plötzlich ganze drei Zustände nicht erreichbar. Entfernt man sie, erhält man die folgenden beiden Automaten:

Aus diesen beiden Automaten lesen wir ab, dass

Außerdem zeigen uns die beiden Automaten, dass auch noch sind. Die entsprechende Sprache ist etwas komplizierter:

Wir legen die äquivalenten Zustände Dann gilt zum Beispiel:

zu

Insgesamt ergibt sich dieser Minimalautomat:

und

und

zu

äquivalent

zusammen.

Die akzeptierte Sprache lässt sich von diesem Automaten deutlich einfacher ablesen. Sie lautet:

Zum Finden äquivalenter Zustände sind wir nicht auf genaues Hinsehen angewiesen. Man kann auch einen Algorithmus angeben, der äquivalente Zustände findet. Der Algorithmus basiert auf zwei Beobachtungen: Zwei Zustände leere Wort enthält,

und können nicht äquivalent sein, da aber nicht.

Sind zwei Zustände äquivalent, dann können auch

und für ein Symbol und nicht äquivalent sein.

das nicht

Die zweite Beobachtung ist die Kontraposition der folgenden, leichter einzusehenden Aussage, die wir oben bereits bei der Konstruktion des Minimalautomaten genutzt haben: Sind alle

und äquivalente Zustände, so sind auch äquivalent.

und

für

Die zweite Beobachtung lässt sich weiter verallgemeinern zu Sind zwei Zustände äquivalent, dann können auch

und für ein Wort und nicht äquivalent sein.

Damit kann man für alle Zustandspaare

(bei

nicht

Zuständen sind das genau

Stück) bestimmen, ob sie äquivalent sind, indem man mit der ersten Beobachtung startet und von den damit gefundenen, nicht äquivalenten Zustandsparen ausgehend, mit Hilfe der zweiten Beobachtung weitere, nicht äquivalente Zustandspaare bestimmt. Anstatt den Algorithmus zu formalisieren und zu beweisen, dass man auf diese Weise tatsächlich alle Zustandspaare erwischt, schauen wir uns lieber einen Beispielautomaten an:

Nicht äquivalent sind auf jeden Fall die Zustandspaare , , und , da diese jeweils einen Endzustand und einen NichtEndzustand enthalten. Als Nächstes betrachten wir die Pfeile, mit denen der Endzustand erreicht werden kann: Es ist

Wegen der zweiten Beobachtung

liefert uns jeder Nicht-Endzustand , der über eine 0 erreicht werden kann, einen weiteren Zustand , der nicht äquivalent zu ist. Analog liefert uns jeder Nicht-Endzustand , der über eine 1 erreicht werden kann, einen Zustand , der nicht äquivalent zu sein kann:

Damit haben wir bereits 12 von 15 möglichen Zustandspaaren als nicht äquivalent

,

erkannt. Es bleiben noch die Paare

,

und

.

Weil und gilt, wobei und nicht äquivalent sind, können auch und nicht äquivalent sein. Ebenso sind wegen und die Zustände und nicht äquivalent. Es bleibt als einziges äquivalentes Zustandspaar das Paar . Der dazugehörige Minimalautomat hat dieses Aussehen:

Der Satz von Myhill und Nerode Leider ist das Pumping Lemma kein hinreichendes Kriterium für die Regularität einer Sprache, d. h., auch wenn eine Sprache die Bedingungen des Pumping Lemma erfüllt, kann es manchmal sein, dass nicht-regulär ist. Wir werden uns weiter unten ein Beispiel für eine solche Sprache anschauen. Zunächst möchte ich Ihnen aber ein notwendiges und hinreichendes Kriterium für Regularität vorstellen. Wir haben etwas weiter oben eine Äquivalenzrelation für die Zustände eines DFAs eingeführt: Zwei Zustände und sind äquivalent, falls die gleiche Sprache akzeptiert, egal ob man oder zum Startzustand erklärt. Die Relation lässt sich auf Wörter übertragen: Sind nämlich und zwei Wörter, die in äquivalente Zustände überführen und hängt man dann einen weiteren Bestandteil an bzw. an, so sind beide Ergebnisse und

akzeptierte Wörter nicht in .

. Ist

, so sind

und

auch beide

Wir identifizieren deshalb die Wörter und mit den über sie erreichten Zuständen und und erklären zwei Wörter für äquivalent bezogen auf eine Sprache , wenn sie sich gleich verhalten, und zwar bezogen auf das Anhängen anderer Wörter und Mitgliedschaft des Ergebnisses in . Äquivalente Wörter werden in Teilmengen von , den Äquivalenzklassen von , zusammengefasst, und die Anzahl der Äquivalenzklassen heißt Index von .

sei formale Sprache über dem Alphabet und

.

Durch

wird eine Äquivalenzrelation in heißt Index von .

definiert. Die Anzahl der Äquivalenzklassen von

Mit diesem Begriff gilt jetzt:

Satz von Myhill und Nerode Eine Sprache

ist genau dann regulär, wenn ihr Index endlich ist.

Wir werden den Satz von Myhill und Nerode weiter unten beweisen und im Zuge dessen die Bedeutung des Index einer Sprache genau verstehen. Zunächst sollen aber einige Beispiele die Leistungsfähigkeit des Satzes verdeutlichen.

.

.

Wir wissen bereits, dass diese Sprache regulär ist, da wir weiter oben den dazu passenden DFA untersucht haben. Wir gehen nun den Weg über den Satz von Myhill / Nerode und berechnen den Index der Sprache. Nach dem Satz von Myhill und Nerode sollte er endlich sein. Wir beginnen mit dem leeren Wort und fragen uns, welche Wörter zu äquivalent sind, d.h. welche Wörter sich in Bezug auf das Anhängen weiterer Wortteile und die Mitgliedschaft in gleich wie verhalten. Das Verhalten von ist schnell geklärt: . So verhalten sich genau die Wörter Somit lautet die Äquivalenzklasse von :

, die auf 1 enden.

Betrachten wir nun die Äquivalenzklasse des Worts 0: So verhalten sich außer der 0 genau die Wörter , die auf 10 enden. Somit lautet die Äquivalenzklasse von 0:

Als Letztes betrachten wir das Verhalten des Worts 00: So verhalten sich genau die Wörter die auf 00 enden. Somit lautet die Äquivalenzklasse von 00:

,

Damit sind alle Äquivalenzklassen bestimmt und der Index von ist 3. Wie können wir uns sicher sein, dass uns nicht doch noch eine Äquivalenzklasse fehlt? Die Äquivalenzklassen einer Äquivalenzrelation über einer Menge bilden eine Partition von , was unter anderem heißt, dass sich jedes Element von in einer der Äquivalenzklassen wiederfindet. Hier ist , und wir müssen prüfen, ob sich jeder binäre String in einen der drei Äquivalenzklassen einordnet. Das ist aber offenbar der Fall, da jeder binäre String entweder mit 1, 10 oder 00 endet. In dieser Sprache finden sich alle Strings, in denen die Anzahl der 's gleich der Anzahl der 's ist. Wir haben es also mit einer Obermenge der Sprache zu tun, von der wir bereits wissen, dass sie nicht-regulär ist. Wir bestimmen wieder die Äquivalenzklassen on , beginnend beim leeren Wort: . So verhalten sich genau die Wörter sind. Somit lautet die Äquivalenzklasse von :

die ein

mehr als

, die schon in

. So verhalten sich genau die Wörter 's enthalten. Somit lautet die Äquivalenzklasse von

Wir können in diesem Stil fortfahren und für jedes Äquivalenzklasse definieren:

eine eigene

, :

Das sind zwar noch längst nicht alle Äquivalenzklassen, aber wir haben genug gesehen, um folgern zu können, dass es eine unendliche Zahl von Äquivalenzklassen gibt, der Index von also unendlich ist. Wir betrachten nun ein Beispiel für eine nicht-reguläre Sprache über , die die Bedingungen des Pumping Lemma erfüllt. Sie lautet

Die Wörter dieser Sprache können also eine von zwei Gestalten annehmen: Sie können mit einer beliebig langen Folge von 's beginnen, auf die eine gleiche Anzahl von und folgen muss. Falls keine 's am Anfang des Worts stehen, besteht das Wort aus Folgen von und , die unterschiedlich lang sein dürfen. In diesem Teil der Sprache ist auch das leere Wort enthalten. Mit Hilfe des Satzes von Myhill-Nerode zeigen wir zunächst, dass nicht-regulär ist. Dazu betrachten wir Wörter der Form für . Wörter , die mit beginnen, müssen am Ende gleich lange - und -Strings enthalten: . Genau so verhalten sich die Wörter

der Form

:

Da wir für jedes eine unterschiedliche Äquivalenzklasse erhalten, ist der Index von unendlich. Tatsächlich kann man von dieser Sprache zeigen, dass sie, obwohl nicht-regulär, die Bedingungen des Pumping Lemma erfüllt. Dazu wählen wir . Wir betrachten also alle mit , mit anderen Worten: Alle Wörter mit Ausnahme des leeren Worts. Alle diese müssen sich in der Form zerlegen lassen mit . Die ersten beiden Bedingungen erzwingen . Dann ist , wenn wir als das erste Symbol von wählen. Wir können demnach drei Fälle unterscheiden:

Dann hat die Form mit . Offenbar lässt sich das führende , also der Schleifenbestandteil , beliebig aufpumpen oder man kann es weglassen, ohne dass das Wort aus herausfällt.

In diesem Fall sind wir im zweiten Teil der Sprache:

mit

. Da die Anzahl der 's und 's nicht übereinstimmen muss, lässt sich auch in diesem Fall das führende Symbol beliebig oft wiederholen, oder man kann es weglassen.

Auch hier sind wir im zweiten Sprachenteil. Da und mit beginnt, kann nur die Form haben. Offenbar lässt sich das führende beliebig aufpumpen, oder man kann es weglassen. Dieses zugegebenermaßen etwas konstruierte Beispiel zeigt, dass es nicht-reguläre Sprachen geben kann, die trotzdem das Pumping Lemma erfüllen können. Die NichtRegularität rührt wie eh und je daher, dass ein DFA nicht prüfen kann, ob ein Eingabewort gleich viele und enthält. Trotzdem erfüllt die Sprache das Pumping Lemma, da beide Sprachteile zu Beginn einen pumpbaren Bestandteil aufweisen. Nun zum Beweis des Satzes von Myhill-Nerode. Zur Erinnerung: Dieser Satz besagt, dass eine Sprache genau dann regulär ist, wenn ihr Index, also die Zahl der Äquivalenzklassen der Relation endlich ist. Wir können sogar noch genauer werden:

Index und Minimalautomat einer Sprache Ist

eine reguläre Sprache, so gibt ihr Index die Anzahl der Zustände des Minimalautomaten für

an.

Der Beweis läuft folgendermaßen ab: Zunächst konstruieren wir aus den Äquivalenzklassen von einen DFA , der akzeptiert und der genau so viele Zustände wie Äquivalenzklassen besitzt. Dann zeigen wir, dass Minimalautomat zu ist. Sei

also irgendeine Sprache. Ist ihr Index endlich, so können wir einen DFA definieren, indem wir jeder Äquivalenzklasse einen Zustand zuordnen. Startzustand ist dabei der Zustand , Endzustände sind alle Zustände mit . Die Übergangsfunktion definieren wir über

Wir müssen noch nachprüfen, dass dadurch wohldefiniert ist, d. h., dass der Funktionswert für alle Wörter gleich ist. Betrachten wir also zwei unterschiedliche Wörter . Dann gilt, je nachdem welches Wort wir als Repräsentanten von auswählen, oder . Weil

aber und in derselben Äquivalenzklasse sind, sind sie zueinander äquivalent, und damit sind auch und äquivalent. Also ist und wohldefiniert. Was bedeutet das für die erweiterte Übergangsfunktion Dann gilt:

? Sei

.

Jetzt können wir von innen nach außen die Funktionswerte für berechnen, beginnend bei . Am Schluss erhalten wir den Zustand als Ergebnis. Damit haben wir ein wichtiges Ergebnis erhalten:

Jetzt gilt:

Unser Äquivalenzklassen-DFA akzeptiert also tatsächlich regulär, wenn ihr Index endlich ist.

, und

ist damit

Jetzt sei umgekehrt eine reguläre Sprache. Wir zeigen, dass der ÄquivalenzklassenAutomat von sogar der Minimalautomat zu ist, denn zum einen enthält er keine nicht erreichbaren Zustände (anderenfalls müsste es eine Äquivalenzklasse geben, in der kein Wort enthalten ist). Zum anderen enthält er keine äquivalenten Zustände, die man zusammenlegen könnte: Angenommen, und sind äquivalente Zustände. Das bedeutet, erklärte man bzw. zum Startzustand von , würde die gleiche Sprache akzeptieren: . Anders gesagt: Startet man bei bzw. und gibt man ein Wort in den Automaten ein, so ist das Resultat in beiden Fällen gleich: . Wegen können wir weiter folgern:

Das bedeutet, gleich:

und sind äquivalente Wörter. Also sind ihre Äquivalenzklassen und damit auch .

ist also der Minimalautomat von , wobei die Zustände von den Äquivalenzklassen von entsprechen. Der Index von ist damit endlich und entspricht der Zahl der Zustände des Minimalautomaten. Lassen Sie uns die doch recht abstrakte Konstruktion des Minimalautomaten mit Hilfe der Äquivalenzklassen von an einem Beispiel nachvollziehen. Wir betrachten die Sprache der binären Strings, die eine ungerade Anzahl von Einsen enthalten: Die Äquivalenzklassen von sind: und . Daraus können wir einen zu passenden Automaten konstruieren mit und . Die Übergangsfunktion

wird festgelegt durch die Bedingung

Der dazugehörige Übergangsgraph sieht so aus:

DFAs mit Ausgabe (Moore- und Mealy-

:

Automaten) Die DFAs, die wir bis jetzt betrachtet haben, akzeptierten entweder einen Eingabestring , oder sie akzeptierten ihn nicht. Deshalb werden diese DFAs auch als Akzeptoren bezeichnet. Wir schauen uns nun einen anderen Typ von DFA an, der zu jedem Eingabezeichen ein Ausgabezeichen liefert und so einen Eingabestring nach und nach gewissermaßen in einen Ausgabestring übersetzt. Solche Automaten nennt man Transduktoren. Transduktoren sind eine einfache Erweiterung von Akzeptoren. Der Mechanismus der Zustandswechsel aufgrund von Eingaben bleibt der gleiche. Ein wichtiger Unterschied zu den Akzeptoren besteht jedoch darin, dass Transduktoren keine ausgewiesenen Endzustände besitzen. Solange wir das richtige Eingabealphabet benutzen, ist also jede Eingabe gültig und wird vom Automaten nach einem vorgegebenen Regelwerk in eine Ausgabe übersetzt. Die Ausgabe wird durch eine Ausgabefunktion geregelt, die Zeichen aus einem Ausgabealphabet ausgibt. Hängt die Ausgabefunktion sowohl vom Eingabezeichen als auch vom Zustand des Automaten ab, gilt also , nennt man den Automaten einen Mealy-Automaten. Hängt die Ausgabefunktion dagegen nur vom Zustand des Automaten ab, gilt also , nennt man den Automaten einen Moore-Automaten. Manche Aufzüge verfügen über eine Anzeige, die das Stockwerk angibt, in dem sich der Aufzug aktuell befindet. Ein solcher Aufzug stellt ein sehr einfaches Beispiel für einen Moore-Automaten dar: Die Ausgabe entspricht der Nummer des aktuellen Zustands des Automaten und hängt damit nur vom aktuellen Zustand ab. Jetzt schauen wir uns Beispiele für Mealy-Automaten an und untersuchen gleichzeitig, wie sich die Ausgabefunktion im Übergangsdiagramm des Automaten widerspiegelt: Ein Flip-Flop ist ein grundlegendes Speicherelement aus der Schaltungstechnik, das ein Bit speichern kann. Es besitzt zwei stabile Zustände, die mit Set (gesetzt) und Reset (zurückgesetzt) bezeichnet werden. Legt man eine Eingangsspannung an das Element an, wechselt es den Zustand. Modelliert man das Anlegen von Spannung mit dem Eingabesymbol 1 und keine Spannung mit 0, so ergibt sich daraus die folgende Übergangsfunktion über dem Alphabet : 0

1

wobei den Reset-Zustand und den Set-Zustand symbolisiert. Das Auslesen eines Bits aus dem Speicherelement erfolgt nach dem Anlegen einer Spannung bzw.

Nicht-Spannung. Es entspricht dann dem Index des neuen Zustands. Das Ausgabealphabet ist also , und die Ausgabefunktion sieht folgendermaßen aus: 0 1 0 1 1 0

Die Information über die Werte der Ausgabefunktion wird in das Übergangsdiagramm aufgenommen, indem man über jede Kante neben

noch zusätzlich das Ausgabesymbol

schreibt:

Mit einem sequenziellen Addierer kann man zwei gleich lange Binärzahlen und addieren, indem man jeweils Paare gleichwertiger Bits von und , beginnend bei den Bits mit der niedrigsten Wertigkeit, in den Automaten eingibt. Das Eingabealphabet ist somit . Bei der binären Addition gilt bekanntlich

Solange kein Übertrag auftritt, können wir im Startzustand bleiben und geben mittels jeweils das Ergebnisbit auf der rechten Seite der Gleichungen aus. Im Falle eines Übertrags wechseln wir in den Zustand . Im neuen Zustand gelten jetzt andere Additionsregeln, da wir das Übertragsbit berücksichtigen müssen:

Solange ein Übertragsbit benötigt wird, bleiben wir in . Nur im Fall der Eingabe wechseln wir wieder nach . Insgesamt ergibt sich der folgende MealyAutomat:

Abbildung 1.6: Ein sequenzieller Addierer als Mealy-Automat

Es ist klar, dass sich jeder Moore-Automat als ein spezieller Mealy-Automat auffasssen lässt. Die beiden Automaten-Modelle sind aber nicht gleichwertig: Während MooreAutomaten für die Ausgabe nur die Information über den aktuellen Zustand nutzen, verfügen Mealy-Automaten zusätzlich über die Information über das nächste Eingabezeichen, können also gewissermaßen in die Zukunft schauen. Da jeder Moore-Automat im Prinzip auch einen Mealy-Automat darstellt, ist beim Betrachten von Übergangsdiagrammen wie in den obigen drei Beispielen nicht unmittelbar klar, um welchen Automatentyp es sich handelt, es sei denn, man benutzt für Moore-Automaten eine andere Form der Darstellung für die Ausgabe: Betrachten wir als Beispiel für einen Moore-Automaten einen Aufzug mit Stockwerksanzeige. Wir nehmen an, es gibt ein Erdgeschoss und zwei Obergeschosse. Dann ist , und die Output-Werte der Ausgabefunktion lauten . Genauso gut könnte man aber auch in dieser Form angeben: 1

2

1

1

1

2

2

2

Hier scheint es, als würde folgende Übergangsgraph:

gelten. Aus der Tabelle ergibt sich der

Wieder hat man auf den ersten Blick den Eindruck, es handle sich um einen MooreAutomaten. Besser ist es, man bindet im Falle eines Mealy-Automaten die Ausgabe direkt an die Zustandsknoten:

Leider sind die Definition und die Darstellungsform für Moore- und Mealy-Automaten in der Literatur nicht ganz eindeutig. Sie sollten also immer ganz genau hinschauen, wie die Ausgabefunktion arbeitet.

Aufgaben zu DFAs Als kleine Hilfe, so zur Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wiley-vch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. 1. Genau betrachtet, bildet der Wolf-Ziege-Kohlkopf-Automat, so wie wir ihn im Beispiel gezeichnet haben, keinen DFA. Erklären Sie, warum nicht. 2. Ein Getränkeautomat akzeptiert 1-Euro- und 50-Cent-Münzen. Ein Getränk soll 1,50 Euro kosten. Modellieren Sie den Getränkeautomaten als DFA. 3. Welche Sprachen akzeptieren die folgenden DFAs über

?

a.

b.

c. 4. Geben Sie jeweils einen DFA an, der die folgenden Sprachen über akzeptiert: a. b. c. d. 5.

sei ein Alphabet. Zeigen Sie, dass Monoid bildet.

6. Übergangsfunktion

mit der Operation Konkatenation ein

sei ein DFA. Zeigen Sie, dass für die erweiterte gilt:

7. Zeigen Sie: Wenn ein DFA mit Zuständen ein Wort enthält unendlich viele Wörter.

mit

8. Zeigen Sie mit Hilfe des Pumping Lemma, dass die Sprache

akzeptiert, dann

über dem Alphabet

nicht-regulär ist.

9. Zeigen Sie mit Hilfe des Satzes von Myhill-Nerode, dass die Sprache

über dem Alphabet .

regulär ist, und geben Sie einen DFA

an mit

10. Finden Sie den Minimalautomaten zu diesem DFA :

11. Finden Sie einen DFA über

, der die Sprache

akzeptiert.

Hinweis 1 Die Elemente abzählbar unendlicher Mengen lassen sich nummerieren, d. h., eine abzählbar unendliche Menge ist so groß wie die Menge der natürlichen Zahlen.

Kapitel 2

Nichtdeterministische Endliche Automaten (NFAs) IN DIESEM KAPITEL lernen Sie eine Erweiterung der DFAs kennen, die sogenannten nichtdeterministischen endlichen Automaten (NFAs) erfahren Sie was der Satz von Rabin Scott besagt begegnen Sie regulären Ausdrücken und stochastischen Automaten

Bisher lag der Nachfolgezustand des Automaten bei Kenntnis des aktuellen Zustands und des Eingabesymbols eindeutig fest. Bei einem NFA erlauben wir bei gleichem Ausgangszustand und Eingabesymbol mehrere, einen oder keinen Nachfolgezustand. Der Automat kann sich gewissermaßen zwischen mehreren Zuständen frei entscheiden, und diese Entscheidung ist nicht vorherbestimmt (nichtdeterministisch). Solche Automaten werden benötigt, wenn man das Verhalten eines Systems im Voraus nicht genau kennt oder man mehrere unterschiedliche Implementationen erlauben will. Die Konstruktion eines Automaten, der eine bestimmte Sprache akzeptieren soll, kann sich dadurch stark vereinfachen. Allerdings lassen sich mit NFAs prinzipiell keine anderen Sprachen erkennen als mit DFAs.

Nichtdeterminismus »There is, however, one feature that I would like to suggest should be incorporated in the machines, and that is a ‘random element.’« (Es gibt aber eine Sache, von der ich vorschlagen würde, sie in die Maschinen einzubauen, und das ist ein ‘Zufallselement.’) Alan Turing, in »Can Digital Computers Think?«, BBC Third Programme Radio Broadcast, 15. Mai 1951, zitiert nach: S. Barry Cooper und J. von Leeuwen (Hrsg.): Alan Turing: His Work and Impact, Elsevier-Verlag 2013 Das Zufallselement, von dem Alan Turing hier spricht, ist genau die Zutat, um die wir unsere DFAs in diesem Kapitel erweitern werden. Nach heutiger Lesart spricht man auch von »Nichtdeterminismus«. Das Wort Nichtdeterminismus bedeutet Nichtvorhersagbarkeit. Die Objekte, mit denen wir tagtäglich umgehen, gehorchen

deterministischen physikalischen Gesetzen: Kennt man die Ausgangsdaten hinreichend genau, lässt sich das weitere Schicksal eines Objekts (z.B. die Flugbahn eines Balls) vorhersagen. Selbst das Ergebnis eines Münzwurfs lässt sich im Prinzip vorhersagen, wenn man nur genügend Daten über die Ausgangssituation besitzt. Nichtdeterminismus hingegen kommt in der Realität so gut wie nicht vor, mit Ausnahme der mikroskopischen Welt der Elementarteilchen, in der die Gesetze der Quantenphysik herrschen. Aber Automaten, die sich ihren Nachfolgezustand in nicht vorhersagbarer Weise frei aussuchen können, gibt es in der wirklichen Welt nicht (auch wenn uns das manchmal so vorkommen mag). Warum also soll man sich mit solchen Automaten beschäftigen? Weil das Konzept des Nichtdeterminismus eine nützliche Abstraktion darstellt, um deterministische, aber dennoch komplizierte Prozesse auf einfachere Weise modellieren zu können. Oft führen eben viele Wege zum Ziel. Anstatt diese Vielfalt durch viele verschiedene Zustände abzubilden, ist es meist einfacher, sich einen nichtdeterministischen Automaten vorzustellen, der die Wahl zwischen verschiedenen Zustandsübergängen hat. Wie wir später noch sehen werden, eignet sich Nichtdeterminismus auch dazu, unsere Unkenntnis über einen deterministischen Prozess abzubilden. Die ganze Kraft dieser Idee wird erst in den Kapiteln über formale Sprachen und über Komplexitätstheorie deutlich werden. In diesem Kapitel werden wir uns damit begnügen, uns davon zu überzeugen, dass der Nichtdeterminismus endliche Automaten zwar vereinfachen kann, aber ihre Fähigkeiten nicht grundsätzlich erweitert.

Definition eines NFA Genauso wie DFAs können auch NFAs mit Hilfe eines Übergangsgraphen visualisiert werden. Betrachten wir den Automaten in Abbildung 2.1 mit fünf Zuständen und dem Eingabealphabet , um uns an die Idee des Nichtdeterminismus in einem Automaten zu gewöhnen:

Abbildung 2.1: Übergangsdiagramm eines NFA

Wie auch bei einem DFA besitzt dieser Automat einen Start- und Endzustände. Aber bei genauerem Hinsehen stellt man doch Unterschiede fest: Startet man in und gibt dann ein Eingabesymbol ein, so ist der Nachfolgezustand nicht eindeutig definiert: Bei Eingabe von 0 kann der Automat entweder in bleiben oder nach wechseln, und etwas Ähnliches passiert bei Eingabe von 1. In und wiederum sind gar keine Nachfolgezustände definiert, wenn eine 1 bzw. 0 eingegeben wird. Wie lässt sich unter diesen Umständen überhaupt eine Übergangsfunktion definieren? Schließlich sollte ja ein Funktionswert, in diesem Fall ein Nachfolgezustand, immer eindeutig definiert sein. Diese Schwierigkeit lässt sich umgehen, indem man keine einzelnen Zustände, sondern Mengen von Zuständen, genauer gesagt Teilmengen der Zustandsmenge , als Funktionswerte definiert. So können wir auch das Problem der fehlenden Nachfolgezustände lösen: In diesem Fall ist die leere Menge der Funktionswert. Tabellarisch geschrieben, sieht die Übergangsfunktion

für diesen Automaten dann

so aus: 0

1

Was passiert, wenn man ein ganzes Wort in den Automaten eingibt? Wir müssen dann darauf gefaßt sein, dass wir aufgrund der Mehrdeutigkeit der Nachfolgezustände mehrere Pfade verfolgen müssen. Statt eines eindeutigen Pfads durch den Automaten entsteht ein Baum mit als Wurzelknoten. Als Beispiel zeigt Abbildung 2.2 den Baum, der sich für das Eingabewort ergibt.

Abbildung 2.2: Mögliche Verarbeitungswege für

durch den NFA aus Abb. 2.1

Am Ende landen des Berechnungsvorgangs landen wir hier in einem der drei Zustände oder . Beachten Sie, dass zumindest einer der drei Zustände ein Endzustand ist. Wenn der Automat also jedes Mal die »richtige« Entscheidung trifft, besteht also die Chance, dass wir am Ende in einem Endzustand landen. In einem informellen Sinn bedeutet dies, dass das Wort vom Automat akzeptiert wird. Nach diesen Vorüberlegungen sind wir bereit für die formale Definition eines NFAs: Ein nichtdeterministischer endlicher Automat (NFA) ist ein 5-Tupel , bestehend aus:

einer endlichen Zustandsmenge einem Eingabealphabet

, die die Zustände enthält.

, wobei

.

einer Übergangsfunktion einem Startzustand

. .

einer Menge von Endzuständen

.

Der einzige Unterschied zur Definition eines DFAs besteht in der Übergangsfunktion , die jetzt nach , d. h., die Potenzmenge von abbildet, in der die Teilmengen von zusammengefaßt sind. Das war notwendig, da ja die Bilder der Übergangsfunktion jetzt aus Teilmengen von und nicht mehr aus einzelnen Zuständen bestehen.

Der Satz von Rabin-Scott Die Eingabe ganzer Wörter in einen NFA erfolgt wie beim DFA über eine erweiterte Übergangsfunktion . Wenn nötig, kann auch diese Funktion rekursiv mittels definiert werden:

Wir starten hier also in irgendeinem Zustand und verarbeiten ein Eingabewort . Dann bringt uns der erste Wortteil in eine Teilmenge . Für alle Zustände in dieser Teilmenge bilden wir die Mengen . Die Vereinigung dieser Teilmengen liefert schließlich . Machen Sie sich klar, dass diese Definition mit der Konstruktion des Baums in unserem Beispiel oben übereinstimmt und somit gilt! Wir vereinbaren jetzt, dass der NFA ein Wort akzeptiert, falls zumindest einer der möglichen Zustände nach Eingabe von ein Endzustand ist, falls also gilt. Analog zum DFA ist die von einem NFA akzeptierte Sprache

Beispielsweise gilt für unseren den NFA

aus Abbildung 2.1

Betrachten wir als Beispiele zwei weitere NFAs und die von ihnen akzeptierten Sprachen:



Dieser NFA akzeptiert offenbar keine Wörter mit weniger als zwei Symbolen. Von den Wörtern mit zwei oder mehr Symbolen akzeptiert er alle Wörter mit einer 0 als vorletztem Symbol: Diese Wörter haben die Form , wobei mit beliebig beginnt und mit als letztem Bit endet. Dann gilt:

Auf der anderen Seite muß aber auch die 0 das vorletzte Symbol sein, da sonst gilt:

Damit haben wir bewiesen:

Dieser NFA

arbeitet über dem Alphabet

:

Welche Wörter werden von akzeptiert? Um vom Startzustand in den Endzustand zu gelangen, benötigt man zunächst einen beliebig langen -String, solange

zumindest ein vorhanden ist, um von nach zu gelangen. Das Gleiche gilt analog für die weiteren Übergänge von nach , von nach und von nach . Insgesamt finden wir

Sie können sich sicher vorstellen, dass es für die Sprachen, die von unseren bisherigen NFA-Beispielen erkannt werden, auch einen DFA gibt, der sie akzeptiert. Für die beiden NFAs aus den letzten Beispielen wären das die Automaten aus Abb. 2.3 und 2.4:

Abbildung 2.3: Ein zu

äquivalenter DFA

Abbildung 2.4: Ein zu

äquivalenter DFA

Für den DFA in 2.3 brauchten wir zwei Endzustände statt einem für den NFA. Und erinnern Sie sich noch an den mit gekennzeichneten »Fehlerzustand«, den wir bei DFAs wie in 2.4 für unerwünschte Wortbestandteile brauchen? Bei einem NFA können wir einfach die entsprechenden Zustandsübergänge weglassen, was sehr zur Übersichtlichkeit des Automaten beiträgt. Trotzdem lassen sich mit einem NFA keine »neuen« Sprachen erkennen, da der Nichtdeterminismus das Grundproblem der DFAs, die mangelnde Speichermöglichkeit, nicht lösen kann. Diese Aussage beweisen wir jetzt. Im Beweis werden wir eine Methode kennenlernen, mit der sich zu jedem NFA ein äquivalenter DFA, also ein DFA, der die gleiche Sprache akzeptiert, konstruieren lässt.

Satz von Rabin-Scott Zu jedem NFA

existiert ein äquivalenter DFA

.

Wir gehen von einem NFA aus und konstruieren einen DFA , der exakt die gleiche Sprache akzeptiert wie . Die Grundidee der Konstruktion ist sehr einfach: Da beim NFA die Übergangsfunktion in die Potenzmenge der Zustandsmenge abbildet, identifizieren wir die Zustände von mit den Teilmengen von , d. h., zu jeder Teilmenge von gehört ein Zustand von , und insgesamt gilt .

Als Startzustand definieren wir , und Endzustände sind alle Teilmengen von , in der Zustände aus der ursprünglichen Menge der Endzustände von enthalten sind: . Es fehlt uns also nur noch die Definition der Übergangsfunktion von : Zu jedem Zustand und jedem Eingabesymbol müssen wir einen Nachfolgezustand definieren. Damit am Ende die gleiche Sprache akzeptiert wird, müssen wir das Verhalten von im NFA nachbilden. Da eine Teilmenge ist, die aus mehreren Zuständen bestehen kann, müssen wir für alle diese Zustände die Teilmengen bestimmen und am Ende vereinigen, um keine Information zu verlieren. In Zeichen:

Da das Ergebnis der Vereinigung wieder eine Teilmenge ist, gilt wie gewünscht . Die Konstruktion von ist damit komplett. Wir müssen uns aber noch davon überzeugen, dass tatsächlich die gleiche Sprache akzeptiert wie . Dazu starten wir mit irgendeinem Wort . Wird von akzeptiert, heißt das, dass eine Folge von Teilmengen existiert mit der folgenden Eigenschaft:

Diese Folge von Teilmengen entsteht, wenn die Symbole nacheinander in den NFA eingegeben werden. Am Ende steht eine Menge von Zuständen, in der mindestens ein Endzustand enthalten ist. Aber jede Teilmenge entspricht auch irgendeinem Zustand von . Wir können also die obige Folge von Teilmengen übersetzen in eine Folge von Zuständen mit:

Wird also von akzeptiert, so wird Der Beweis ist komplett!

auch von

akzeptiert und umgekehrt.

Die Tatsache, dass NFAs und DFAs äquivalent sind, bedeutet, dass alles, was wir über DFAs und reguläre Sprachen wissen, auch für NFAs und die von ihnen akzeptierten Sprachen gilt. Außerdem können wir in Zukunft immer dann, wenn wir einen DFA mit einer bestimmten Eigenschaft brauchen, uns darauf beschränken, einen NFA mit der gewünschten Eigenschaft zu konstruieren - wie wir gesehen haben, geht dies oft einfacher und übersichtlicher. Zum Abschluss sollten wir uns noch klarmachen, dass die Konstruktionsmethode aus dem Beweis oben zwar irgendeinen äquivalenten DFA liefert, aber keinesfalls den minimalen DFA. Hierzu ein Beispiel:

Betrachten wir den folgenden einfachen NFA über dem Alphabet

Die von

mit der Zustandsmenge :

akzeptierte Sprache ist natürlich

Das Konstruktionsverfahren aus dem Beweis des Satzes von Rabin/Scott liefert uns einen DFA mit Zuständen (so viele Elemente hat ). Wir benennen die Zustände von nach den Teilmengen, für die sie stehen, z.B. steht für die Teilmenge . Die Zustandsübergänge berechnen wir nach dem Schema

, also etwa

Fährt man in dieser Weise fort, erhält man den folgenden Übergangsgraphen für :

Man erkennt sofort, dass die vier Zustände im rechten Teil des Graphen sowie nicht erreichbar sind. Läßt man sie weg und arrangiert die verbleibenden drei Zustände neu, erhält man schließlich diesen DFA als Minimalautomat für

NFAs mit

-Übergängen

:

In diesem Abschnitt erweitern wir die Auswahlmöglichkeiten des NFA durch so genannte -Übergänge. Das sind spontane Zustandsübergänge, bei denen kein Eingabezeichen verarbeitet wird. Der Automat kann sich also entscheiden, ob er ein Eingabezeichen verarbeiten will oder einen -Übergang durchführt. Wie wir sehen werden, wird durch diese Möglichkeit die Konstruktion von Automaten mit einer gewünschten Eigenschaft noch weiter vereinfacht. Allerdings erweitert auch die Möglichkeit von -Übergängen die Menge der erkennbaren Sprachen nicht. Der folgende Automat über dem Alphabet klassisches Beispiel für einen NFA mit -Übergängen:

bildet ein

Der Automat hat die Möglichkeit, zunächst eine beliebige Anzahl von ’s (auch null ist erlaubt) zu lesen, und dann beispielsweise mit zwei -Übergängen in den Endzustand zu springen. Nach den 's wäre auch eine beliebigen Zahl von 's möglich. Insgesamt ist die von ihm akzeptierte Sprache

Dieser NFA ohne

-Übergänge ist zu

äquivalent:

Zwar kommt auch dieser Automat mit drei Zuständen aus, aber er benötigt drei Endzustände. Erst nach genauem Hinsehen erschließt sich, dass er tatsächlich die

gleiche Sprache wie

akzeptiert.

Formal können wir einen NFAs mit -Übergängen (oder kurz NFA/ ) definieren, indem wir, ausgehend von einem normalen NFA, das Eingabealphabet durch das leere Wort erweitern. Für die Übergangsfunktion eines NFA/ gilt dann: Wie schon oben erwähnt, können NFAs mit -Übergängen keine neuen Sprachen erkennen. Es lässt sich immer ein äquivalenter DFA (und damit auch ein äquivalenter NFA) finden:

Äquivalenz von NFA/ und DFA Zu jedem NFA mit -Übergängen existiert ein äquivalenter DFA.

Der Beweis dieses Satzes kopiert die Vorgehensweise beim Beweis des Satzes von Rabin/Scott. Allerdings müssen wir die Übergangsfunktion des DFAs daran anpassen, dass wir es jetzt mit einem NFA/ zu tun haben. Dazu definieren wir zu einem Zustand aus der Zustandsmenge des NFA/ die so genannte -Hülle als die Menge aller Zustände, die von aus durch einen oder mehrere -Übergänge erreichbar sind. Da der DFA nicht die Möglichkeit spontaner -Übergänge hat, muss er diese Zustände von aus durch normale Zustandsübergänge erreichen können. Hier zur Veranschaulichung die -Hüllen von und für unseren Beispiel-NFA/ aus Abbildung 2.5:

Abbildung 2.5: NFA mit -Übergängen

Außerdem legen wir fest, dass die -Hülle einer Menge von Zuständen die Vereinigung der -Hüllen der Einzelzustände sein soll:

Damit können wir die Definition der Übergangsfunktion für den DFA an den NFA/ anpassen:

besteht also aus allen Zuständen, die von aus mit dem Symbol und eventuell weiteren -Übergängen erreichbar sind. Außerdem legen wir für den

Startzustand des DFAs fest:

Mit diesen Modifikationen läuft der Beweis des Satzes exakt so wie beim Satz von RabinScott. Betrachten wir nun ein weiteres Beispiel für einen NFA/ , diesmal über dem Alphabet :

Die -Übergänge ermöglichen dem Automat zu Beginn die Auswahl zwischen zwei unterschiedlichen Pfaden. Offenbar akzeptiert er die endliche Sprache . Was aber, wenn wir möchten, dass auch Kombinationen der Wörter aus , z.B. oder , kurz gesagt die Wörter der Menge , akzeptiert werden? Dazu müssen wir nur die Endzustände mit dem Startzustand durch -Übergänge verbinden. So werden beliebige Wiederholungen und Kombinationen der akzeptierten Wörter möglich. Um auch das leere Wort zu akzeptieren, müssen wir zusätzlich zu einem Endzustand machen:

Abschlusseigenschaften regulärer Sprachen Wir nutzen jetzt die Konstruktionsmöglichkeiten, die wir mit einem NFA/ haben, um eine weitere allgemeine Eigenschaft regulärer Sprachen zu beweisen. Zur Erinnerung: Reguläre Sprachen sind Sprachen, für die ein DFA existiert, der sie erkennen kann. Nach dem, was wir bis jetzt wissen, reicht es aber aus, einen passenden NFA oder NFA/ anzugeben, um zu zeigen, dass eine Sprache regulär ist.

Abschlusseigenschaften regulärer Sprachen sei eine reguläre Sprachen über dem Alphabet

.

Dann sind auch die Sprachen

regulär. Sind

zwei reguläre Sprachen über dem Alphabet , so sind auch die Sprachen

regulär.

Nehmen wir an, wird von dem DFA akzeptiert. Damit , also alle Wörter, die nicht in sind, akzeptiert werden, behalten wir im Wesentlichen bei, vertauschen aber die Menge der Endzustände mit der Menge der Nicht-

Endzustände. Die neue Menge der Endzustände ist also

.

Um zu akzeptieren, verwenden wir den gleichen Trick wie im letzten Beispiel: Wir verbinden alle Endzustände mit über einen -Übergang und erklären zusätzlich zu einem Endzustand. Nun zu den Fällen, in denen zwei Sprachen involviert sind: Wir nehmen nun an, wird von dem DFA akzeptiert und vom DFA . Zur besseren Unterscheidung benennen wir die Zustände dieser Automaten nicht wie sonst mit , sondern mit bzw. :

Ein endlicher Automat , der akzeptiert, muß sowohl die Wörter aus als auch aus akzeptieren. Das lässt sich am einfachsten erreichen, wenn wir in und gewissermassen parallel schalten und sich der Automat zu Begin entscheiden kann, welchen Weg er gehen möchte. Dazu spendieren wir einen eigenen Startzustand , von dem aus dann zwei -Übergänge nach bzw. führen:

Durch die parallele Anordnung von und haben wir einen NFA/ - Automaten gefunden, der akzeptiert. Was passiert, wenn man die beiden akzeptierenden Automaten und mit Hilfe eines -Übergangs hintereinander schaltet? Das Ergebnis ist ein Automat, der die Konkatenation der Wörter aus und , also akzeptiert.

Hierbei bezeichnen und die Endzustände von bzw. . Sollte mehr als einen Endzustand besitzen, müssen sie alle mit via -Übergang verbunden werden. Die Konstruktion eines Automaten , der akzeptiert, erfordert etwas mehr Mühe. Die Zustandsmenge dieses Automaten ist das kartesische Produkt von und :

Als Startzustand nehmen wir denen beide Einträge Endzustand von

. Endzustände sind alle Zustandspaare, bei bzw. sind:

Schließlich definieren wir noch die Übergangsfunktion durch

Durch diese Konstruktion können wir die beiden Übergangsfunktionen und gewissermaßen parallel ausführen. Nur wenn ein Eingabewort sowohl bei als auch bei in einem Endzustand landet (also in liegt), landet auch das Zustandspaar in einem Endzustand von . Damit akzeptiert die Sprache Betrachten wir ein Beispiel zu dieser Vorgehensweise: .

ist also die Sprache der Wörter, die eine gerade Anzahl Nullen enthalten, und ist die Sprache der Wörter, die eine gerade Anzahl Einsen enthalten. Hier die beiden dazugehörigen DFAs und :

.

Die Sprache besteht aus den Wörtern, die eine gerade Anzahl von Nullen und Einsen enthalten. Konstruieren wir nach dem obigen Verfahren einen Automaten, der akzeptiert, ergibt sich dieser Automat mit vier Zuständen:

Reguläre Ausdrücke Reguläre Ausdrücke beschreiben Muster in Zeichenketten, wie etwa »alle Strings aus Kleinbuchstaben, die mit beginnen und mit enden«, nach denen dann z. B. in einem Texteditor gesucht werden kann. Ein nützliches Tool im Rahmen einer Linux-Umgebung ist beispielsweise das Kommando grep. Das Wort grep steht für »global regular expression print«. grep sucht also nach Wortteilen in einer Datei, die zu einem gegebenen regulären Ausdruck passen, und gibt diese am Bildschirm aus. Das grep-Kommando für die obigen Strings, die mit beginnen und enden, lautet dann beispielsweise grep '’[a] [:lower:][a]'’ inputfile, wobei :lower: eine Abkürzung für alle Kleinbuchstaben darstellt. Ein regulärer Ausdruck setzt sich zusammen aus den Zeichen eines zugrunde liegenden Alphabets , runden Klammern und , und den Operatoren Kleene-Stern* (wird wie in gebraucht), dem senkrechten Strich , der für eine Alternative steht, und der Konkatenation, die manchmal mit dem Symbol geschrieben wird. Meist wird aber wie in einem mathematischen Ausdruck weggelassen. Die runden Klammern sorgen wie beim Rechnen dafür, dass die Operatoren in einer gewünschten Reihenfolge angewandt

werden (ohne Klammern hat der Kleene-Stern die höchste Priorität, gefolgt von der Konkatenation). Die Menge der Wörter, die zu dem in einem regulären Ausdruck beschriebenem Muster passen, bezeichnet man als die von erzeugte Sprache . Bevor wir uns einer formalen Definition von regulären Ausdrücken widmen, schauen wir uns zunächst einige Beispiele an: Alle folgenden regulären Ausdrücke nutzen das Alphabet

.

1.

. Das sind alle Strings, die mit 0 beginnen und enden, wobei sich dazwischen entweder eine 0 oder eine 1 befinden darf. Damit definiert die endliche Sprache .

2.

. Das ist eine 0, gefolgt von beliebig vielen 1. Sprache .

3.

. Auf eine führende 1 folgt eine 0 oder eine 1, die in beliebiger Kombination wiederholt werden können. Mit anderen Worten: Auf die führende 1 darf ein beliebiges Wort folgen. Es ist also

4.

. Dieser reguläre Ausdruck erzeugt folgende Sprache:

5.

: Auf zwei führende Bits folgt ein beliebiges Wort. Wir .

haben

definiert also die

6. Reguläre Ausdrücke lassen sich mit Hilfe der Operatoren, aus denen sie aufgebaut sind, rekursiv definieren. Genauer gesagt legt man fest, dass eine Anwendung von oder auf einen oder mehrere reguläre Ausdrücke wieder einen regulären Ausdruck ergibt: sei ein Alphabet. Die regulären Ausdrücke über sind folgendermaßen rekursiv definiert: und

sind reguläre Ausdrücke.

Jedes Zeichen

ist ein regulärer Ausdruck.

Sind und reguläre Ausdrücke, dann sind auch

und

reguläre

Ausdrücke. Ist ein regulärer Ausdruck, dann ist auch

ein regulärer Ausdruck.

Die von einem regulären Ausdruck erzeugte Sprache

wird analog definiert:

sein ein regulärer Audruck über dem Alphabet . Die von erzeugte Sprache ist folgendermaßen rekursiv definiert: und

. .

Sind und reguläre Ausdrücke, dann ist .

und

.

Angenommen, wir wollen in einem längeren Dokument automatisiert nach ganzen Zahlen suchen. Ganze Zahlen sind entweder positiv, negativ oder gleich null. Wenn sie negativ sind, beginnen sie mit einem Minuszeichen. Die erste Ziffer bei positiven oder negativen ganzen Zahlen ist niemals eine Null. Nach der ersten Ziffer können beliebig viele weitere Ziffern aus der Menge folgen. Dazu paßt der folgende reguläre Ausdruck:

und die erzeugte Sprache ist Wenn Sie die obigen Definitionen mit unserem letzten Satz über die Abschlusseigenschaften regulärer Sprachen vergleichen, sollte Ihnen einiges bekannt vorkommen: Reguläre Sprachen sind unter dem Kleene-Stern und Konkatenation abgeschlossen, und die Alternative bei regulären Ausdrücken bedeutet für die erzeugten Sprachen nichts anderes als die Vereinigung zweier Mengen. Reguläre Sprachen und reguläre Ausdrücke sind also unter denselben Operationen abgeschlossen, und das ist natürlich kein Zufall. Tatsächlich entsprechen die regulären Sprachen genau den von regulären Ausdrücken erzeugten Sprachen.

Äquivalenz regulärer Ausdrücke und regulärer Sprachen

Für jeden regulären Ausdruck existiert ein NFA/ , der regulären Sprache ein regulärer Ausdruck, der sie erzeugt.

akzeptiert. Umgekehrt existiert zu jeder

Zunächst einmal halten wir fest, dass es für die »Elementarbausteine« Symbole entprechende NFAs gibt:

und einzelne

Aus diesen elementaren Automaten können wir den zu einem regulären Ausdruck gehörenden NFA/ nach und nach aufbauen: Zu gehört der Automat

und zu

gehört der Automat

Für schließlich verwenden wir wieder unsere frühere Konstruktion, bei der wir die Endzustände eines Automaten , der akzeptiert, mit dem Startzustand verbinden und so eine Schleife erzeugen, die beliebig oft durchlaufen werden kann:

Damit können wir zu jedem regulären Ausdruck einen passenden Automat bauen. Leider ist die umgekehrte Aufgabe, also das Finden eines passenden regulären Ausdrucks zu einem gegebenen Automaten, nicht ganz so einfach. Das liegt daran, dass reguläre Ausdrücke durch die unterschiedliche Reihenfolge, in der die Operatoren ausgewertet werden, eine hierarchische Struktur besitzen, die endliche Automaten nicht in jedem Fall haben. Hierzu ein Beispiel über :

Dieser Graph zerfällt in zwei unabhängige Teile, die alternativ begangen werden können. Die Teile wiederum zerfallen jeweils in einen Schleifenteil und ein einzelnes Symbol. Insgesamt erhalten wir als regulären Ausdruck

Beachten Sie, dass wir diesen Ausdruck nur aus der Struktur des Graphen ableiten konnten, ohne die von dem Automaten akzeptierte Sprache zu betrachten. Für diese gilt natürlich

Die Aufteilung in unabhängige Teile ist jedoch nicht immer möglich, wie diese leicht abgeänderte Version des obigen Graphen zeigt:

Die beiden zusätzlichen Übergänge zwischen Unabhängigkeit der Teile.

und

zerstören die

Trotzdem lässt sich in jedem Fall über einen Algorithmus ein zu äquivalenter regulärer Ausdruck finden. Die Grundidee des Algorithmus besteht darin, die Übergangsfunktion von so zu verallgemeinern, dass auch ein regulärer Ausdruck einen Zustandsübergang bewirken kann. Ist ein regulärer Ausdruck, so legen wir fest:

Somit können wir die Pfeile im Übergangsdiagramm mit regulären Ausdrücken beschriften. Ziel ist es, durch immer komplexere reguläre Ausdrück nach und nach immer mehr Zustände aus dem Diagramm zu entfernen, bis nur noch Start- und Endzustand übrig sind, die über einen einzigen regulären Ausdruck verbunden sind. Für diesen Ausdruck gilt dann wie gewünscht . Lassen Sie uns dieses Vorgehen am Beispiel des Automaten oben im Beispiel nachvollziehen. In einem ersten Schritt können wir sehr einfach und entfernen, wenn wir reguläre Ausdrücke als Input für die Übergangsfunktion zulassen:

Im nächsten Schritt entfernen wir , indem wir uns darauf konzentrieren, welche Pfeile nach hinein- und welche hinausführen:

Offenbar kann man auf verzichten, wenn man, von bzw. ausgehend, gewissermaßen als Zwischenstation zu einem anderen Zustand auffasst. Wir erhalten so die vier neuen Übergänge und , die man anstelle von ins Übergangsdiagramm einfügt:

Wegen Übergang mit

können wir die beiden Schleifen bei vereinigen:

zu einem

Schließlich können wir noch eliminieren und haben damit den regulären Ausdruck mit gefunden:

Stochastische Automaten und Markov-Ketten Ein Wort , das in einen NFA eingegeben wird, wird akzeptiert, wenn die Chance besteht (also wenn die Wahrscheinlichkeit größer null ist), dass der Automat durch vom Startzustand in einen Endzustand überführt wird. Was aber, wenn wir nun wissen wollen, wie groß genau diese Wahrscheinlichkeit ist? Die ursprüngliche Definition eines NFA hilft uns bei der Beantwortung dieser Frage nicht weiter, da wir kein Wahrscheinlichkeitsmodell für DFAs eingeführt haben. Dafür brauchen wir einige zusätzliche Daten. Stellen Sie sich beispielsweise vor, wir würden einen NFA mit über einen längeren Zeitraum beobachten und zählen, wie oft er sich bei Eingabe von 0 für und wie oft für entscheidet. Wir sind dann in der Lage, genäherte

Wahrscheinlichkeiten für die Zustandsübergänge

bzw.

anzugeben: Die

Wahrscheinlichkeit, dass der Automat bei Eingabe von 0 von nach wechselt, entspricht näherungsweise der Zahl der von uns beobachteten Übergänge von nach , geteilt durch die Anzahl aller beobachteten Übergänge bei Eingabe von 0. Diese Näherung wird umso besser, je mehr Zustandsübergänge wir beobachten. Lassen Sie uns diese Überlegung auf den gesamten Automaten ausdehnen: Angenommen, unser Automat hat Zustände und das Eingabealphabet . Dann können wir die gleiche Messung für alle Eingabesymbole und für alle Zustände mit durchführen. Das heißt, wir ordnen jedem und allen Zustandspaaren

eine Übergangswahrscheinlichkeit

zu, die die

Wahrscheinlichkeit angibt, dass der Automat im Zustand bei Eingabe von in übergeht. So erhalten wir für jedes Eingabesymbol eine Matrix

Da es sich bei den Matrixelementen um Wahrscheinlichkeiten handelt, muß für alle Matrixelemente

gelten. Da außerdem auf jeden Fall irgendein Zustandsübergang erfolgt, wenn der Automat sich in einem Zustand befindet und ein Zeichen eingegeben wird (Ausnahme sind die Zustände mit , die wir in dieser Betrachtung außen vor lassen), muß in jeder Zeile der Matrix die Summe der Elemente 1 ergeben:

Matrizen, die diese beiden Bedingungen erfüllen, werden auch stochastische Matrizen genannt. Im Zusammenhang mit stochastischen Automaten bezeichnet man sie als Übergangsmatrizen. Ein stochastischer Automat ist ein NFA, bei dem man zu jedem Eingabesymbol eine Übergangsmatrix angeben kann. Nach unseren obigen Überlegungen sind das genau die NFAs, bei denen für jeden Zustand und jedes Eingabesymbol zumindest ein Nachfolgezustand definiert ist:

Der Grund, warum man die Übergangswahrscheinlichkeiten in einer Matrix anordnet und nicht in einer Liste, ist nicht nur die größere Übersichtlichkeit. Mit Hilfe der Übergangsmatrize lässt sich die eingangs gestellte Frage nach der Wahrscheinlichkeit, dass ein Wort akzeptiert wird, auf einfache Weise berechnen.

Wir betrachten einen stochastischen Automaten Zuständen und dem Übergangsgraphen

über

mit zwei

Hier haben wir die Übergangswahrscheinlichkeiten hinter die Eingabezeichen in den Übergangsgraphen geschrieben. Die Übergangsmatrizen lauten also

Auch ohne die Übergangsmatrizen ist klar, dass

Aber wie groß ist die Wahrscheinlichkeit, dass uns ein Wort wie tatsächlich von in den Endzustand bringt? Wenn wir das Wort verarbeiten, durchlaufen wir verschiedene Wege durch den Graphen. Zwei dieser Wege enden tatsächlich in , und die Wahrscheinlichkeit, dass einer dieser Wege genommen wird, entspricht dem Produkt der Wahrscheinlichkeiten der Zustandsübergänge, aus denen der Weg besteht:

Die endgültige Wahrscheinlichkeit erhalten wir, indem wir die Wahrscheinlichkeiten für die beiden Einzelwege addieren:

Zum Glück können wir uns aber die Arbeit für das Suchen der Wege und Aufaddieren der Wahrscheinlichkeiten sparen. In der Graphentheorie (s. Kapitel 14) beweist man, dass die -te Potenz der Adjazenzmatrix eines Graphen angibt, wie viele Wege der Länge es von einem Knoten zu einem anderen Knoten gibt:

Die Übergangsmatrizen eines stochastischen Automaten sind nichts anderes als Adjazenzmatrizen für den Übergangsgraphen, bei der die -Einträge durch Übergangswahrscheinlichkeiten ersetzt wurden. Multipliziert man die Übergangsmatrizen für die Symbole eines Wortes miteinander, multiplizieren sich für jeden Weg die Einzelwahrscheinlichkeiten miteinander und werden am Ende addiert. So erhält man statt der Anzahl der Wege von einem Knoten (= Zustand) zum nächsten die Wahrscheinlichkeit, mittels von einem Zustand zum Zustand zu kommen. Überprüfen wir diese Behauptung anhand unseres Beispiels: Es ist

Insbesondere gibt das Element in der ersten Zeile und zweiten Spalte die Wahrscheinlichkeit an, mittels von nach zu kommen. Diese Wahrscheinlichkeit ist , in Übereinstimmung mit unserer früheren Überlegung. Lassen Sie uns das Ergebnis unserer obigen Überlegung in verallgemeinerter Form in einem Kasten festhalten:

Übergangswahrscheinlichkeiten in einem stochastischen Automaten sei ein stochastischer Automat mit Übergangs-matrizen sei ein Eingabewort.

, wobei

.

Dann gibt das Element in Zeile und Spalte der Matrix

die Übergangswahrscheinlichkeit dafür an, dass

den Automaten von

nach

bringt:

Inbesondere ist

die Wahrscheinlichkeit, dass

akzeptiert wird.

Ein wichtiger Spezialfall eines stochastischen Automaten ist die Markov-Kette. Hier hat der stochastische Automat nur ein einziges Eingabesymbol, verfügt also auch nur über eine einzige Übergangsmatrix . Das Eingeben des Eingabezeichens wird dann als Fortschreiten eines zeitlich diskreten Prozesses (eines Markov-Prozesses) verstanden, bei dem in erster Linie interessiert, in welchem Zustand man nach Ablauf einer gewissen Zeit landet (aber weniger, ob es sich dabei um einen Endzustand handelt). Auch auf die explizite Angabe eines Startzustands wird oft verzichtet, um diesen flexibel wählen zu können. Manchmal spezifiziert man auch mehrere Startzustände und versieht diese wiederum mit Eintrittswahrscheinlichkeiten. Ein typisches Beispiel für einen Markov-Prozess bildet die Modellierung der Änderung des Wetters von einem Tag zum nächsten. In einem einfachen Modell des Winterwetters gibt es vier Zustände, nämlich . Wir nehmen an, dass man durch langjährige Beobachtungen den Übergangsgraphen in Abbildung 2.6 aufstellen konnte.

Abbildung 2.6: Markov-Prozess für winterliches Wetter

Dazu gehört die folgende Übergangsmatrix:

Der Eintrag in der Matrix besagt beispielsweise, dass die Wahrscheinlichkeit für Regen am nächsten Tag, wenn es aktuell bedeckt ist, 30 % beträgt. Mit der Übergangsmatrix lassen sich jetzt Aussagen über das zukünftige Wetter machen. Da z. B.

wissen wir, dass die Wahrscheinlichkeit für Schnee in drei Tagen 23,5 % beträgt, wenn heute die Sonne scheint, oder 28,9 %, wenn es heute bedeckt ist.

Hidden Markov Models In einem Hidden Markov Model (HMM) sind die Zustände des Markov-Prozesses nur indirekt bekannt (hidden) über die sogenannten Emissionen, das sind die Funktionswerte einer Beobachtungsfunktion , die jedem Zustand mit einer gewissen Wahrscheinlichkeit einen bestimmten Wert zuweist. Im obigen Beispiel könnte man sich vielleicht einen Meterorologen vorstellen, der nur anhand einer Temperaturkurve versucht, das Wetter der vergangenen Tage zu rekonstruieren. Hidden Markov Models kommen unter anderem in der automatischen Spracherkennnung zum Einsatz. Die tatsächlich gesprochenen Laute stehen dabei für die verborgenen Zustände des HMM. Die Spracherkennungs-Software beobachtet physikalische Parameter wie Signalenergien oder Frequenzen, die sich mit einer gewissen Wahrscheinlichkeit den gesprochenen Lauten zuordnen lassen. HMMs lassen sich als stochastische MooreAutomaten (s. Kapitel 1) modellieren, bei denen die Ausgabefunktion als Beobachtungsfunktion aufgefaßt werden kann.

Aufgaben zu NFAs Als kleine Hilfe, so zur Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wiley-vch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. 1. Welche Sprachen werden von diesen NFAs akzeptiert? Konstruieren Sie jeweils einen äquivalenten DFA nach dem Verfahren aus dem Beweis des Satzes von Rabin/Scott.

a.

b.

c. 2. Finden Sie einen NFA über

, der die Sprache

akzeptiert. 3. Geben Sie einen zu dem folgenden NFA äquivalenten regulären Ausdruck an.

Kapitel 3

Kellerautomaten (PDAs) IN DIESEM KAPITEL lernen wir eine echte Erweiterung der DFAs kennen, die sogenannten Kellerautomaten

»If you tell me precisely what it is a machine cannot do, then I can always make a machine which will do just that.« (Wenn Sie mir exakt beschreiben können, was eine Maschine nicht tun kann, dann kann ich immer eine Maschine bauen, die genau das tun kann.) John von Neumann, Vortrag an der Princeton University, 1948, zitiert nach: E. T. Jaynes: Probability Theory: The Logic of Science, Cambridge University Press 2003 Was der große Mathematiker und Computerpionier John von Neumann hier meint, ist, dass die Schwierigkeit oft nicht im Bau einer geeigneten Maschine liegt, sondern in der exakten Beschreibung dessen, was sie können soll. Die DFAs und NFAs aus den ersten beiden Kapiteln waren nicht in der Lage, die Anzahl a's und b's in einem String zu vergleichen. Die Lösung für dieses und andere Probleme bilden die sogenannten Kellerautomaten. DFAs verfügen über keinerlei Speicher, abgesehen von ihren internen Zuständen. Das führt dazu, dass eine sehr einfach gebaute Sprache wie z.B. L = {anbn|n ≤ 1} nicht regulär ist, also von einem DFA nicht erkannt werden kann. Wir erweitern deshalb unseren Automatenbegriff durch Hinzunahme eines sogenannten Kellerspeichers (Stack). In ihm können Zeichen aus einem Kelleralphabet Γ in der jeweils obersten Kellerposition gespeichert werden.

Nichtdeterministische Kellerautomaten Ein nichtdeterministischer Kellerautomat besteht im Wesentlichen aus einem NFA/ , der Zugriff auf eine besondere Art von Speicher besitzt. Dieser Kellerspeicher oder auch Stack ist im Prinzip unendlich groß, allerdings kann der Automat immer nur auf das oberste Zeichen im Keller zugreifen und dieses durch ein anderes Wort ersetzen. Man spricht auch vom LIFO-(Last-In-First-Out-)Prinzip. Werden neue Zeichen in den Keller geschrieben, wandern alle Zeichen im Keller entsprechend nach unten (PushdownOperation), wird das oberste Zeichen gelöscht, hüpfen die anderen Zeichen nach oben (Pop-Operation). Wegen dieser Arbeitsweise wird ein Kellerautomat auch als Pushdown Automaton (PDA) bezeichnet. Eine Hardware-Realisierung eines PDAs könnte also

ungefähr so wie in Abbildung 3.1 aussehen.

Abbildung 3.1: Hardware-Modell eines PDAs

Beachten Sie, dass für den Kellerspeicher ein anderes Alphabet benutzt wird als für das Eingabeband. Zudem findet sich im Keller ein besonderes Zeichen , das anzeigt, wenn der Keller leer ist. Wir vereinbaren, dass der Keller zu Beginn bereits dieses Zeichen enthält (aber sonst keine Zeichen). Anders als bei den DFAs billigen wir den PDAs von Beginn an die Möglichkeit nichtderministischen Verhaltens zu, d. h. die Auswahl unter verschiedenen Verhaltensweisen, inklusive -Übergängen. Da wir mit der Arbeit eines NFA/ bereits vertraut sind, hier nun ohne weitere Umschweife die Definition eines nichtderministischen Kellerautomaten: Ein nichtdeterministischer Kellerautomat (NPDA) ist ein 6 -Tupel , bestehend aus: einer endlichen Zustandsmenge einem Eingabealphabet

, wobei

, die die Zustände enthält. .

Einem Kelleralphabet , das die in den Keller geschriebenen Symbole enthält.

einer Übergangsfunktion einem Startzustand einem Symbol

). .

, dem letzten Kellerzeichen.

Wie meist ist in erster Linie die Übergangsfunktion erklärungsbedürftig: Sie erhält als Input den aktuellen Zustand, sowie die aktuell vom Eingabeband und aus dem Keller gelesenen Zeichen. Zusätzlich sind auch -Übergänge erlaubt, das bedeutet in diesem Fall: Es wird kein Zeichen vom Eingabezeichen verarbeitet (der Lesekopf bewegt sich also nicht nach rechts), jedoch wird das oberste Kellerzeichen ausgelesen. Der Output besteht aus einem neuen Zustand und einem Wort , das anstelle des obersten Kellerzeichens in den Keller geschrieben wird. Beachten Sie, dass auch das leere Wort sein kann. Dies entspricht einem Löschen des obersten Kellerzeichens (und einem darauf folgenden »Hochpoppen« der unteren Kellerzeichen). Genauso hindert uns auch nichts daran, nach dem Auslesen des obersten Kellerzeichens das gleiche Zeichen wieder in den Keller zu schreiben, den Keller also unverändert zu lassen. Schließlich müssen wir noch dem Nichtdeterminismus Rechnung tragen: Der Automat hat eventuell die Möglichkeit, sich für und zwischen mehreren Übergängen der Form

oder auch -Übergängen

zu entscheiden. Deshalb bildet

in die Potenzmenge

ab.

Eine von DFAs und NFAs vertraute Zutat fehlt in der obigen Definition: Die Menge der Endzustände. Tatsächlich benötigen wir für NPDAs keine expliziten Endzustände, um festzulegen, wann ein Wort akzeptiert wird: wird akzeptiert, wenn nach seiner Verarbeitung durch den NPDA der Keller leer ist, d. h. nur noch das letzte Kellerzeichen sich im Keller befindet. Bevor wir versuchen, diese Idee genauer zu verstehen, hier zunächst ein Beispiel für einen PDA: Die Sprache war mit DFAs bzw. NFAs aufgrund des fehlenden Speichers nicht erkennbar. Versuchen wir nun, einen NPDA zu konstruieren, der das kann. Informell könnten wir folgendermaßen vorgehen: Im Startzustand merken wir uns zunächst, wie viele 's das Eingabewort enthält, indem wir für jedes gelesene ein in den Keller schreiben. Sobald wir ein lesen, wechseln wir den Zustand und löschen für jedes gelesene ein aus dem Keller. Hat das Wort tatsächlich die Form , so ist der Keller leer, wenn das Wort abgearbeitet ist (und umgehkehrt). Enthält mehr als , ist der Keller nach dem Abarbeiten des Worts noch nicht leer; enthält mehr als , so ist der Keller leer, bevor das Wort abgearbeitet ist. Damit ist klar:

, und Für die Übergangsfunktion

.

muss nach unseren vorigen Überlegungen gelten:

Die ersten beiden Übergänge sind für das Einlesen, die letzten beiden für das Löschen zuständig. Beachten Sie, dass wir in dieser Auflistung alle Fehlerfälle (z. B. wenn im Zustand ein weiteres vom Band gelesen wird) einfach weglassen können. Natürlich lässt sich auch das Verhalten von PDAs mit Hilfe von Übergangsdiagrammen beschreiben. Dazu zeichnen wir den Übergang

Für unseren Beispiel-PDA erhalten wir damit diesen Übergangsgraphen: Um die Idee der Akzeptanz durch leeren Keller genauer zu fassen, brauchen wir zunächst eine Möglichkeit, den aktuellen Zustand eines NPDAs inklusive Kellerwort und Position des Lesekopfes auf dem Eingabeband zu beschreiben. Diese drei Informationen werden in einer Konfiguration zusammengefasst: Eine Konfiguration

sei ein NPDA. von

ist ein Tripel

Eine Konfiguration eines NPDAs beinhaltet also seinen aktuellen Zustand das noch abzuarbeitende Teilwort sowie die Zeichenfolge im Keller Vom Nichtdeterminismus einmal abgesehen, lässt sich das zukünftige Verhalten des NPDAs vorhersagen, wenn man eine Konfiguration kennt.

, .

Insbesondere kann als Startkonfiguration und als Endkonfiguration aufgefasst werden. Die Konfigurationen werden durch Anwendung der

Übergangsfunktion ineinander überführt:

Damit können wir die Akzeptanz durch leeren Keller formal beschreiben:

sei ein NPDA.

Die von (durch leeren Keller) akzeptierte Sprache ist die Menge der Wörter, bei denen der Keller von nach Bearbeitung aller Symbole von leer ist:

wobei

nur endlich oft angewendet werden sollte.

Wir betrachten als Beispiel zwei Abfolgen von Konfigurationen für unseren obigen NPDA, die durch zwei unterschiedliche Eingabewörter entstehen. Das erste Wort

ist nicht in

enthalten:

Obwohl komplett abgearbeitet wurde, ist der Keller nicht leer. nicht akzeptiert. Nun betrachten wir das Wort :

wird also

Nach sechs Anwendungen von ist die gewünschte Zielkonfiguration erreicht, d. h., der Keller ist leer und gleichzeitig ist abgearbeitet. wird also akzeptiert! Warum verwendet man nicht einfach wie bisher eine Menge von Endzuständen, um die Akzeptanz eines Wortes zu entscheiden? Einfach, weil man sie nicht braucht: Man kann nämlich zeigen, dass bei einem NPDA das Akzeptanzmodell mit leerem Keller äquivalent zur Akzeptanz über Endzustände ist. Akzeptiert beispielsweise ein NPDA ein Wort dadurch, dass er sich nach dem Abarbeiten von in einem Endzustand befindet, und ist der Keller noch nicht leer, so kann man durch eine Reihe von zusätzlichen Zustandsübergängen der Form

veranlassen, den Keller zu leeren. Umgekehrt existiert bei einem NPDA, der ein Wort Zustand mit

durch leeren Keller akzeptiert, ein

Wenn wir diese Zustände für alle akzeptierten Wörter in einer Menge von Endzuständen sammeln, haben wir einen NPDA, der Eingabewörter durch Endzustände akzeptiert. Kehren wir noch einmal zurück zur Definition eines NPDAs. Der Nichtdeterminismus des Automaten kann sich auf zwei verschiedene Weisen manifestieren: besteht aus mehreren Elementen, d. h., der Automat kann sich bei gleichem Input vom Band und aus dem Keller zwischen mehreren Nachfolgezuständen und in den Keller zu schreibenden Wörtern entscheiden. Für ein und ein sind sowohl als auch definiert, d. h., der Automat kann sich entscheiden, entweder vom Band zu lesen oder einen -Übergang durchzuführen (und den Lesekopf nicht zu bewegen). Wenn wir uns unser obiges Beispiel eines NPDAs aus Abbildung 3.2 nochmals anschauen, dann wird klar, dass dieser Automat keine der beiden Formen von Nichtdeterminismus aufweist. Man könnte ihn deshalb auch als deterministischen PDA auffassen. Unser nächstes Beispiel soll nun aber zeigen, wie nützlich gerade der Nichtdeterminismus eines PDAs in manchen Situationen sein kann.

Abbildung 3.2: Übergangsgraph eines NPDA

Ein Palindrom ist bekanntlich ein Wort, das sich von links nach rechts und von rechts nach links lesen lässt, z.B. OTTO oder RENTNER. Wie diese beiden Beispiele zeigen, kann ein Palindrom sowohl eine gerade Anzahl als auch eine ungerade Anzahl von Buchstaben enthalten. Wir möchten nun solche Palindrome automatisch erkennen. Genauer gesagt, suchen wir nach einem NPDA, der über einem Alphabet Sprache

die

erkennt. Nach dieser Definition sind also etwa oder auch Palindrome über und 0110110 oder 1111 Palindrome über . Wir nutzen im folgenden die Alphabete und . Die Grundidee für unseren NPDA besteht darin, zunächst die Zeichen der ersten Worthälfte im Stack abzulegen und sie dann, wenn die zweite Worthälfte gelesen wird, wieder aus dem Speicher zu löschen, wenn die Zeichen im Speicher und auf dem Band zueinanderpassen. Woher aber soll der Automat wissen, wann die zweite Worthälfte erreicht ist und er mit dem Löschen beginnen muss? Hier kommt der Nichtdeterminismus ins Spiel: Der Automat rät einfach, wann der richtige Zeitpunkt zum Zustandswechsel erreicht ist. Außerdem muß der Automat richtig erraten, ob es sich um ein Palindrom mit einer geraden Anzahl oder einer ungeraden Anzahl von Symbolen handelt: In beiden Fällen sollte ein Zustandswechsel erfolgen, aber bei einer ungeraden Anzahl von Symbolen darf beim Lesen des mittleren Symbols kein Symbol aus dem Keller gelöscht werden. Die ganze Raterei kommt Ihnen sicher etwas seltsam vor, aber erinnern Sie sich bitte daran, dass es bei nichtdeterministischen Automaten für die Akzeptanz eines Wortes schon ausreicht, wenn nur eine Chance besteht, in einen Endzustand zu gelangen bzw. hier den Keller zu leeren. Technisch ermöglichen wir das Raten durch zusätzliche Zustandsübergänge für den Lesezustand , die der Automat im richtigen Moment auswählen muss. Die gesamte Übergangsfunktion sieht damit wie folgt aus:

Haben Sie erkannt, warum sein muss? Der zusätzliche Übergang ist erforderlich, damit auch das Eingabewort eine Chance hat, akzeptiert zu werden. Betrachten wir noch einen weiteren Übergang etwas genauer:

Die erste Alternative steht für das Einlesen des Symbols in den Speicher. Hier geht der Automat also davon aus, dass wir uns noch in der ersten Worthälfte befinden. Die zweite Alternative vergleicht ein auf dem Eingabeband mit einem im Stack, löscht das und geht in den Vergleichszustand über. Dieser Übergang ist nötig, falls das Eingabewort eine gerade Wortlänge besitzt und das gelesene das erste Symbol der zweiten Worthälfte sein sollte. Falls wir es aber mit einer ungeraden Wortlänge zu tun haben, könnte gerade das mittlere Symbol darstellen. In diesem Fall sollte der Automat den Zustand wechseln, den Stack aber nicht verändern. Testen wir nun unseren NPDA, indem wir ihn auf ein Palindrom mit ungerader Wortlänge anwenden:

Natürlich ist dies nicht die einzig mögliche Abfolge von Konfigurationen. Entscheidet sich der Automat z.B. beim dritten Übergang anders, werden wir nicht die gewünschte Endkonfiguration erreichen. Aber für die Akzeptanz reicht es wie schon gesagt aus, wenn nur eine der vielen Möglichkeiten zu einem leeren Keller führt.

Deterministische Kellerautomaten Wir haben im letzten Abschnitt gesehen, dass der Nichtdeterminismus eines NPDAs sich darin äußert, dass er sich bei gleichem Eingabesymbol und gleichem Kellersymbol zwischen mehreren Zustandsübergängen entscheiden kann, bei denen gelesen wird. Alternativ kann er sich auch für einen -Übergang entscheiden, bei dem der Lesekopf auf dem Eingabeband an der gleichen Stelle verbleibt. Wenn wir dem Automaten diese Auswahlmöglichkeiten nehmen, so dass er in jeder Situation nur genau eine Möglichkeit hat, auf den Input vom Band und aus dem Keller zu reagieren, erhält man einen deterministischen Kellerautomat, oder kurz DPDA. Formal lässt sich ein DPDA definieren, indem man, ausgehend von der Definition des NPDAs, für die Übergangsfunktion eine Zusatzbedingung stellt:

Das bedeutet: Für ist nur genau ein (oder kein) Zustandsübergang definiert. Besteht im Zustand und bei Kellersymbol die Möglichkeit eines -Übergangs, so darf es keine weiteren alternativen Übergänge geben. Unser erster Beispiel-PDA, der die Sprache erkennen kann, ist ein solcher DPDA, wie man anhand der Übergangsfunktion erkennt:

In jeder Situation, in der überhaupt ein Übergang definiert ist1, gibt es für den Automaten nur eine einzige Alternative. Leider verliert der DPDA durch diese Einschränkung an Kraft. Beispielsweise lässt sich die Sprache aus dem letzten Abschnitt mit einem DPDA nicht erkennen: Woher soll der Automat wissen, an welcher Stelle die Wortmitte erreicht ist und er in den Vergleichsmodus wechseln muss? Raten ist aufgrund des Determinismus nicht mehr möglich. Wenigstens lassen sich manche Palindrome mit einem DPDA erkennen, wenn man die Wortmitte mit einem speziellen Markersymbol kennzeichnet: Wir betrachten die Sprache

über dem Alphabet

. Die Wörter dieser Sprache haben alle eine ungerade

Wortlänge, wobei das mittlere Symbol immer durch das $ - Zeichen gegeben ist. Ein DPDA über dem Alphabet , der diese Sprache erkennen kann, besitzt diese Übergangsfunktion:

Überzeugen Sie sich selbst davon, dass der Automat richtig arbeitet, indem Sie ihn auf das Wort anwenden! Wie die Palindrom-Sprache zeigt, gibt es Sprachen, die NPDAs erkennen können, DPDAs aber nicht. Lassen Sie uns diese Einsicht ohne formalen Beweis (bei dem man zeigen müsste, dass es keinen DPDA gibt, der die Palindromsprache erkennen kann) in einem Kasten festhalten:

NPDAs sind mächtiger als DPDAs Die Menge der von NPDAs akzeptierten Sprachen NPDA ist echt größer als die Menge DPDA der von DPDAs akzeptierten Sprachen.

DPDAs besitzen noch einen weiteren Nachteil gegenüber NPDAs: Bei ihnen ist das Akzeptanzmodell durch leeren Keller nicht äquivalent zur Akzeptanz durch Endzustände: Hat nämlich ein DPDA ein Eingabewort abgearbeitet und befindet er sich danach in einem Endzustand , kann es passieren, dass der Keller noch nicht leer ist. Anders als beim NPDA können wir im deterministischen Fall den Keller nicht einfach durch eine Reihe

von -Übergängen leeren, da es sein kann, dass für manche und bereits Übergänge der Form existieren, so dass keine weiteren -Übergänge mehr erlaubt sind. NPDAs sind also als mathematisches Modell deutlich angenehmer zu handhaben als DPDAs. Trotzdem macht es Sinn, sich auch mit den Eigenschaften von DPDAs zu beschäftigen, da sich in der Praxis natürlich immer nur deterministische Automaten konkret realisieren lassen.

Die Grenzen von PDAs Durch die Einführung des Kellerspeichers haben wir die Fähigkeiten unserer endlichen Automaten deutlich erweitert. Wir sind nun in der Lage, Sprachen wie

oder die Palindromsprache zu erkennen. Aber auch die Erkennungskraft von NPDAs hat ihre Grenzen: So kann ein NPDA beispielweise eine einfach gebaute Sprache wie

nicht erkennen. Einen formalen Beweis für diese Tatsache werden wir später im Kapitel 7 über kontextfreie Sprachen kennenlernen, aber wir können sie uns jetzt schon plausibel machen: Zwar ist ein NPDA in der Lage, die Wortmitte richtig zu raten, hat aber dann aufgrund des eingeschränkten Zugriffs auf den Kellerspeicher keine Möglichkeit, etwa das erste Symbol der ersten Worthälfte mit dem ersten Symbol der zweiten Worthälfte zu vergleichen. Ein anderes Problem tritt auf, wenn mehr als zwei Symbolgruppen miteinander verglichen werden müssen, wie etwa bei der Sprache

über . Um solche Sprachen erkennen zu können, benötigen wir ein flexibleres Modell eines Speichers.

Aufgaben zu PDAs Als kleine Hilfe, so zur Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wiley-vch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. 1. Warum sind die Sprachen

und

nicht regulär? 2. Geben Sie die Übergangsfunktion dieses NPDAs an. Welche Sprache akzeptiert er?

3. Konstruieren Sie NPDAs, die die folgenden Sprachen über dem Alphabet erkennen können: a. b. c. d.

Hinweis 1 Anders als bei DFAs ist es bei einem DPDA der Bequemlichkeit halber erlaubt, für manche Inputs keinen Übergang bzw. die leere Menge als Output von zu definieren. Deshalb gilt auch für DPDAs ).

Kapitel 4

Turing-Maschinen IN DIESEM KAPITEL lernen Sie die letzte Ausbaustufe unserer endlichen Automaten kennen, die TuringMaschinen erfahren Sie was deterministische Turing-Maschinen sind erkläre ich Ihnen was Mehrband-Turing-Maschinen ausmacht führe ich weitere Turing-Maschinen ein und erläutere ihre Grenzen

Die bisher von uns betrachteten Automaten verfügten noch nicht über einen Speicher in dem Sinne, wie wir ihn von unseren heutigen Computern her kennen: Diese können auf beliebige Zellen ihres Speichers zugreifen, Werte auslesen, verändern oder auch löschen. Wir erweitern daher in diesem Abschnitt unsere Automaten um einen beweglichen Schreib-/Lesekopf, der sich beliebig auf einem Ein-/Ausgabeband bewegen kann, um dort Zeichen zu lesen und zu verändern. Wie sich zeigt, reicht dies bereits aus, um ein ausreichend mächtiges Modell unserer Computer zu erhalten, mit dem wir hochgradig relevante Aussagen über ihre Fähigkeiten machen können.

Deterministische Turing-Maschinen »A man provided with paper, pencil, and rubber, and subject to strict discipline, is in effect a universal machine.« (Ein Mensch, ausgestattet mit Papier, Bleistift und Radiergummi, stellt praktisch eine universelle Maschine dar.) Alan Turing, in »Intelligent Machinery: A Report by A. M. Turing«. Bericht für das National Physical Laboratory (NPL), 1948. Wie kommt Turing zu dieser auf den ersten Blick provozierenden Aussage, in der er Menschen mit Maschinen, bzw. Computern gleich setzt? Computer heißt auf Deutsch bekanntlich Rechner. Bis vor circa 80 Jahren hatte das Wort Computer noch genau diese Bedeutung: Ein Person, die vorgegebene Rechnungen durchführt. Solche menschlichen Rechner wurden damals in ganz ähnlichen Bereichen eingesetzt, in denen heute Supercomputer genutzt werden, also z. B. in der Wettervorhersage. In seinem 1936 erschienenen bahnbrechenden Paper On Computable Numbers, with an

Application to the Entscheidungsproblem fragte sich Alan Turing, was nötig ist, um die Aktionen eines menschlichen Rechners durch ein möglichst einfaches mechanisches Gerät bzw. mathematisches Modell zu simulieren. Versetzen Sie sich dazu einmal in Ihre Schulzeit zurück und überlegen Sie, was Sie alles brauchen, um z.B. eine schriftliche Addition oder Multiplikation durchzuführen: Einen Bleistift, ein Blatt Karopapier, Ihre Augen, um die Zahlen auf dem Papier erkennen zu können und natürlich Ihr Gehirn, in dem der Algorithmus für die Rechnung gespeichert ist und die nächsten Schritte vorgibt. Übertragen wir diese Hilfsmittel auf die Hardware unserer bisherigen idealisierten Automaten, dann erkennen wir vieles wieder: Augen und Stift werden durch einen Schreib-/Lesekopf simuliert. Das Karopapier lässt sich durch ein (im Prinzip unendlich langes) Eingabeband ersetzen. Allerdings kann der menschliche Rechner seine Augen und seinen Stift überall hin auf dem Papier bewegen. Deshalb erlaubt Turing dem Schreib-/Lesekopf ebenfalls, sich an beliebige Stellen auf dem Eingabeband zu bewegen und auf dem Band auch zu schreiben. Wie sich zeigen wird, ist diese Fähigkeit entscheidend für die Mächtigkeit von Turings Automaten. Was das Gehirn betrifft, so stellte Turing sich vor, dass es je nach Input einen von endlich vielen Zuständen annehmen kann, also ganz im Sinne unserer bisherigen Kontrolleinheiten arbeitet. Eine Hardware-Realisierung einer Turing-Maschine sieht unspektakulär aus: Neu in dieser Darstellung ist - neben dem beweglichen Schreib-/Lesekopf - vor allem das spezielle Symbol (Blank), das leere Felder auf dem Eingabeband markiert. Es kann aber auch als Steuerzeichen dienen und insbesondere Anfang und Ende des Eingabeworts markieren. Wir vereinbaren, dass zu Beginn der Verarbeitung eines Eingabewortes der Schreib-/Lesekopf der Maschine wie in Abbildung 4.1 dargestellt auf dem ersten (am weitesten links stehenden) Symbol des Eingabeworts steht. Das Blank-Symbol sollte daher nicht im Eingabealphabet sein, das die Symbole der Eingabewörter enthält, sondern nur im Bandalphabet vorhanden sein. enthält alle Symbole, die sich prinzipiell auf dem Band befinden können und die der Schreib-/Lesekopf in der Lage ist, zu lesen und zu schreiben. In einem Arbeitsschritt liest die Turing-Maschine das aktuelle Zeichen auf dem Band, ersetzt es durch ein anderes Zeichen (oder belässt es bei dem alten Zeichen), wechselt den Zustand und bewegt danach den Schreib-/Lesekopf. Ein Zustandsübergang einer deterministischen Turing-Maschine nimmt damit diese Form an:

Abbildung 4.1: Eine Turing-Maschine mit

Zuständen

wobei und . Der dritte Output der Übergangsfunktion steht für die Bewegung des Schreib-/Lesekopfs (rechts / links / keine Bewegung). Deshalb ist . Im Übergangsdiagramm sieht ein Zustandsübergangs so aus:

Abbildung 4.2: Ein Zustandsübergang einer TM im Übergangsdiagramm

Nach diesen Vorbereitungen sind wir bereit für die formale Definition einer (deterministischen) Turing-Maschine : Eine deterministische Turing-Maschine (TM) ist ein 8-Tupel

bestehend aus: einer endlichen Zustandsmenge einem Eingabealphabet

, die die Zustände enthält.

, wobei

.

einem Bandalphabet , das die auf das Ein-/Ausgabeband geschriebenen Symbole enthält. Dabei ist . dem sogenannten Blank-Symbol

.

einer Übergangsfunktion . Die Symbole stehen dabei für die Bewegung des Schreib-/Lesekopfs (eine Zelle nach links, eine Zelle nach rechts oder keine Bewegung). einem Startzustand einer Menge

. , der Menge der Endzustände.

und einem Zustand

, dem Ablehnzustand.

Die Definition ist der eines DFAs sehr ähnlich. Neu ist die explizite Angabe eines Ablehnzustands sowie natürlich die Möglichkeit, auf dem Eingabeband zu schreiben und den Schreib-/Lesekopf zu bewegen, was den Output der Übergangsfunktion umfangreicher macht. Zu den End- und Ablehnzuständen vereinbaren wir zusätzlich, dass die TM anhalten soll, sobald sie den Endzustand oder den Ablehnzustand erreicht. Die TM kann damit bei Eingabe eines Worts eines von drei Verhalten zeigen: Die Maschine erreicht den Endzustand und hält an. Die Maschine erreicht den Ablehnzustand und hält an. Die Maschine hält nicht an. Wie kann eine TM nicht anhalten? Sicherlich ist Ihnen beim Programmieren schon einmal ein kleiner Fehler unterlaufen, der dazu geführt hat, dass Ihr Programm sich in eine Endlosschleife begeben hat. Auch TMs sind in der Lage, Schleifenkonstrukte zu bearbeiten und damit eben auch, sich in Endlosschleifen zu begeben. Hierzu ein Beispiel: Die folgende TM akzeptiert alle Strings, die mit 1 beginnen und begibt sich für alle anderen in eine Endlosschleife. Wir haben , , und . Übergangsfunktion bzw. Übergangsdiagramm haben dieses Aussehen:

Erkennen Sie, was passiert, wenn der Eingabestring mit 0 beginnt? Die TM wechselt nach , der dafür zuständig ist, mit dem Schreib-/Lesekopf ans Wortende zu laufen. Ist dieses erreicht, wie am -Symbol zu erkennen, wechselt der Automat nach , der dafür sorgt, dass der Schreib-/Lesekopf wieder an den Wortanfang wandert. Danach wiederholt sich das Spiel: Wir haben eine Endlosschleife konstruiert. Wir finden in der Beispiel-TM oben bereits wichtige Programmierkonstrukte vor: Eine if-Abfrage (Verzweigung) zu Beginn, danach eine Schleife, also eine Abfolge von Befehlen, die mehrfach abgearbeitet werden soll. Wie würde man vorgehen, wenn man wie in einer for - Schleife eine feste Anzahl von Wiederholungen haben möchte? Die Zahl muss irgendwo innerhalb des Eingabeworts kodiert sein, z.B. in Form von -Symbolen. Nach jedem Schleifendurchlauf könnte der Schreib-/Lesekopf eines der durch ein -Symbol ersetzen. Sind keine mehr vorhanden, wird die Schleife nicht mehr durchlaufen. Im letzten Beispiel haben wir den Begriff der Akzeptanz durch eine TM bereits ohne formale Definition benutzt, weil intuitiv klar ist, was es bedeutet, wenn ein String von einer TM akzeptiert wird. Wir holen die formale Definition jetzt nach:

sei eine deterministische Turing-Maschine.

Die von akzeptierte Sprache besteht aus den Eingabewörtern , für die die Turing-Maschine nach endlich vielen Schritten einen Endzustand annimmt. Die Sprachen , für die es eine TM gibt mit semi-entscheidbare Sprachen bezeichnet.

, werden auch als

Warum werden diese Sprachen als semi-entscheidbar bezeichnet? Indem sie in einen Endzustand übergeht, kann die TM gewissermaßen entscheiden, ob ein Eingabewort zu gehört oder nicht. Einen Haken hat die Sache allerdings: Was ist mit den Wörtern, die nicht zu gehören? Bei ihnen könnte die TM entweder in den Ablehnzustand gehen oder unendlich lange laufen. Solange die TM noch ein Eingabewort bearbeitet, ist also nicht klar, ob das Wort zu gehört oder nicht. Deshalb die Einschränkung semi-entscheidbar. Heißt das nun, dass die Sprache semi-entscheidbar ist? Zunächst einmal ja, aber wir können eine deutlich einfachere TM als die aus Abbildung 4.3 angeben, die ebenfalls akzeptiert und ohne Endlosschleife auskommt:

Abbildung 4.3: Übergangsgraph einer TM, die bei Eingabewörtern, die mit 0 beginnen, nicht anhält.

Die Eigenschaft der Semi-Entscheidbarkeit kann also verstärkt werden, indem man fordert, dass die akzeptierende TM alle Wörter, die nicht zu gehören, ablehnt: Eine formale Sprache heißt entscheidbar, falls es eine deterministische TuringMaschine gibt, die akzeptiert und die für alle Eingabewörter nach endlich vielen Schritten in übergeht. Wir werden später noch ein Beispiel für eine Sprache kennenlernen, die semientscheidbar, aber nicht entscheidbar ist. Das Verhalten einer deterministischen TM kann vorhergesagt werden, wenn man ihren aktuellen Zustand , das Wort links vom Schreib-/Lesekopf und das Wort beginnend beim Schreib-/Lesekopf kennt. Diese drei Informationen werden wie beim PDA in einer Konfiguration zusammengefasst:

sei eine TM.

Eine Konfiguration

von

ist ein Tripel

.

Ein Berechnungsschritt von ist ein Wechsel von einer Konfiguration zu einer anderen Konfiguration , in Zeichen:

Wie schon gesagt, hält die TM an, sobald ein Endzustand oder der Ablehnzustand erreicht ist. Die Konfiguration beim Anhalten nennt man auch Endkonfiguration, die Konfiguration vor dem Start heißt die Startkonfiguration. Wir betrachten nun drei Beispiele für entscheidbare Sprachen, die die Mächtigkeit der Turing-Maschine demonstrieren sollen. Intuitiv sollte Ihnen klar sein, dass eine deterministische TM mindestens die regulären Sprachen (also alle, die von einem DFA akzeptiert werden) erkennen kann, da man die Fähigkeiten der TM (genauer gesagt, des Schreib-/Lesekopfs) nur einschränken muss, um von einer TM zu einem DFA zu gelangen. Die Beispiele betreffen daher Sprachen, die von einem DPDA, einem NPDA oder von keinem PDA erkannt werden können. Unsere TM soll erkennen können, ob ein aus und bestehender Ausdruck korrekt geklammert ist, d. h., die akzeptierte Sprache soll z. B. das Wort enthalten, nicht aber das Wort . Das Eingabealphabet ist also . Wie muss unsere TM prinzipiell arbeiten? Die Grundidee besteht darin, zueinander passende Klammerpaare zu finden und zu markieren. Die TM durchsucht dazu zunächst das Eingabewort von links nach rechts nach einer öffnenden Klammer . Wird eine öffnende Klammer gefunden, markiert sie die TM d. h. die Klammer wird duch ein -Symbol ersetzt1. Daraufhin sucht die TM nach einer passenden, schließenden Klammer. Wird eine gefunden, wird auch diese mit einem markiert und die Suche nach Klammerpaaren beginnt erneut. Wird dabei keine öffnende, sondern nur eine schließende Klammer gefunden, wird das Wort abgelehnt. Dasselbe passiert, wenn zu einer öffnenden Klammer keine passende schließende Klammer gefunden werden kann. Kann schließlich bei einem Durchlauf weder ein schließende noch eine öffnende Klammer gefunden werden, ist das Wort komplett bearbeitet und kann akzeptiert werden. Aus diesem informellen Algorithmus ergibt sich Übergangsfunktion angegeben ist:

und die folgende , die hier tabellarisch

Dabei soll wie gewohnt ein Endzustand sein. Haben Sie die Funktion der einzelnen Zustände erkannt? sucht nach einer öffnenden Klammer, nach einer dazu passenden geschlossenen, und die Aufgabe von ist es, den Schreib/Lesekopf wieder an den Wortanfang zu bewegen. Lassen Sie uns die TM testen, indem wir sie auf das Beispielwort anwenden und dabei den Wechsel der Konfigurationen mit verfolgen:

Erinnern Sie sich noch an die Palindrom-Sprache aus Kapitel 3?

über einem Alphabet ? Sie konnte mit einem NPDA erkannt werden, aber der Nichtdeterminismus war für den Automaten zwingend erforderlich, um die Wortmitte erraten zu können. Durch die Fähigkeit einer TM, den Schreib-/Lesekopf auf dem Eingabeband hin und her bewegen zu können, können wir jetzt auf den Nichtdeterminismus verzichten: Wir markieren das erste Symbol im Eingabewort, laufen ans Wortende und vergleichen das letzte Eingabesymbol mit dem ersten. Stimmen die Symbole überein, markiert die TM auch das letzte Symbol, läuft an den Wortanfang und beginnt von Neuem mit dem ersten unmarkierten Eingabeymbol. Bei einem Palindron mit

gerader Wortlänge sind am Ende alle Symbole markiert, bei ungerader Wortlänge bleibt zum Schluss das mittlere Symbol übrig. Wörter, die keine Palindrome sind, werden abgelehnt, sobald ein Symbolvergleich fehlschlägt. Hier die dazugehörige Übergangsfunktion für das Eingabealphabet und das Bandalphabet :

Die Zustände und kodieren die Tatsache, dass ein bzw. als erstes Symbol gelesen wurde. und suchen das letzte Zeichen, angefangen beim rechten Wortrand, und vergleichen es mit dem ersten Zeichen. Ist der Vergleich erfolgreich, läuft die Maschine mit zum Wortanfang zurück und startet erneut mit . Hier wieder zur Illustration die Konfigurationsabfolge für das Palindrom

:

Mit dem dritten Beispiel gehen wir über die Möglichkeiten eines NPDA hinaus. Anders als in den letzten beiden Beispielen wird die Übergangsfunktion diesmal nicht in allen Details angegeben, sondern lediglich ein Algorithmus zur Erkennung der Sprache, von dem aber klar ist, dass eine TM prinzipiell in der Lage ist, diesen auszuführen. Wir betrachten die Sprache

Auf den ersten Blick ist nicht klar, wie eine TM diese Sprache erkennen soll. Immerhin hat sie nicht die Möglichkeit, die Wortmitte zu erraten und dann die Worthälften zu vergleichen. Wir können die Wortmitte aber berechnen: Zunächst einmal halten wir fest, dass nur Wörter mit gerader Wortlänge eine Chance haben, zu der Sprache zu gehören. Dies kann eine TM prüfen, indem sie versucht, die Symbole des Eingabeworts zu Paaren zusammenzufassen. Dazu wird ein erstes Element eines Paares gesucht und markiert und danach ein unmarkiertes Partnerelement gesucht:

Wird ein Partnerelement zu gefunden, wird es ebenfalls markiert (aber auf andere Weise), und der Prozess der Paarbildung beginnt erneut:

Kann kein Partnerelement gefunden werden, ist die Wortlänge ungerade:

Lässt sich kein unmarkiertes erstes Element eines Paares finden, ist die Einteilung in Paare geglückt und die Wortlänge gerade:

Der Zustand durchläuft das Eingabewort nach links bis zum Anfang und wechselt dann nach . Nun können wir in einem zweiten Schritt die Wortlänge durch 2 dividieren, indem wir die TM die Paare zählen lassen: Sie durchläuft das Eingabewort erneut von links nach rechts und sucht nach markierten ersten Elementen von Symbolpaaren. Wird eines gefunden, wird die Markierung entfernt:

Der Zustand läuft ans Ende des Worts bis zu einer freien Stelle und schreibt dort ein Zählsymbol aufs Band:

Dieser Prozess wird wiederholt, bis keine markierten ersten Paarelemente mehr vorhanden sind. Damit ist jetzt die Länge der ersten Worthälfte von in Form einer Reihe von -Symbolen auf dem Band kodiert. Nach Entfernung aller

Markierungen kann die TM jetzt mithilfe der Zählsymbole nacheinander das 1. Symbol von mit dem . Symbol vergleichen, das 2. mit dem . Symbol usw. bis zum Vergleich des -ten Symbols mit dem -ten Symbol. Um einen Vergleich durchzuführen, wird ein erstes Symbol auf dem Band gelesen, durch ein -Symbol ersetzt und in Form eines Zustands gespeichert:

sucht dann nach einem

-Symbol und markiert dieses:

Der Zustand dient dazu, wieder an den Wortanfang zu laufen und das erste dort vorgefundene Symbol zu markieren (dies ist das erste Symbol nach dem zuerst gelesenen ). Danach wird das nächste unmarkierte gesucht und markiert. Nach dem Zurücklaufen an den Wortanfang werden die Markierungen bereits markierter Symbole aus entfernt und das erste vorgefundene unmarkierte Symbol aus markiert. Auf diese Weise ist immer nur ein Symbol aus markiert. Seine Position bzw. sein Abstand von in entspricht der Anzahl der bereits gelesenen Symbole. Ist kein unmarkiertes mehr vorhanden, ist das aktuell markierte Symbol dasjenige, das mit dem ersten Symbol zu vergleichen ist. Der Vergleich erfolgt über einen Zustand :

Mit läuft die TM an den Wortanfang zurück und wechselt dann nach einen neuen Vergleich durchzuführen. Gelingen alle Vergleiche, gilt

,um .

Die Berechnungsfolgen im letzten Beispiel waren unter anderem deshalb so aufwendig, weil wir die Folge der Zählsymbole auf demselben Ein-/Ausgabeband unterbringen mussten wie das Eingabewort . Dadurch waren wir gezwungen, auf dem Band hin- und herzulaufen und uns eingelesene Symbole über Zustände zu merken. Einfacher wäre es natürlich, man hätte ein zweites Ein-/Ausgabeband z. B. zur Speicherung von Zwischenergebnissen zur Verfügung. Wir kommen auf diesen Punkt später im Abschnitt über Mehrband-Turing-Maschinen zurück.

Turing-Berechenbarkeit Bislang haben wir Turing-Maschinen in der uns bekannten Weise zum Erkennen von Sprachen eingesetzt. Da Turing-Maschinen die Möglichkeit haben, das Eingabewort in ein anderes zu verwandeln, lässt sich ihre Arbeitsweise auch noch unter einem anderen Blickwinkel verstehen: Sie können Funktionen berechnen. Dabei ist das Eingabewort der Input für . Der String, der auf dem Eingabeband steht, wenn die

TM anhält, lässt sich als der Funktionswert von

verstehen.

sei ein Alphabet.

Eine Funktion heißt Turing-berechenbar, falls es eine TuringMaschine gibt, die für jedes Eingabewort nach endlich vielen Berechnungsschritten den Funktionswert auf dem Band ausgibt. Es gibt also eine endliche Folge von Konfigurationen mit

wobei

.

In dieser Definition haben wir zusätzlich vereinbart, dass der Schreib-/Lesekopf nach der Berechnung auf dem ersten Symbol von stehen soll. Als erstes Beispiel betrachten wir die Funktion für Es ist nicht besonders schwierig, sich eine TM zu überlegen, die diese Funktion berechnet. Zunächst läuft man ans Wortende, ersetzt die beiden folgenden Symbole durch , läuft dann an den Wortanfang und fügt dort zwei 's an:

.

Die Zeichen sollen andeuten, dass diese Fälle nicht vorkommen können. Natürlich hätten wir an dieser Stelle auch den Ablehnzustand einsetzen können. Betrachten wir zur Illustration die Konfigurationen für das Inputwort :

Natürlich deckt die Definition für berechenbare Funktionen auch Funktionen ab, da sich die natürlichen Zahlen durch eine geeignete Kodierung immer mit der Menge identifizieren lassen. Die wichtigsten dieser Kodierungen sind die unäre Kodierung, die mit dem Alphabet auskommt und natürliche Zahlen

quasi als Strichlisten darstellt, sowie die bekannte binäre Kodierung über , bei der die Zahlen als Summe von Zweierpotenzen dargestellt werden. Wir betrachten zwei Beispiele, die diese Kodierungen benutzen. Wir berechnen die Funktion über dem Alphabet . Wir gehen also davon aus, dass das Inputwort eine Binärzahl darstellt. Die TM bildet den Algorithmus für die schriftliche Addition von Binärzahlen ab. Zur Erinnerung hier ein kleines Beispiel ( ): 1 1 1 1 0 1 1 1 0 0 1

Wir benötigen also einen Addierzustand, der nach dem Muster arbeitet, und einen Übertragszustand, der zusätzlich das Übertragsbit addiert. Insgesamt erhalten wir diese Übergangsfunktion: 0

1

Wir testen die Maschine anhand der Zahl Schreibweise:

, also

in dezimaler

Wir betrachten nun die Funktion . Für binär kodierte Zahlen über ist diese Funktion geradezu trivial berechenbar: Gerade Zahlen enden binär auf 0, und um durch 2 zu teilen, muss man nur diese letzte 0 streichen (also durch ersetzen). Wie sieht es über dem unären Alphabet

aus? Wir haben oben bereits

anhand der Sprache die prinzipielle Vorgehensweise kennengelernt: Der Inputstring wird in Paare aufgeteilt, und die Paare werden danach gezählt. Die Zahl der Paare entspricht dem Funktionswert . Anstatt eines Zählsymbols kann die TM einfach Einsen auf das Band schreiben und das Inputwort danach streichen. Tatsächlich sind die beiden Interpretationen einer TM als Akzeptor einer Sprache und als Werkzeug, um Funktionswerte zu berechnen, sehr eng verwandt. Um sie miteinander in Einklang zu bringen, definieren wir für eine Sprache eine sogenannte charakteristische Funktion , deren Funktionswert sich danach richtet, ob das Inputwort in liegt oder nicht:

Ist die charakteristische Funktion einer Sprache Turing-berechenbar, dann gibt es eine TM, die ihren Funktionswert für ein Inputwort in endlich vielen Schritten berechnen kann. Diese TM lässt sich leicht dahingehend erweitern, dass sie einen Endzustand annimmt, falls , und den Ablehnzustand, falls . ist damit entscheidbar. Hat man umgehrt eine entscheidbare Sprache , so kann man die dazugehörige TM benutzen, um zu berechnen: Wird ein Wort akzeptiert, so schreibt die Maschine den Funktionswert aufs Band, wird abgelehnt, schreibt sie und hält an. Damit haben wir Folgendes gezeigt:

Äquivalenz von Entscheidbarkeit und Berechenbarkeit Für eine Sprache

gilt:

Welche Funktionen lassen sich prinzipiell von einer TM berechnen? Es scheint, als ob dies für alle Funktionen gilt, die sich mithilfe eines Algorithmus, also einer exakt definierten Abfolge von Operationen mit Papier und Bleistift durch einen Menschen berechnen lassen. Solche Funktionen nennt man auch intuitiv berechenbar. Von Alonzo Church, einem Zeitgenossen von Turing, stammt die These, dass sich alle solchen

Funktionen mit einer Turing-Maschine berechnen lassen:

Church-TuringThese Die Menge der Turing-berechenbaren Funktionen stimmt mit der Menge der intuitiv berechenbaren Funktionen überein.

Leider lässt sich die Church-Turing-These nicht exakt beweisen, da wir über keine exakte mathematische Definition des Begriffs »intuitiv berechenbar«' verfügen. Es haben sich jedenfalls bislang noch keine Gegenbeispiele gefunden. Nimmt man an, dass die ChurchTuring-These gilt, so gewinnt man etwas sehr Wertvolles, nämlich eine exakte Definition des Begriffs Algorithmus: Ein Algorithmus ist demnach eine Abfolge von Schritten, die sich in Zustandsübergänge für eine deterministische Turing-Maschine umsetzen lassen. Jeder Algorithmus spezifiziert also eine deterministische Turing-Maschine und umgekehrt.

Mehrband-Turing-Maschinen Wir haben gesehen, dass eine Standard-TM durchaus in der Lage ist, Schleifenkonstrukte zu bearbeiten, dies aber in der Umsetzung relativ mühsam sein kann: Bei einer forSchleife etwa muss der Schreib-/Lesekopf jedes Mal, wenn er den Rumpf der Schleife einmal abgearbeitet hat, wieder zum Schleifenzähler laufen und diesen um 1 erniedrigen, bevor er wieder zum Beginn des Schleifenrumpfs läuft. Viel einfacher wäre es natürlich, wenn der Stand des Schleifenzählers parallel von einem zweiten Eingabeband eingelesen und bearbeitet werden könnte. So würde man sich viele Berechnungsschritte sparen, die nur dazu dienen, den Schreib-/Lesekopf an die richtige Stelle zu befördern. Für die allgemeine Definition einer -Band-TM können wir die Definition einer Standard-TM weitestgehend übernehmen. Wir müssen nur die Übergangsfunktion so anpassen, dass sie in der Lage ist, den Input von Eingabebändern zu verarbeiten und im Output auf Bändern zu schreiben. Für die Übergangsfunktion einer -BandTuring-Maschine gilt deshalb:

Als Beispiel betrachten wir eine dreibändige TM, die eine Art von Multiplikation durchführen soll: Auf Band 1 steht die Zahl , codiert durch das Eingabewort , auf Band 2 die Zahl , codiert durch das Wort . Am Ende der Berechnung soll auf Band

3 die Zahl

, codiert durch das Wort

, stehen.

Die Idee zur Durchführung der Multiplikation besteht darin, das Wort zu lesen und für jedes gelesene ein auf Band 3 zu schreiben. Dieser Vorgang wird mal wiederholt: Nach jedem Durchlauf durch bewegt sich der Schreib-/Lesekopf auf Band 2 so lange nach rechts, bis kein mehr auf Band 2 zu finden ist. Diese Idee führt zu der folgenden Übergangsfunktion. Dabei haben wir die Übergänge, die zu Fehlern führen (z.B. ein auf Band 1) weggelassen.

Sehr häufig wird, wie auch in unserem Beispiel, Band 3 nur als reines Ausgabemedium genutzt. Der Input von Band 3 kann in diesem Fall ignoriert werden, was die Angabe der Übergangsfunktion etwas übersichtlicher gestaltet. Mehrbändige Turing-Maschinen erleichtern uns also das Leben, da sich viele Aufgaben mit ihnen leichter und schneller (d. h. mit weniger Zustandsübergängen) lösen lassen. Zudem kommen Sie unserem intuitiven Verständnis der Arbeitsweise heutiger Computer näher, die ja auch auf mehrere Speicherbereiche unabhängig voneinander zugreifen können. Mehrbändige TMs stellen aber keine echte Erweiterung der Fähigkeiten einer einbändigen Turing-Maschinen dar:

Äquivalenz von 1-Band- und sei eine Dann existiert eine zu Kommt

nach

-Band-TM (

äquivalente 1-Band-TM

Schritten zum Halten, so kommt

-Band-TM

). . nach

Schritten zum Halten.

Nehmen wir an, wir haben eine 2-Band-TM mit der Übergangsfunktion , wobei . Das Eingabealphabet für ist damit also . Um eine äquivalente 1-Band-TM zu konstruieren, müssen wir die Zustandsmenge und das

Bandalphabet für deutlich erweitern. Das ist notwendig, um alle Informationen, die auf den beiden Bändern von und in den Zustandsübergängen gespeichert sind (Zeichen und Position der beiden Schreib-/Leseköpfe, Bewegung der beiden Schreib/Leseköpfe) auch in abbilden zu können. Das Eingabealphabet übernehmen wir von , lassen aber die Klammern der Symbolpaare weg. besitzt also das Eingabealphabet Wir stellen uns die ersten bzw. zweiten Einträge der Paare, die als Eingabezeichen für dienen, als Repräsentanten der Symbole auf dem ersten bzw. zweiten Eingabeband von vor. Wir merken uns zusätzlich die Position der Schreib-/Leseköpfe auf den Eingabebändern von , indem wir die entsprechenden Zeichen in den Paaren mit einem markieren. Deshalb müssen wir im Bandalphabet für neben dem Blank auch noch die markierten Versionen der Zeichen aus aufnehmen:

Die Simulation eines Zustandsübergangs von

in der Form

mit und beginnt damit, dass das gesamte Wort auf dem Eingabeband von links nach rechts durchläuft und sich dabei die markierten Zeichen und merkt. Technisch passiert das dadurch, dass sich vor dem Durchlauf im Zustand

befindet. Das Zeichen ist dabei ein Platzhalter für Informationen, die im Moment noch unbekannt sind. Die einzige aktuell bekannte Information ist der Zustand von . Werden beim Durchlauf markierte Zeichen gefunden, wechselt in den Zustand

Damit sind die beiden Eingabezeichen für zurück zum Wortanfang laufen.

bekannt, und der Schreib-/Lesekopf kann

Die Folge-Aktionen von gemäß werden jetzt durch einen Zustandswechsel von

in den Zustand

abgebildet. Dieser Zustand sorgt dafür, dass die Aktionen von durch simuliert werden: Die markierten Zeichen und werden durch ersetzt und die Markierungen gemäß und verschoben. Ist das erledigt, läuft zum

Wortanfang und wechselt erneut den Zustand, nämlich nach

Damit ist ein kompletter Zustandsübergang von kann beginnen.

simuliert, und ein neuer Durchlauf

Für jeden so simulierten Arbeitsschritt muss die 1-Band-TM zweimal über ihr Ein/Ausgabeband laufen. Auf dem Band können aber nur so viele Felder beschrieben sein, wie auch auf ihren zwei Bändern beschrieben hat, das heißt höchstens eines pro Arbeitsschritt von . Benötigt also insgesamt Schritte, lässt sich die Anzahl der insgesamt von benötigten Schritte nach oben grob durch abschätzen. Schauen wir uns zur Illustration der Vorgehensweise aus dem Beweis die Simulation eines Schritts der 2-Band-TM aus Abbildung 4.4 an, wobei wir annehmen, dass für die 2-Band-TM gilt. Dies ist der Arbeitsschritt, den wir simulieren müssen.

Abbildung 4.4: Eine 2-Band-TM

In der 2-Band-Maschine steht zu Beginn der Schreib-/Lesekopf für das erste Band auf dem dritten Feld, einem , und für das zweite Band auf dem zweiten Feld, einem . Die Maschine ist in Zustand . Diese Informationen schlagen sich in dieser Konfiguration der simulierenden 1-Band-TM nieder:

Der Schreib-/Lesekopf durchläuft nun das Eingabeband und merkt sich die markierten Zeichen in Form von Zustandswechseln:

Nachdem die beiden markierten Zeichen gefunden worden sind, kann der Schreib/Lesekopf zum Wortanfang laufen und den Zustand entsprechend wechseln:

Die Maschine führt nun die in kodierten Aktionen durch und läuft dann an den Wortanfang, um den nächsten Arbeitsschritt der 2-Band-TM zu simulieren:

Eine Menge Arbeit, aber sie hat sich gelohnt: Mit den Mehrband-Turing-Maschinen verfügen wir über ein Werkzeug, das die Programmierung von TMs deutlich vereinfacht und intuitiver macht, ohne dass wir fürchten müssen, dass unsere allgemeinen Einsichten über Turing-Maschinen durch die Nutzung mehrerer Bänder verfälscht werden.

Registermaschinen Die Registermaschinen oder auch Random Access Machines (RAM) stellen eine Variante der Turing-Maschinen dar, die unserem Verständnis realer Computer noch einmal deutlich näherkommt. Die Rolle des Ein-/Ausgabebands übernehmen hier sogenannte Register, das sind Speicherzellen, auf die die Maschine frei zugreifen kann und die natürliche Zahlen enthalten können. Die Registerzellen werden anhand von Befehlen wie read, write oder load manipuliert, die in den Zellen des Programmspeichers gespeichert sind. In einer besonderen Registerzelle, dem Akkumulator, werden Zwischenergebnisse festgehalten. Die Befehle im Programmspeicher werden nacheinander unter Kontrolle des Befehlszählers abgearbeitet. Die Befehle im Programmspeicher bilden das Gegenstück zur Übergangsfunktion der Turing-Maschine. Der Umgang mit einer RAM ist natürlich deutlich angenehmer als der mit einer TM, da sich lästige Fragen der Kodierung von Zahlen auf dem Ein-/Ausgabeband nicht mehr stellen und vor allem nicht mehr mühsam von Feld zu Feld auf dem Eingabeband gelaufen werden muss, um bestimmte Daten zu finden. Dementsprechend ist es auch nicht überraschend, dass jede TM von einer RAM simuliert werden kann: Man muss nur die Zustandsübergänge der Übergangsfunktion der TM in entsprechende Befehle für die RAM übersetzen und die Symbole des Alphabets durch natürliche Zahlen kodieren. Aber die Simulation funktioniert auch umgekehrt: Eine RAM mit Registerzellen kann durch eine Mehrband-TM mit Bändern simuliert werden. Das erste Band enthält das Inputwort, das zweite die Befehle aus dem Programmspeicher in der Form , wobei die Nummer der Zelle ist und der dort gespeicherte Befehl. Das dritte Band dient als Output-Medium und entspricht damit dem Akkumulator. Die restlichen Bänder enthalten jeweils den Inhalt einer Registerzelle der RAM in einer geeigneten Kodierung. Die Übergangsfunktion der TM sorgt nun dafür, dass die Befehle auf Band 2 nach und nach abgearbeitet werden. Solch ein Befehl könnte z. B. lauten read j, also

»lese den Inhalt der Zelle aus dem Programmspeicher und schreibe ihn in den Akkumulator«'. Dementsprechend sucht die TM auf Band 2 den Eintrag und schreibt auf Band 3. Analog können auch die anderen Befehle für die RAM in Zustandsübergänge der TM umgesetzt werden. RAMs und TMs sind also äquivalent. Während Erstere für praktische Zwecke leichter zu handhaben sind, lassen sich Letztere aufgrund des übersichtlicheren mathematischen Modells leichter analysieren.

Nichtdeterministische Turing-Maschinen Was passiert, wenn wir Nichtdeterminismus für unsere TMs erlauben? Das würde bedeuten, eine TM könnte sich zwischen mehreren Übergängen der Form

entscheiden. Anders gesagt: Die Bilder der Übergangsfunktion sind jetzt Mengen:

deren Elemente aus

kommen.

Für die Übergangsfunktion einer solchen nichtdeterministischen Turing-Machine gilt dann analog zu der Konstruktion bei den NFAs: Da damit auch die leere Menge als Bild erlaubt ist, erübrigt sich bei einer NTM die explizite Angabe eines Ablehnzustands . Bearbeitet die NTM ein Wort , entsteht ähnlich wie bei den NFAs ein Berechnungsbaum, der sich jede Mal verzweigt, wenn für die Maschine eine Auswahlmöglichkeit besteht. Wie vorher bei den NFAs vereinbaren wir, dass ein Wort akzeptiert wird, wenn mindestens einer der Berechnungspfade in einen Endzustand bzw. eine Endkonfiguration mündet. Von den deterministischen TuringMaschinen übernehmen wir die Definition eines Berechnungsschritts als Konfigurationswechsel aufgrund der Anwendung der Übergangsfunktion.

Abbildung 4.5: Eine einfache nichtdeterministische TM

Betrachten wir ein einfaches Beispiel für eine solche Maschine über

:

Hier ist . Die Maschine hat also die Wahl zwischen den Übergängen und . Schauen wir uns den Berechnungsbaum an, der sich ergibt, wenn wir das Wort eingeben: wird also akzeptiert. Insgesamt akzeptiert der Automat die Sprache aller Wörter, die auf enden. Natürlich hätten wir auch eine DTM bauen können, die diese Sprache akzeptiert ( ist ja sogar regulär), aber durch den Nichtdeterminismus benötigen wir nur drei Berechnungsschritte, da die NTM einfach raten kann, ob sie den vorletzten Buchstaben des Eingabewortes bereits erreicht hat. Eine DTM müsste zuerst bis ans Wortende laufen und dann zwei Schritte zurück, um zu prüfen, ob das Wortende die richtige Form hat.

Abbildung 4.6: Berechnungsbaum für

Das Verhältnis von NTM zu DTM aus dem Beispiel ist allgemein gültig: Zu einer NTM lässt sich immer eine äquivalente DTM konstruieren, die die gleiche Sprache akzeptiert, dafür aber mehr Berechnungsschritte benötigt.

Äquivalenz von nichtdeterministischen und deterministischen Turing-Maschinen Zu jeder nichtdeterministischen Turing-Maschine die sie simuliert.

existiert eine deterministische Turing-Maschine

,

In der Beweisidee nehmen wir ohne Beschränkung der Allgemeinheit an, die NTM könnte sich bei jedem Zustandsübergang zwischen zwei Alternativen entscheiden. Dann lässt sich jeder Pfad durch den Berechnungsbaum durch ein Wort beschreiben. Beispielsweise haben die beiden Pfade im Berechnungsbaum oben, die in eine Endkonfiguration führen, die Codes und . Um uns das Leben etwas zu erleichtern, stellen wir uns vor, wir haben als DTM eine 3-Band-TM zur Verfügung: Auf Band 1 befindet sich ein Binärcode für die Übergangsfunktion von , auf Band 2 das Eingabewort . Auf Band 3 erzeugt nacheinander alle Wörter in lexikografischer Reihenfolge, also Für jedes erzeugte Wort kann mithilfe von den zu gehörigen Berechnungspfad für simulieren und prüfen, ob am Ende ein Endzustand von erreicht wird oder nicht. Falls ja, geht auch in einen Endzustand. Ist , so existiert ein solcher Pfad, und das dazugehörige Wort wird irgendwann von erzeugt. Also kommt für auch irgendwann in einem Endzustand zum Halten. Wie diese Beweisskizze zeigt, benötigt eine DTM im schlimmsten Fall Berechnungsschritte, wo eine NTM für die gleiche Aufgabe nur Schritte braucht. Das liegt daran, dass die DTM vielleicht alle Pfade durch den Berechnungsbaum testen muss, während die NTM einfach den einzig richtigen Pfad errät. Obwohl NTMs keine prinzipiell anderen Fähigkeiten als DTMs haben, spielen sie als abstrakte Berechnungsmodelle in der Komplexitätstheorie eine wichtige Rolle, wenn es darum geht, zwischen effizient lösbaren und schwierigen Problemen zu unterscheiden. Mehr dazu in Teil III des Buchs.

Linear beschränkte Turing-Maschinen Das Schreib-/Leseband einer TM ist unbegrenzt lang, was natürlich nichts anderes als eine unrealistische, aber nützliche Abstraktion darstellt, um sich nicht mit dem eventuell begrenzten Platz auf dem Band befassen zu müssen. Eine interessante Variante einer TM erhält man, wenn man auf diese Vereinfachung verzichtet und die Länge des Eingabebandes auf die Länge des Eingabewortes begrenzt. Diese Maschinen nennt man linear beschränkte Turing-Maschinen (LBTM) : Beachten Sie, dass in Abbildung 4.7 die Anfangs- und Endsymbole des Eingabewortes speziell markiert wurden, um der Maschine die Grenzen des Eingabewortes zeigen zu können, ohne dass der Schreib-/Lesekopf über die Wortgrenzen hinauslaufen muss. Neben dieser Erweiterung des Eingabealphabets durch markierte Symbole muss man bei einer LBTM noch fordern, dass die Länge des Worts auf dem Eingabeband bei jedem Konfigurationswechsel unverändert bleibt:

Abbildung 4.7: Linear beschränkte Turing-Maschine (LBTM)

Offenbar sind LBTMs nicht so mächtig wie gewöhnliche TMs: Beispielsweise kann eine LBTM keinen Funktionswert berechnen, der länger ist als das Eingabewort. Das passiert etwa bei für (in binärer Codierung) oder bei für jedes in binärer Darstellung. Da eine LBTM keine Möglichkeit hat, alle Wörter zu erzeugen, um alle Berechnungspfade einer nichtdeterministischen Berechnung zu durchlaufen, ist die obige Konstruktion einer äquivalenten deterministischen LBTMs zu einer nichtdeterministischen LBTM nicht durchführbar. Natürlich könnte es aber einen anderen Weg geben, eine äquivalente deterministische LBTM zu erzeugen. Die Frage, ob dies möglich ist, ist nach wie vor offen und wird als das LBA - Problem bezeichnet. Die besondere Bedeutung dieser Variante von TMs besteht darin, dass die linear beschränkten, nichtdeterministischen TMs in der Lage sind, eine wichtige Sprachklasse, nämlich die kontextsensitiven Sprachen zu akzeptieren, wie wir später in Kapitel 8 noch sehen werden.

Universelle Turing-Maschine (UTM) Bislang haben wir Turing-Maschinen als Special-purpose-Maschinen angesehen, d. h., wir haben für verschiedene Berechnungszwecke auch jeweils verschiedene TMs konstruiert. Unsere Vorstellung von einem Computer ist aber eine andere, nämlich die einer universellen Hardware-Plattform, die für unterschiedliche Zwecke unterschiedlich programmiert wird. Man spricht auch von Stored-program-Computern. Diese Idee ist sehr alt: Schon die ersten Computer in den Fünfzigerjahren des letzten Jahrhunderts waren Stored-program-Computer. In diesem Abschnitt werden wir sehen, dass sich das Konzept des Stored-programComputers mit einer universellen Turing-Maschine realisieren lässt: Eine solche Maschine müßte in der Lage sein, verschiedene Algorithmen und Eingabewörter auf dem Eingabeband einzulesen und dann den Algorithmus auf das Eingabewort anzuwenden. Nach der Church-Turing-These aber entsprechen Algorithmen nichts anderem als einer formalen Beschreibung einer Turing-Maschine. Eine universelle Turing-Maschine muss also in der Lage sein, alle anderen Turing-Maschinen zu simulieren.

Universelle Turing-Maschine Es gibt eine universelle Turing-Maschine (UTM), d. h., es gibt eine Turing-Maschine, die alle anderen TuringMaschinen simulieren kann.

Wir nennen die zu simulierende TM und die universelle Turing-Maschine und gehen davon aus, dass mit dem binären Alphabet arbeitet. Ferner habe die Zustandsmenge mit dem Startzustand , dem Ablehnzustand und dem Endzustand . Wie sich zeigt, ist es angenehmer, sich als eine 3-Band-TM vorzustellen. Unsere erste Aufgabe besteht darin, wie wir das Verhalten, also die Übergangsfunktion von in einlesen können. Dazu schreiben wir einen Zustandsübergang von , also

als 5-Tupel

und legen alle diese 5-Tupel, binär kodiert und durch ein getrennt, auf Band 1 von ab. Das Eingabewort von schreiben wir auf Band 2 (dieses Band steht für das Ein-/Ausgabeband von ), und auf Band 3 merken wir uns den aktuellen Zustand von . Zu Beginn würde man dort also den binären Code für den Startzustand von

platzieren. Damit sieht

am Start der Simulation so aus:

Um einen Zustandsübergang von folgenden Schritte aus:

zu simulieren, führt

1. Lese den aktuellen Zustand von von Band 2. Falls oder 2. Suche den Code für .

nun nacheinander die

von Band 3 und das aktuelle Eingabezeichen , halte an. Anderenfalls:

auf Band 1 und lese die Reaktion von

:

3. Schreibe auf Band 2 und bewege den Schreib-/Lesekopf auf Band 2 wie durch vorgegeben. 4. Ersetze

auf Band 3 durch

. Gehe zu Schritt 1.

Abbildung 4.8: Universelle Turing-Maschine

Durch diese Schritte wird das Verhalten von auf Band 2 komplett simuliert. Insbesondere hält auch an, wenn anhält, sei es durch Akzeptanz oder durch Ablehnung von . Die UTM kann somit als eine Form universeller Hardware-Plattform angesehen werden. Die Software, die das Verhalten der UTM für einen bestimmten Zweck steuert, wird über das Eingabeband eingelesen. Unser Ziel, ein mathematisches Modell für das Verhalten unserer Computer zu finden, ist damit erreicht.

Die Grenzen von Turing-Maschinen Die Fähigkeiten von Turing-Maschinen sind beeindruckend. Die Church-Turing-These besagt, dass jedes Problem, für das sich ein Algorithmus formulieren lässt, mit einer

Turing-Maschine lösen lässt. Selbst die Hinzunahme von mehreren Bändern und von Nichtdeterminismus konnte die Fähigkeiten von Turing-Maschinen nicht weiter vergrößern. Vor allem Letzteres ist eine gute Nachricht, da wir Nichtdeterminismus einer Maschine in der physischen Wirklichkeit nicht realisieren können. Schließlich haben wir im letzten Abschnitt gesehen, dass wir nicht für jedes Problem eine eigene TM bauen müssen, sondern dass es ein Universal-Modell einer TM gibt, die wir nur mit der richtigen Software, d. h. mit dem Code einer TM, die unser Problem löst, füttern müssen, damit sie für uns jedes Problem löst, das überhaupt mit einer TM lösbar ist. In diesem Abschnitt beschäftigen wir uns zum ersten Mal mit dem, was eine TM nicht kann. Die Beantwortung dieser Frage ist deshalb so wichtig, weil eine Grenze für eine TM gleichzeitig auch eine Grenze für alle unsere Computer darstellt. Wir werden also Informationen darüber erhalten, was unsere Computer niemals können werden, völlig unabhängig von Fortschritten in der Rechengeschwindigkeit oder Miniaturisierung der Bauteile. Sie haben sicher schon einmal ein Programm in einer höheren Programmiersprache wie Java oder C geschrieben. Bevor der Computer es ausführen kann, muss es zuerst kompiliert, d. h,. in eine Hardware-nähere Sprache wie Assembler übersetzt werden. Diese Übersetzung nimmt uns ein spezielles Programm ab, der Compiler. Aber der Compiler leistet mehr als das reine Übersetzen: Bevor er den Übersetzungsprozess startet, prüft er Ihr Programm zunächst auf syntaktische Korrektheit, z. B. ob alle Ausdrücke in Ihrem Code richtig geklammert sind. Wir haben in den vorangegangenen Abschnitten gesehen, dass solche Syntax-Prüfungen für Turing-Maschinen oder auch PDAs kein großes Problem sind. Aber oft passiert es, dass sich ein Programm trotz syntaktischer Korrektheit unerwartet verhält: Die Ergebnisse sehen nicht so aus, wie sie sollten, oder das Programm hält trotz korrekter Eingaben nicht an. Wir wissen, dass Turing-Maschinen prinzipiell zu solchem Verhalten fähig sind, von daher ist das keine Überraschung. Aber wäre es nicht schön, schon im Voraus im Rahmen der Kompilierung prüfen zu können, ob ein Programm bei einer bestimmten Eingabe anhält? Das ist das sogenannte Halteproblem. Ein erster Ansatz zu seiner Lösung besteht darin, das zu prüfende Programm in eine Turing-Maschine zu übersetzen und dann zusammen mit dem Inputwort auf einer universellen Turing-Maschine zu simulieren. Hält das Programm bei Eingabe von , wird auch anhalten und in einen Endzustand gehen. Geht das Programm aber in eine Endlosschleife, wird auch dies tun, und wir können uns nicht sicher sein, ob nicht vielleicht doch noch irgendwann anhält. Lassen sie uns diesen Gedankengang formalisieren: Ähnlich wie im letzten Abschnitt codieren wir eine TM binär als ein Wort . Da wir daran interessiert sind, für welche Eingabewörter Maschine anhält, definieren wir für eine Sprache

die

wobei das spezielle Symbol Eingabewort dient.

der Trennung zwischen dem Code für die TM und dem

Das Halteproblem besteht in der Frage, ob ein gegebenes Wort ist. Unsere obigen Überlegungen haben gezeigt, dass die universelle Turing-Maschine die Sprache für jedes akzeptiert, das sie für ein Eingabewort simulieren kann und akzeptiert, falls anhält. Für Wörter hält jedoch nicht zwingend an. Damit ist klar, dass zumindest zu den semi-entscheidbaren Sprachen gehört. ist aber nicht entscheidbar, denn man kann zeigen, dass es keine TM geben kann, die Wörter akzeptiert und Wörter ablehnt:

Unentscheidbarkeit des allgemeinen Halteproblems Es gibt keine TM, die die Sprache

entscheiden kann.

Möchte man in der Mathematik beweisen, dass ein Objekt mit bestimmten Eigenschaften existiert, so versucht man, ein solches Objekt zu konstruieren. So sind wir im letzten Abschnitt mit der universellen Turing-Maschine vorgegangen. Konzeptionell schwieriger ist es, zu zeigen, dass ein bestimmtes Objekt nicht existiert. Die übliche Vorgehensweise ist die, sich vorzustellen, es existierte ein solches Objekt, und dann einen Widerspruch zu konstruieren (sogenannter indirekter Beweis, siehe auch Kapitel 12). In diesem Fall entsteht der Widerspruch dadurch, dass eine Turing-Maschine, die für alle Maschinen entscheiden kann, damit auch Aussagen über sich selbst macht. Mit Hilfe von selbstbezüglichen Aussagen lassen sich häufig Widersprüche konstruieren, wie bei dem bekannten Barbier, der alle Männer in der Stadt rasiert, die sich nicht selbst rasieren: Versucht man nämlich die Frage zu klären, ob sich der Barbier selbst rasiert, stößt man auf das Problem, dass er sich selbst rasiert, wenn er sich nicht selbst rasiert, und dass er sich selbst nicht rasiert, wenn er sich selbst rasiert. Die einzige Folgerung kann nur sein, dass ein solcher Barbier nicht existieren kann. Nehmen wir also an, es existierte eine TM

, die

entscheiden kann. Da die Turing-

Maschinen durch ihre Codewörter beschrieben werden und sich sowohl die als auch die Inputwörter lexikografisch anordnen lassen, ist es mithilfe von möglich, eine Matrix zu erstellen mit den Einträgen

Basierend auf können wir nun eine zweite TM konstruieren, die zu einem Eingabewort zunächst den Eintrag berechnet und dann in eine Endlosschleife übergeht, falls , und anhält, falls . Da auch eine TM ist, muss sie sich irgendwo in der Matrix wiederfinden, sagen wir in Zeile Nr. . Die Frage ist nun: Rasiert sich der Barbier selbst, bzw. wie lautet der Eintrag ? Ist , so heißt dies, dass bei Eingabe von anhält. Aber laut Konstruktion geht in eine Endlosschleife, falls . Ist jedoch , so heißt dies, dass bei Eingabe von nicht anhält. Aber laut Konstruktion hält an, falls . Wir können also keinen Wert zuordnen, was bedeutet, dass in der Matrix nicht vorkommt. Widerspruch! Turing zog aus der Unentscheidbarkeit des Halteproblems die für die Mathematik bedeutsame Konsequenz, dass es nicht möglich ist, mittels eines mechanischen Verfahrens zu entscheiden, ob eine mathematische Aussage beweisbar ist oder nicht. Dazu konstruierte er zu einer Turing-Maschine eine korrespondierende Aussage und zeigte, dass aus der Möglichkeit, die Beweisbarkeit von entscheiden zu können, auch die Möglichkeit folgen würde, entscheiden zu können, ob anhält. Deshalb ist das sogenannte Entscheidungsproblem nicht lösbar (deshalb der etwas sperrige Titel seines Papers). Die Bedeutung der Unentscheidbarkeit des Halteproblems ist aber auch für die heutige Praxis nicht zu unterschätzen. Die Unentscheidbarkeit besagt nämlich, dass es niemals einen Compiler (d .h. eine Turing-Maschine) geben wird, der ein Programm auf semantische Korrektheit prüft, also darauf, ob sich das Programm bei korrekten Eingaben wie beabsichtigt verhält. Diese Prüfung kann laut Halteproblem niemals automatisiert und mit einer Korrektheitsgarantie erfolgen. Es kommt sogar noch schlimmer: Eine Folgerung aus der Unentscheidbarkeit des Halteproblems, der Satz von Rice, besagt, dass es keine automatisierte Prüfung darauf geben kann, ob die von einer Turing-Maschine berechnete Funktion (also der Output eines Programms) eine bestimmte nicht-triviale Eigenschaft besitzt. Dabei heißt nicht-trivial, falls es mindestens eine Funktion gibt, die erfüllt, und mindestens eine andere Funktion, die nicht erfüllt. Man könnte also sagen, nichttriviale Eigenschaften sind solche Eigenschaften, bei denen sich eine Prüfung lohnt.

Was sind das für Funktionen, die von Turing-Maschinen berechnet werden? Weiter oben in diesem Kapitel haben wir Turing-berechenbare Funktionen als Funktionen definiert, für die eine Turing-Maschine existiert, die nach endlich vielen Berechnungsschritten das Inputwort durch den Funktionswert auf dem Ein/Ausgabeband ersetzt. Zu jeder Turing-berechenbaren Funktion gehört also eine Turing-Maschine . Leider gilt das nicht auch umgekehrt, denn manchmal halten die Turing-Maschinen für ein Inputwort nicht an. In diesem Fall können wir dem Inputwert keinen Funktionswert zuordnen. Wir lösen das Problem, indem wir den Funktionsbegriff erweitern und sogenannte partielle Funktionen betrachten, bei denen nicht für jeden Input ein Output definiert ist. Die von einer Turing-Maschine berechnete partielle Funktion besitzt zwar ebenfalls die Form

allerdings kann nicht jedem ein Funktionswert zugeordnet werden. Mithilfe partieller Funktionen können wir den Satz von Rice formulieren:

Satz von Rice sei die Menge der von Turing-Maschinen berechenbaren partiellen Funktionen und eine nicht-triviale Eigenschaft von Funktionen, d. h. eine Teilmenge von mit . Dann ist die Sprache

nicht entscheidbar.

Wichtig ist, sich klar zu machen, dass der Satz von Rice nur Aussagen über Eigenschaften des Outputs von Turing-Maschinen macht, nicht aber über Eigenschaften der TuringMaschinen selbst. Es ist demnach nicht entscheidbar, ob eine TM als Output immer eine gerade Zahl liefert, wohl aber, ob eine TM eine gerade Anzahl von Zuständen besitzt. Zum Beweis des Satzes von Rice benötigen wir eine abgeschwächte Variante des Halteproblems, das Halteproblem auf leerem Band: Es besteht in dem Problem, zu entscheiden, ob eine gegebene Turing-Maschine bei Eingabe des leeren Worts anhält. Obwohl dies als eine einfachere Aufgabe als das allgemeine Halteproblem erscheint, ist auch das Halteproblem auf leerem Band nicht entscheidbar:

Halteproblem auf leerem Band Die Sprache

ist nicht entscheidbar.

Angenommen, es gäbe eine TM , die das Halteproblem auf leerem Band entscheiden kann. Ist nun irgendeine TM und irgendein Inputwort, dann können wir eine TM konstruieren, die bei einem Inputwort das Verhalten von bei Input simuliert. Mit könnten wir also entscheiden, ob bei Eingabe des leeren Worts anhält. Aber verhält sich bei Eingabe des leeren Worts genauso wie bei Eingabe von . Also könnte entscheiden, ob bei Eingabe von anhält - Widerspruch zum allgemeinen Halteproblem! Nun zum eigentlichen Satz von Rice: Gegeben sind also ein Wort , die durch kodierte TM und eine nicht-triviale Eigenschaft . Wir nehmen an, wir könnten entscheiden, ob und konstruieren zunächst eine TM , die niemals, also für kein Inputwort , anhält (überlegen Sie sich selbst eine Übergangsfunktion für ein solches über !). Ohne Beschränkung der Allgemeinheit dürfen wir davon ausgehen, dass die von berechnete, nirgends definierte Funktion die Eigenschaft besitzt. Sollte dies nicht der Fall sein, erfüllt auf jeden Fall die gegenteilige Eigenschaft , und ist genau wie nicht-trivial. Da nicht-trivial ist, existiert auf jeden Fall mindestens eine weitere Funktion mit dazugehöriger Turing-Maschine , die die Eigenschaft nicht besitzt. Wir kombinieren und zu einer einzigen TM , die sich bei Eingabe eines Worts folgendermaßen verhält: wird von Hält

mit dem leeren Wort

an, wird danach

mit

als Eingabe simuliert.

als Eingabe simuliert.

Falls auf dem leeren Wort nicht anhält, wird auch nicht anhalten, und zwar für kein Inputwort . Das Verhalten von entspricht dann also dem von , und muss wie die Eigenschaft besitzen. Falls aber anhält, entspricht das Verhalten von dem von , und besitzt die Eigenschaft . Gäbe es also eine TM, die automatisch entscheiden könnte, ob ist, könnte man mit derselben TM auch entscheiden, ob die von

in der Sprache berechnete Funktion

die Eigenschaft besitzt oder nicht. Das ist aber gleichbedeutend damit, zu entscheiden, ob auf dem leeren Wort anhält, was aber unmöglich ist, wie wir gesehen haben. Schlechte Zeiten also für die automatische Software-Verifikation? Dabei muss man im Auge behalten, dass der Satz von Rice lediglich aussagt, dass es Programme gibt, die sich einer automatischen Verifikation entziehen. Das heißt aber nicht, dass es nicht automatische Verfahren zur Software-Verifikation geben kann, die für die meisten Programme korrekte Ergebnisse liefern. Beim Beweis des Satzes von Rice bzw. des Halteproblems auf leerem Band haben wir jeweils ein Problem, von dem wir wissen, dass es nicht entscheidbar ist, auf die Entscheidung eines anderen Problems zurückgeführt. Wäre das andere Problem entscheidbar, so wäre damit auch das allgemeine Halteproblem entscheidbar gewesen. So konnten wir zeigen, dass das andere Problem auch nicht entscheidbar sein kann. Diese Technik der Rückführung eines bekannten Problems auf ein anderes, deren Wesen noch unbekannt ist, nennt man Reduktion. Sie wird uns später im dritten Teil dieses Buches über Komplexitätstheorie wiederbegegnen.

Aufgaben zu Turing-Maschinen Als kleine Hilfe, so zur Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wiley-vch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. 1. Zeichnen Sie den Übergangsgraphen einer TM über dem Alphabet die korrekt geklammerte Ausdrücke der Form akzeptiert. 2. Geben sie die Übergangsfunktion einer TM über Zahlen die Funktion berechnet.

,

an, die für binäre

3. Beschreiben Sie informell eine TM, die die Funktion über dem Alphabet berechnet. 4. a. Finden Sie eine TM, die die Sprache über dem unären Alphabet akzeptiert. b. Erweitern Sie die TM so, dass sie die Funktion Zweierpotenzen berechnet.

für

5. Geben Sie eine 3-Band-TM an, die zwei binäre Zahlen und addiert. Gehen Sie davon aus, dass zu Beginn der Berechnung auf Band 1 und auf Band 2 steht,

sodass ihre letzten Bits direkt untereinander stehen. Nutzen Sie Band 3 für die Ergebnisausgabe. Gehen Sie außerdem davon aus, dass die Schreib/Leseköpfe von Band 1 und Band 2 zu Beginn auf den letzten Bits von bzw. stehen und der Schreib-/Lesekopf von Band 3 direkt darunter. 6. Wir betrachten die Sprache Alphabet .

über dem

a. Geben Sie die Übergangsfunktion einer 2-Band-TM an, die b. Zeichnen Sie das Übergangsdiagramm einer 1-Band-TM, die

akzeptiert. akzeptiert.

7. Beschreiben Sie informell die Arbeitsweise einer nichtdeterministischen LBTM, die die Sprache

erkennen kann. 8.

sei eine semi-entscheidbare Sprache. Zeigen Sie, dass dann gilt:

Hinweis 1 Überlegen Sie, warum das -Symbol nicht einfach durch

ersetzt werden kann.

Teil II

Formale Sprachen

IN DIESEM TEIL… werden wir uns formalen Sprachen von einem anderem Blickwinkel her nähern: Im ersten Teil waren formale Sprachen für uns eine vorgegebene Menge von Wörtern, die von einem Automaten erkannt werden sollte, d. h., die Wörter der Sprache sollten von einem Automaten akzeptiert werden (oder auch nicht). Nun werden wir versuchen, die Wörter einer Sprache mit Hilfe eines Regelsatzes aus einem Grundelement aktiv zu erzeugen. Mit diesem Ansatz lassen sich die Struktureigenschaften von formalen Sprachen beschreiben und somit wichtige Klassen formaler Sprachen definieren. Wie sich in diesem Teil zeigen wird, lassen sich diesen Klassen formaler Sprachen genau die Automaten als Akzeptoren zuordnen, die wir im ersten Teil untersucht haben.

Kapitel 5

Grammatiken IN DIESEM KAPITEL betrachten wir formale Regelwerke zur Erzeugung von formalen Sprachen, so genannte Grammatiken werden Grammatiken definiert lernen Sie die Chomsky Hierarchie kennen

Anhand der Eigenschaften, die diese Regelwerke besitzen, lassen sich Grammatiken in verschiedene Klassen einordnen. Diese Klassen bauen aufeinander auf und lassen sich in eine Hierarchie einordnen, die so genannte Chomsky-Hierarchie.

Einführung Wenn Sie schon einmal eine Fremdsprache gelernt haben, dann wissen Sie, dass eine Sprache zum einen aus einem Wörterbuch besteht, das alle Wörter der Sprache und ihre Bedeutung auflistet, und zum anderen aus den Regeln, die Ihnen sagen, auf welche Weise aus den Wörtern korrekte Sätze gebildet werden. Alle Regeln sind in der Grammatik der Sprache zusammengefasst. Wir versuchen uns nun bei der Erzeugung formaler Sprachen an dieses Schema zu halten, müssen uns aber gleich zu Beginn ein wenig umstellen: Bei einer natürlichen Sprache ist der Satz die grundlegende Einheit. Er wird nach den Regeln der Grammatik aus den Wörtern der Sprache gebildet. Nach Kapitel 1 gilt für eine formale Sprache jedoch , d. h., sie besteht aus Wörtern als grundlegender Einheit. Die Wörter sind wiederum aus den Symbolen eines Alphabets zusammengesetzt. Für formale Sprachen sind die Symbole und das Alphabet also das, was die Wörter und das Wörterbuch für eine natürliche Sprache sind. Die Grammatik einer formalen Sprache legt also die Regeln oder Produktionen fest, nach denen aus den Symbolen die Wörter der formalen Sprache gebildet werden. Man sagt auch, erzeugt . Im Vergleich mit der Grammatik natürlicher Sprachen sind die Grammatiken formaler Sprachen von erschütternder Schlichtheit. Aber das macht nichts. Schließlich wollen wir mit unseren Grammatiken keine komplexen Zusammenhänge oder gar Gefühle ausdrücken, sondern lediglich einfache Konstrukte beschreiben, die es uns ermöglichen, uns mit Computern zu verständigen.

Ein erstes Beispiel

Betrachten wir ein erstes kleines Beispiel einer Grammatik, das sich noch eng an der deutschen Sprache orientiert:

Die Terme in spitzen Klammern (die so genannten Variablen) auf der linken Seite der Regeln werden sukzessive durch die Ausdrücke auf der rechten Seite der Regeln ersetzt, bis irgendwann keine Terme in spitzen Klammern mehr vorhanden sind: Damit wird ein Wort der von der Grammatik erzeugten Sprache abgeleitet, wobei der Ableitungsprozess immer mit der Startvariablen beginnt. Hier ein Beispiel einer solchen Ableitung:

Das Symbol wird weiter unten noch genauer erklärt. Im Moment kann es als »wird ersetzt durch« gelesen werden. Wir haben bei dieser Ableitung immer die am weitesten links stehende Variable zuerst ersetzt. Man spricht auch von einer Linksableitung. Grundsätzlich ist die Anwendung der Regeln aber in beliebiger Reihenfolge erlaubt.

Syntaxbäume Der Prozess der Ableitung eines Wortes aus ist durchaus nicht immer eindeutig. Es kann durchaus verschiedene Wege geben, ein Wort abzuleiten. Eine gegebene Ableitung lässt sich durch einen so genannten Syntaxbaum visualisieren. Dabei bilden die Variablen die inneren Knoten und die Terminalsymbole die Blätter des Baums. Die Startvariable ist der Wurzelknoten. Wird eine Produktionsregel auf die Variable angewendet, erzeugt dies Kindknoten zu , in denen sich die Terminalsymbole und Variablen finden, aus denen besteht. Dies wird so lange fortgesetzt, bis nur noch Terminalsymbole als Blätter des Baums vorhanden sind. Durchlaufen der Blätter von links nach rechts ergibt dann das abgeleitete Wort. Abbildung 5.1 zeigt den Syntaxbaum für den obigen Beispielsatz.

Abbildung 5.1: Ein Syntaxbaum

Grammatiken, bei denen die Ableitung eines Wortes immer auf den gleichen Syntaxbaum führt, heißen eindeutig. Unsere Beispiel-Grammatik ist eindeutig. Wir haben in Abbildung 5.1 einen durchaus sinnvollen und grammatikalisch korrekten deutschen Satz aus abgeleitet. Das ist aber keineswegs immer so. Sowohl nicht sinnvolle Sätze wie »der kleine große Hund beißt die große kleine Katze« als auch unkorrekte Sätze wie »die kleine Hund beißt der kleine Katze« sind mit dieser Grammatik ableitbar. Für das erste Problem kann die Grammatik nichts. Gäbe es eine Möglichkeit, mit Hilfe einer Grammatik automatisch lauter semantisch korrekte Sätze abzuleiten, könnte man den dahinter stehenden Algorithmus auf das Problem der automatischen Programmverfikation übertragen und prüfen, ob ein Programm semantisch sinnvollen, d. h. dem Problem und dem Input angemessen Output liefert. Das wäre aber ein Widerspruch zum Satz von Rice und damit letztlich zur Unentscheidbarkeit des Halteproblems. Das zweite Problem ließe sich aber lösen, wenn wir unsere Grammatik ein wenig komplizierter gestalten, indem wir z. B. fordern, dass die Variable nur dann durch »der« ersetzt werden darf, wenn darauf »Hund« folgt, wir also dem Wort »Hund« das Geschlecht »männlich« zuweisen. Die Ersetzung der Variablen ist somit vom Kontext abhängig, in dem sie auftritt. Solche Grammatiken heißen kontextsensitiv und werden in Kapitel 8 behandelt.

Definition einer Grammatik Wir haben oben gesehen, dass eine Grammatik aus Variablen, Symbolen aus einem Alphabet und bestimmten Regeln besteht. Im Kontext einer Grammatik werden die Symbole eines Alphabets auch als Terminalsymbole bezeichnet, da sie durch Anwendung der Regeln nicht mehr verändert werden können. Im obigen Beispiel besteht die linke Seite jeder Regel aus einer einzelnen Variablen. Das muß aber durchaus nicht immer so sein. Um eine maximale Flexibilität zu erreichen, sind

in einer allgemeinen Grammatik beliebige Ausdrücke aus Variablen und Terminalsymbolen auf beiden Seiten der Regeln erlaubt. Regeln können deshalb als Wortpaare mit aufgefaßt werden. Diese Paare werden üblicherweise in der Form geschrieben. Nach diesen Vorüberlegungen sind wir bereit für die allgemeine Definition einer Grammatik: Eine Grammatik einer endlichen Menge

ist ein 4-Tupel bestehend aus: , der Menge der Variablen.

einem Alphabet , dem Terminalalphabet, wobei

.

einer endlichen Menge

, der Menge der Produktionen, wobei . Die linke Seite einer Produktionsregel sollte dabei mindestens eine Variable enthalten. einer Variablen

, der Startvariablen.

Im obigen Beispiel gilt also: , ,

. Die Produktionen der Menge

sind oben bereits aufgeführt.

Die von einer Grammatik erzeugte Sprache Unser Ziel in diesem Abschnitt ist es, die Menge der Wörter, die insgesamt aus der Startvariablen einer Grammatik abgeleitet werden können, zu beschreiben. Dazu formalisieren wir zunächst den Prozess, durch den ein Ausdruck aus Variablen und Terminalsymbolen durch die Anwendung einer Regel in einen anderen Ausdruck überführt wird: Ist

eine Grammatik, dann definieren wir für zwei Wörter eine Relation (sprich: kann aus abgeleitet werden)

durch:

Das bedeutet, der Ausdruck kann aus abgeleitet werden, wenn und gleich sind bis auf zwei unterschiedliche Bestandteile und , für die es eine Regel gibt. Im obigen Beispiel gilt etwa

Beachten Sie, dass für und

auch das leere Wort verwendet werden darf.

Durch mehrfache Anwendung der Relation erzeugte Sprache exakt zu definieren:

sind wir nun in der Lage, die von

sei eine Grammatik.

Die von

erzeugte Sprache ist

wobei

eine mehrfache Anwendung von

bedeutet.

Die von erzeugte Sprache ist also die Menge aller Wörter , die aus der Startvariablen in endlich vielen Schritten abgeleitet werden können. Hierzu ein erstes Beispiel: Wir betrachten die Grammatik

, wobei

Das Wort kann aus abgeleitet werden: . Weitere Wörter aus lassen sich nur durch abwechselnde, -malige Anwendung der Regeln und und abschließende Anwendung von ableiten:

Die von

erzeugte Sprache ist also

.

Wie man -Regeln loswird Unsere Definition einer Grammatik erlaubt auch Regeln der Form , bei denen eine Variable direkt durch das leere Wort ersetzt wird. Solche Regeln werden auch als -Regeln bezeichnet. In den meisten Anwendungsfällen sind solche Regeln aber unerwünscht. Zum Glück lassen sich -Regeln (mit Ausnahme der Regel ) duch andere Produktionsregeln ersetzen, ohne dass sich die von erzeugte Sprache ändert. Die Grundidee dazu ist sehr einfach: Angenommen, wir benutzen eine Regel , bei der die Variable auf der rechten Seite vorkommt. Damit erhalten wir einen Ausdruck, der enthält. Wenden wir darauf die -Regel an, erhalten wir einen Ausdruck, der enthält:

Dies hätten wir auch in einem Schritt mit einer Regel erreichen können. Will man also auf die Regel verzichten, muss man nur zusätzliche Regeln der Form aufstellen für jede Regel , bei denen die Variable auf der rechten Seite einfach vorkommt. Kommt

in einer Regel

mehrfach auf, enthält das Wort also mehrere

,

brauchen wir zusätzliche Regeln für jede Möglichkeit, das Beispielsweise erhalten wir statt

durch zu ersetzen.

die Regeln

Eine weitere kleine Komplikation bei der Entfernung von -Regeln kann sich ergeben, falls die Grammatik so genannte Umbenennungsregeln der Form enthält (s. auch Kapitel 7). Will man nun eine -Regel nach dem obigen Schema entfernen, erhält man als neue Regel , also eine weitere -Regel. Diese kann aber nach dem gleichen Schema wie aus der Grammatik entfernt werden. Wir betrachten die Grammatik

mit und

Um die Regel entfernen zu können, suchen wir die Regeln, bei denen auf der rechten Seite vorkommt, also und fügen ihnen die Regeln hinzu, die man erhält, wenn man in ihnen auf der rechten Seite streicht. Insgesamt erhalten wir die äquivalente Grammatik mit

Die von

und

erzeugte Sprache ist

denn die ersten beiden Regeln erlauben es, einen beliebigen String zu Beginn des abzuleitenden Wortes zu erzeugen. Die drei folgenden Regeln erzeugen drei aufeinanderfolgende Nullen in der Mitte des Strings, und die Regeln sorgen schließlich dafür, dass auch am Ende ein beliebiger String stehen kann.

Das Wortproblem Ist eine Grammatik einigermaßen einfach gebaut, lässt sich die von ihr erzeugte Sprache anhand der Produktionsregeln vollständig bestimmen. Etwas einfacher, aber eng verwandt mit der Frage, welche Sprache von einer Grammatik erzeugt wird, ist das so genannte Wortproblem für : Gegeben sei eine Grammatik Das Wortproblem für

und ein Wort

besteht darin, zu entscheiden, ob

. oder nicht.

Selbst wenn man keinen geschlossenen Ausdruck für angeben kann, ist es dennoch in vielen Fällen möglich, das Wortproblem algorithmisch zu entscheiden: Blättern Sie zurück zur Frage der Berechenbarkeit der charakteristischen Funktion einer Sprache , die wir in Kapitel 4 diskutiert haben. Mehr zu dieser Frage in den folgenden Kapiteln, wenn wir die Eigenschaften verschiedener Typen von Grammatiken genauer unter die Lupe nehmen. Dort werden wir sehen, dass das Wortproblem für häufig dadurch entschieden werden kann, dass man einen zu äquivalenten Automaten konstruiert und prüft, ob das Wort von akzeptiert wird.

Chomsky-Hierarchie In diesem Abschnitt klassifizieren wir die Grammatiken anhand der Struktur ihrer Produktionsregeln. Die folgende Typen-Hierarchie für Grammatiken wurde 1957 von dem 1928 geborenen amerikanischen Linguisten Noam Chomsky formuliert. Ganz ähnlich wie Alan Turing, der den Prozess, mit dem ein Mensch einen Algorithmus bearbeitet, formalisiert hat, wollte Chomsky den Prozess, mit dem ein Mensch Sprache versteht und korrekt gebildete Sätze erkennt, formalisieren. Er nahm an, dass alle menschlichen Sprachen eine gemeinsame innere Struktur besitzen, die in den unterschiedlichen Muttersprachen unterschiedlich ausgeformt wird. Die Chomsky-Hierarchie resultierte aus dem Versuch, diese angenommene innere Struktur von menschlichen Sprachen zu formalisieren. Leider erweisen sich die Grammatiken menschlicher Sprachen als zu komplex, um vollständig durch die Modelle der Chomsky-Hierarchie abgebildet zu werden. Für die Beschreibung einfacher gebauter Sprachen wie z. B. Programmiersprachen ist die Chomsky-Hierarchie jedoch bestens geeignet.



sei eine Grammatik. Dann gelten folgende Bezeichnungen: Jede Grammatik ist vom Typ 0. Man spricht auch von Phasen-StrukturGrammatiken. Eine Grammatik ist vom Typ 1 oder kontextsensitiv, falls für alle Regeln gilt:

Auch die Regel ist erlaubt, falls rechten Seite erscheint.

in keiner anderen Regel auf der

Eine Typ-1-Grammatik ist vom Typ 2 oder kontextfrei, falls für alle Regeln gilt: Eine Typ-2-Grammatik ist vom Typ 3 oder regulär, falls für alle Regeln (mit Ausnahme von ) gilt: Eine Sprache ist vom Typ Grammatik vom Typ gibt mit

, falls es eine .

Bei der allgemeinsten Form einer Grammatik, den Typ-0-Grammatiken, unterliegt die Form ihrer Regeln also keinerlei Einschränkungen. Bei Typ-1-Grammatiken sollte (mit Ausnahme der Regel ) die Länge der Ausdrücke auf der rechten Seite jeder Regel größer als oder gleich der Länge der Ausdrücke auf der linken Seite, mit anderen Worten: Durch die Anwendung einer Regel wird die Länge des Ausdrucks in keinem Fall kleiner. An die linken Seiten der Regeln gibt es keine Einschränkungen. Diese Grammatiken heißen kontextsensitiv, weil es sein kann, dass für eine Variable abhängig von den sie umgebenden Ausdrücken unterschiedliche Ersetzungsregeln gelten können. Die Ausnahmeregel wird deshalb benötigt, weil sich ansonsten das leere Wort aus einer Typ-0-Grammatik nicht ableiten ließe. Bei Typ-2-Grammatiken dürfen zusätzlich nur einzelne Variablen auf der linken Seite jeder Regel stehen. Diese Grammatiken heißen kontextfrei, weil die Variablen dadurch unabhängig von der Umgebung, in der sie auftauchen, ersetzt werden dürfen. Unsere Hund-Katze Beispielgrammatik aus dem letzten Abschnitt ist kontextfrei. Bei Typ-3-Grammatiken werden zusätzlich auch Anforderungen an die rechte Seite jeder Regel gestellt: Diese dürfen nur entweder aus einzelnen Terminalsymbolen oder aus Terminalsymbolen gefolgt von einer Variablen bestehen. Die Grammatik mit

ist zum Beispiel vom Typ 3. Da Typ-3-Sprachen immer auch von einem DFA erkannt werden können, wie im nächsten Kapitel deutlich werden wird, heißen Typ-3-Grammatiken und die von ihnen erzeugten Sprachen auch regulär. Nach ihrer Definition gelten für die von den jeweiligen Grammatiken erzeugten Sprachen die Beziehungen

Die kommenden Kapitel werden zeigen, dass es sich dabei um echte TeilmengenBeziehungen handelt, d. h., wir werden jeweils Sprachen vom Typ kennenlernen, die nicht vom Typ sind. Die Chomsky-Hierarchie kann also wie in Abbildung 5.2 visualisiert werden.

Abbildung 5.2: Die Chomsky-Hierarchie

Es stellt sich nun die Frage, ob in dieser Hierarchie alle formalen Sprache enthalten sind, d. h., ob jede formale Sprache durch eine Grammatik aus der Chomsky-Hierarchie erzeugt wird. Diese Frage müssen wir mit Nein beantworten: Da jede Grammatik durch endlich viele Symbole beschrieben werden kann (z. B. durch einen endlichen Binärcode), kann man jeder Grammatik eine eindeutige natürliche Zahl zuweisen. Somit ist die Menge der Typ-0-Grammatiken abzählbar unendlich (d.h. so mächtig wie ).

Auf der anderen Seite ist jede Teilmenge von gleichzeitig eine formale Sprache, d. h., es existieren so viele formale Sprachen, wie es Teilmengen von gibt. Da aber selbst schon abzählbar unendlich ist, existieren überabzählbar viele Teilmengen von und damit auch überabzählbar viele Sprachen. Es gibt also viel mehr Sprachen, als durch Grammatiken beschrieben werden können!

Aufgaben zu Grammatiken Als kleine Hilfe, so zur Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wiley-vch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. 1. Von welchem Typ sind die folgenden Grammatiken? 2. Entfernen Sie die

-Regeln aus der folgenden Grammatik:

mit

. 3. Betrachten Sie die Grammatik

mit .

a. Von welchem Typ ist

?

b. Leiten Sie das Wort c. Geben Sie

ab und geben Sie den Syntaxbaum an.

an.

4. Betrachten Sie die Grammatik

mit .

a. Von welchem Typ ist

?

b. Geben Sie alle Syntaxbäume für das Wort

an.

5. Geben Sie eine Grammatik an, die alle ungeraden Binärzahlen erzeugt.

Kapitel 6

Reguläre (Typ-3-)Sprachen IN DIESEM KAPITEL beschäftigen wir uns mit dem untersten Level der Chomsky-Hierarchie, den Typ-3Sprachen bzw. den reguläre Sprachen. lernen Sie das Wortproblem von Typ-3-Sprachen kennen

Wir werden sehen, dass die regulären Sprachen ihren Namen zu Recht tragen, da sie genau den Sprachen entsprechen, die von DFAs akzeptiert werden.

Beispiele für Typ-3-Sprachen Typ-3-Sprachen werden von Typ-3-Grammatiken der Chomsky-Hierarchie erzeugt. Zur Erinnerung: Die Produktionsregeln dieser Grammatiken besitzen eine genau vorgegebene Struktur: sollte eine einzelne Variable sein, und ist entweder ein Terminalysmbol oder ein Terminalsymbol gefolgt von einer Variablen. Zusätzlich ist auch als Regel erlaubt, um auch das leere Wort ableiten zu können. In Kapitel 5 haben wir bereits zwei Beispiele für Grammatiken dieses Typs kennengelernt: Zum einen die Grammatik mit

zum anderen die Grammatik

mit und

Die von

und die von

erzeugte Sprache ist

erzeugte Sprache ist

Hier ein noch weiteres Beispiel einer Typ 3 - Sprache:

mit

Über die ersten beiden Regeln lassen sich offenbar Ausdrücke der From mit beliebigem ableiten. Möchte man nun ein Wort aus Terminalsymbolen ableiten, lassen einem die Regeln keine andere Möglichkeit, als zwei Nullen am Ende des Worts zu erzeugen. Die von erzeugte Sprache ist also

Diese Sprache ist uns aus Kapitel 1 wohlbekannt: Sie gehörte zu den ersten Beispielen für Sprachen, die mit einem DFA erkannt werden können.

Das Wortproblem für Typ-3-Sprachen Alle unsere Beispiele für Typ-3-Sprachen haben uns Sprachen geliefert, für die auch ein DFA existiert, der sie erkennen kann. Tatsächlich gibt es einen sehr engen Zusammenhang zwischen Typ-3-Grammatiken und DFAs: Zu jedem DFA kann eine äquivalente Typ-3Grammatik konstruiert werden, und zu jeder Typ-3-Grammatik existiert ein äquivalenter NFA.

Äquivalenz von Typ-3-Sprachen und DFAs Die regulären Sprachen sind genau die von deterministischen endlichen Automaten (DFAs) akzeptierten Sprachen.

Der Beweis dieser Aussage ist konstruktiv, denn er gibt uns ein Verfahren an die Hand, mit dem aus einer Typ-3-Grammatik ein passender äquivalenter DFA erzeugt werden kann, und umgekehrt aus einem DFA eine äquivalente Typ-3-Grammatik. Wir beginnen mit der Konstruktion einer Typ-3-Grammatik aus einem DFA. Sei also ein DFA. Wir stellen uns vor, dass bei einem Zustandswechsel das Eingabesymbol gewissermaßen aus dem Zustand erzeugt wird. Das legt nahe, die Zustände des Automaten mit den Variablen von zu identifizieren: . Für die Startvariable gilt dann offenbar . Den Zustandswechsel übersetzen wir in eine Typ-3-Produktionsregel:

So weit, so gut. Aber diese Regeln erlauben es noch nicht, einen String aus Terminalsymbolen abzuleiten. Dazu brauchen wir noch zusätzlich die Information, ob ein Zustand ein Endzustand ist oder nicht. Wird nämlich über ein Endzustand erreicht, so wird das entsprechende Wort akzeptiert, ohne dass noch

weitere Symbole hinzukommen müssen. Deswegen fügen wir weitere Produktionsregeln hinzu, die ohne weitere Variablen auf der rechten Seite auskommen:

Schließlich müssen wir noch den Fall betrachten, dass der Startzustand ist. In diesem Fall gehört das leere Wort zur von akzeptierten Sprache, und wir brauchen deshalb in die Regel . Die Konstruktion von ist damit komplett (überzeugen Sie sich davon, dass tatsächlich regulär ist!). Wir müssen nun noch zeigen, dass die von erzeugte Sprache gleich der von M akzeptierten Sprache ist: Sei also ein Wort aus . Dann gilt:

Sei nun auf der anderen Seite eine Typ-3-Grammatik. Wir möchten einen äquivalenten DFA konstruieren. Es gibt keinen Grund, von unserem grundlegenden Schema abzuweichen, deshalb identifizieren wir zunächst wieder die Zustände des Automaten mit den Variablen, setzen und

Aber Halt! Funktioniert das überhaupt immer? Schließlich könnte es unter den Produktionen von mehrere Regeln mit der Variablen auf der linken Seite und dem Symbol auf der rechten Seite geben, also z. B. die Regeln . In diesem Fall hätte man zwei mögliche Zustandsübergänge, nämlich oder . Aber genau das ist ja das Verhalten, durch das ein NFA charakterisiert wird. In Wirklichkeit konstruieren wir also keinen DFA, sondern einen NFA: oder allgemeiner

Dass wir hier einen NFA und keinen DFA konstruieren ist kein Problem, weil wir ja aus Kapitel 2 wissen, dass zu jedem NFA ein äquivalenter DFA konstruiert werden kann. Die

Tatsache, dass man sich beim Ableiten eines Wortes manchmal zwischen verschiedenden passenden Produktionsregeln entscheiden kann, spiegelt sich in der Wahlfreiheit des NFA zwischen verschiedenen Übergängen wider. Trotzdem sind wir noch nicht ganz fertig: Wie sieht es mit Produktionsregeln der Form aus? Diese Regeln sollen den Ableitungsprozess durch das Ableiten eines einzelnen Symbols abschließen. Deswegen liegt es nahe, diese Regeln mit einem Übergang in den Endzustand zu identifizieren: wobei ein zusätzlicher Zustand ist, d. h. . Somit ist auch die Menge der Endzustände von definiert und die Konstruktion des NFA komplett. Wir müssen nun wieder überprüfen, dass die von akzeptierte Sprache gleich der von erzeugten Sprache ist:

Damit ist es also gerechtfertigt, reguläre Sprachen und Typ-3-Sprachen gleichzusetzen. Insbesonderen kann das Wortproblem für Typ-3-Sprachen entschieden werden, indem man zunächst den zu einer Typ-3-Grammatik äquivalenten DFA erzeugt (dies kann allerdings recht aufwendig sein: Hat Variablen, dann besitzt der äquivalente NFA Zustände, und nach Kapitel 2 kann der dazu äquivalente DFA sogar Zustände besitzen). Dann prüft man, ob das Wort akzeptiert. Da der DFA genau so viele Arbeitsschritte durchführt, wie das Wort lang ist, sagt man, das Wortproblem ist in linearer Zeit lösbar. Genauer gesagt: Die Anzahl der Arbeitsschritte hängt linear von der Länge des Wortes ab (in diesem Fall ist sie sogar genau gleich der Wortlänge). Auch alle anderen Resultate, die wir in den Kapiteln 1 und 2 mit Hilfe endlicher Automaten über reguläre Sprachen gewonnen haben, insbesondere die Abschlusseigenschaften, gelten für Typ-3-Sprachen.

Wir betrachten die reguläre Grammatik und

mit

Gehört das Wort zu ? Wir konstruieren einen äquivalenten NFA mit der Zustandsmenge . Gemäß der allgemeinen Konstruktionsvorschrift lauten die Zustandsübergänge von

Der Übergangsgraph von

:

sieht also so aus:

Aus Abbildung 6.1 lässt sich leicht ablesen, dass nicht akzeptiert wird. Also ist . Tatsächlich zeigt Abbildung 6.1, dass

Abbildung 6.1: Ein zu

gilt.

äquivalenter NFA

Aufgaben zu Typ-3-Sprachen Als kleine Hilfe, so zur Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wiley-vch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. 1. Finden Sie eine äquivalente Typ 3 -Grammatik zu diesem DFA:

2. Finden Sie einen äquivalenten NFA zu der Grammatik und

mit

Kapitel 7

Kontextfreie (Typ-2-)Sprachen IN DIESEM KAPITEL betrachten wir die kontextfreien, d. h. Typ-2-Sprachen der Chomsky-Hierarchie stelle ich Ihnen die Backus-Naur-Form und die Chomsky Normalform vor zeige ich die Grenzen und das Wortproblem kontextfreier Sprachen auf

Typ-2-Sprachen sind besonders wichtig für die Beschreibung von Programmiersprachen. Wir werden sehen, dass sie eine enge Verbindung zu Kellerautomaten besitzen.

Erste Beispiele Die Typ-2-Sprachen der Chomsky-Hierarchie sind die Sprachen, die von Grammatiken mit einer einzelnen Variablen auf der linken Seite jeder Regel erzeugt werden. Zudem sollte auf der rechten Seite der Regeln nicht das leere Wort stehen (mit Ausnahme der Regel ). Wir beginnen mit einem Beispiel, das eine vertraute Sprache erzeugt, die eine Teilmenge praktisch aller höheren Programmiersprachen darstellt: Wir betrachten die kontextfreie Grammatik ,

mit und

, und stehen hier für Ausdruck, Term und Faktor. Ein arithmetischer Ausdruck ist eine Summe von Termen, und ein Term besteht aus einem Produkt von Faktoren. Tatsächlich erzeugt diese Grammatik alle korrekt geklammerten arithmetischen Ausdrücke, die enthalten. Leiten wir z. B. den Ausdruck ab:

Das folgende Beispiel zeigt, dass die regulären Sprachen eine echte Teilmenge der kontextfreien Sprachen bilden.

Wir betrachten die Grammatik

, wobei

Die von erzeugte Sprache ist man durch vollständige Induktion über

. Dies kann beweisen:

Wegen ist das leere Wort ableitbar, und der Induktionsanfang bei ist gemacht. Nehmen wir nun als Induktionsvoraussetzung an, dass alle Wörter der Form für ein abgeleitet werden können. Dann müssen wir zeigen, dass auch das Wort abgeleitet werden kann: Da nach Voraussetzung ableitbar sein. Damit gilt aber:

gilt, muß auch der Ausdruck

Damit wissen wir, dass alle Wörter aus abgeleitet werden können. Tatsächlich sind aber auch keine anderen Wörter ableitbar, da die einzige Möglichkeit, Wörter abzuleiten, darin besteht, abwechselnd die Regeln und anzuwenden: Also ist

.

Dieses Beispiel ist deshalb so wichtig, weil wir wissen, dass die Sprache nicht durch einen NFA erkannt werden kann, also auch nicht von einer regulären Grammatik erzeugt werden kann. Sie bildet damit ein Beispiel einer Typ-2-Sprache, die keine Typ-3Sprache ist.

Backus-Naur-Form (BNF) Gibt es in einer kontextfreien Grammatik mehrere alternative Regeln

mit der gleichen linken Seite , kann man diese Regeln im Rahmen der Backus-Naur-Form (BNF) in dieser Weise zusammenfassen:

Alternativen werden in der BNF also, wie schon bei den regulären Ausdrücken in Kapitel 2 eingeführt, durch einen senkrechten Strich dargestellt.

Erweiterte Backus-Naur-Form (EBNF) Haben die Alternativen in der BNF eine spezielle Form, kann man mit den abkürzenden

Schreibweisen der Regeln noch einen Schritt weiter gehen: Kann ein Bestandteil auf der rechten Seite entweder fehlen oder genau einmal vorhanden sein (so genannte Option), schreibt man anstelle von

kürzer

Die folgende Grammatik , mit

erzeugt die Palindrome über

:

Die BNF der Regeln lautet somit

In der EBNF lassen sich die Regeln bzw. noch weiter zusammenfassen, da hier ein optionaler Bestandteil der rechten Seiten ist:

Auch bei der Darstellung so genannter optionaler Wiederholungen, die auftreten, falls ein Bestandteil auf der rechten Seite entweder fehlen oder mehrfach vorhanden sein kann, kann die Darstellung mit Hilfe der übliche Typ 2-Regeln etwas schwerfällig sein. Eine optionale Wiederholung tritt z. B. aufgrund dieser Regeln

bzw. dieser Regeln auf:

Der optional wiederholte Bestandteil Klammern geschrieben:

Die folgende Grammatik , wobei

wird dann in der EBNF in geschweiften

über beliebig:

erzeugt die Strings der Form

, wobei Die BNF der Regeln lautet somit

Sowohl als auch sind somit optional wiederholbare Bestandteile, so dass wir in der EBNF schreiben können:

und schließlich sogar

wodurch die von

erzeugte Sprache unmittelbar klar wird.

Chomsky-Normalform Bevor wir uns die Struktur kontextfreier Sprachen genauer ansehen, führen wir noch eine wichtige Vereinfachung der Produktionsregeln durch. Alle Produktionsregeln von kontextfreien Sprachen (mit Ausnahme der Regel ) können nämlich so genormt werden, dass auf der rechten Seite jeder Regel entweder ein Paar von Variablen oder ein einzelnes Terminalsymbol steht. Eine kontextfreie Grammatik ist in Chomsky-Normalform, falls alle Produktionsregeln eine der drei folgenden Formen haben: wobei

und

beide nicht die Startvariable

sind. mit , falls

und

.

die Startvariable ist.

Konstruktion der Chomsky-Normalform Jede kontextfreie Grammatik

kann in Chomsky-Normalform überführt werden.

Um zu vermeiden, dass die Startvariable auf der rechten Seite der Produktionsregeln vorkommen kann, führen wir eine zusätzliche Variable ein und die neue Produktionsregel

Erklären wir nun zur neuen Startvariable von , wird die von erzeugte Sprache durch die neue Regel nicht verändert. Allerdings ist eine innerhalb der

Chomsky-Normalform nicht erlaubte Regel und muss noch durch andere Regeln ersetzt werden. Geht man davon aus, dass -Regeln bereits mit dem Verfahren aus Kapitel 5 aus entfernt worden sind, müssen wir jetzt noch zwei Typen von Regeln betrachten, die nicht in der Chomsky-Normalform auftauchen sollten: Umbennenungen der Form und lange Regeln der Form mit . Umbenennungen können wie werden: Offenbar ist zu den Regeln

-Regeln durch Abkürzungsregeln ersetzt

die Regel äquivalent. Deshalb fügt man für jede Regel , in der auf der linken Seite vorkommt, eine Regel hinzu. Ähnlich wie bei den Regeln kann es auch bei Umbenennungen zu Zyklen der Form kommen. Offenbar sind in so einem Fall alle Variablen im Zyklus gleichwertig und können überall, wo sie vorkommen, durch eine einzige neue Variable ersetzt werden. Danach können die dabei entstandenen redundanten Regeln entfernt werden. Die Idee zur Entfernung langer Regeln besteht darin, dass man die langen rechten Seiten sukzessive eine Folge von Regeln mit der erlaubten Länge ersetzt: So kann die Regel durch ersetzt werden. Hierbei haben wir temporäre Variablen benutzt, die in keiner anderen Regel vorkommen, um Seiteneffekte auszuschließen. Enthält die rechte Seite einer langen Regel ein Terminalsymbol , so kann auch diese Situation durch eine temporäre Variable mit einer zusätzlichen Regel, die durch ersetzt, geklärt werden: Wir ersetzen z. B. durch und danach die lange Regel nach obigem Muster durch . Wir bringen die Grammatik

mit

und

in Chomsky-Normalform. Dazu führen wir zunächst die neue Startvariable und die neue Produktionsregel

Da nun

nicht mehr die Startvariable ist, müssen wir die Regel

ein

ersetzen:

Nun ersetzen wir die Umbenennungsregel

:

Nun zu den Regeln, die sowohl Terminalsymbole als auch Variablen auf der rechten Seite enthalten: Beispielweise wird ersetzt durch die Regeln , und die Regel wird ersetzt durch . Die Produktionsregeln haben jetzt dieses Aussehen:

Schließlich müssen wir noch die langen Regeln ersetzen: . wird zu , und wird zu . Die Produktionsregeln von

wird zu

lauten damit in Chomsky-Normalform:

Nach der Transformation in Chomsky-Normalform haben wir eine sehr gute Vorstellung

davon, wie die rechten Seiten der Regeln einer kontextfreien Grammatik aussehen. Dieses Wissen werden wir in den folgenden Abschnitten nutzen, um weitere Aussagen über die Struktur kontextfreier Sprachen zu erhalten.

Die Grenzen kontextfreier Sprachen Wenn ein sehr langes Wort aus einer kontextfreien Grammatik abgeleitet wird, so muss beim Ableitungsprozess eine Variable (d. h. eine Regel mit auf der linken Seite) mehrfach genutzt werden,. Was genau bedeutet sehr lang? Nehmen wir an, ist in Chomsky-Normalform und besitzt Variablen. Dann ist der Ableitungsbaum von mit der Startvariablen an der Wurzel ein Binärbaum, d. h,. alle Knoten, die keine Blätter sind, haben entweder einen oder zwei Kindknoten. Genauer gesagt, beschert jede Regelanwendung der Form dem Knoten zwei Kindknoten und , und Regeln der Form führt zu einem Kindknoten von . ist gleichzeitig ein Blatt des Syntaxbaums. setzt sich aus allen Blättern des Syntaxbaums zusammen. Enthält nun oder mehr Zeichen, dann muss der Syntaxbaum von eine Höhe von mindestens besitzen (s. Kapitel 14): Zwar besitzt ein vollständiger Binärbaum schon bei Höhe die erforderlichen Blätter, aber wir müssen unserem Syntaxbaum ja noch eine zusätzliche Ebene für die Ableitung der Terminalsymbole aus den Variablen spendieren. Das bedeutet aber, dass es mindestens ein Blatt des Syntaxbaumes von , also ein Symbol in geben muss, dessen Weg zum Wurzelknoten die Länge hat. Deshalb muss es auf diesem Weg mindestens eine Variable geben, die mehrfach vorkommt. Die Grammatik

mit

und

besitzt 3 Variablen und ist in Chomsky-Normalform. Der Syntaxbaum von hat dieses Aussehen: Fasst man nun das höher im Baum gelegene als Wurzel eines eigenen Teilbaums auf, dann muss sich aus ein Ausdruck ableiten lassen, der selbst ein enthält, denn sonst würde kein zweites Mal auf dem Weg vom Blatt zur Wurzel vorkommen. Also gilt

Im Beispiel oben gilt etwa

, wobei

Ist also ein langes Wort mit , dann muss die Form haben, wobei ein Wort ist, das sich aus der mehrfach vorkommenden Variablen ableiten lässt:

.

Der Teil kann in dieser Ableitung aber weggelassen oder auch wiederholt werden: Jede dieser Variante liefert ein Wort aus . Insgesamt gilt also:

Auch kontextfreie Sprachen enthalten also pumpbare Bestandteile und

.

und können nicht beide leer sein, denn in der Ableitung muß als Erstes eine Regel der Form angewandt worden sein:

Da es in der Chomsky-Normalform als einzige -Regel erlaubt ist und nicht auf der rechten Seite der Regeln erlaubt ist, muss zumindest einer der beiden Teile und aus oder abgeleitet worden sein und kann damit nicht leer sein. Zu der Ableitung gehört auch ein Ableitungsbaum mit als Wurzel. Die Blätter dieses Baums werden von den Symbolen von gebildet. Der Weg von jedem Blatt des Baums bis zur Wurzel kann maximal jede Variable von einmal enthalten, mit Ausnahme von , das zweimal vorkommt. Die maximale Weglänge im Ableitungsbaum ist also , was bedeutet, dass es maximal Blätter des Ableitungsbaums geben kann (beachten Sie, dass der Ableitungsbaum ein vollständiger Binärbaum der Höhe ist, wenn man die unterste Ebene der Terminalsymbole entfernt, s. auch der Baum im Beispiel oben.) Also muss gelten . Fassen wir zusammen:

Pumping Lemma für kontextfreie Sprachen Für jede kontextfreie Sprache existiert eine natürliche Zahl , so dass jedes mit der Form dargestellt werden kann, wobei die folgenden drei Bedingungen gelten: 1. 2.

für alle

in

.

.

3.

Wir schauen uns zunächst an, wie die Wörter einer kontextfreien Sprache das Lemma erfüllen. Die Sprache

ist kontextfrei, wie wir oben

gesehen haben. Wählen wir als Mindest-Wortlänge, dann muss für jedes Wort mit das Pumping Lemma gelten. Die pumpbaren Bestandteile und befinden sich am Beginn und am Ende des Worts. Werden diese in gleicher Weise gepumpt, ändert sich nichts am Gleichgewicht der und im Wort. Ist konkret , dann wählen wir als die beiden mittleren Symbole, also . Die pumpbaren Teile sind die Symbole, die sich links bzw. rechts von befinden, also

Die beiden äußeren Bestandteile

Im Fall

wären und

und

und

schließlich bilden den Rest des Wortes:

das leere Wort. Für alle . Schließlich gilt auch

gilt dann

Wie beim Pumping Lemma für reguläre Sprachen in Kapitel 1 besteht der Hauptnutzen des Lemma darin, zeigen zu können, dass eine Sprache nicht kontextfrei ist. Dazu formulieren wir wieder die Kontraposition des Lemma:

Kontraposition des Pumping Lemma für kontextfreie Sprachen Existiert zu einer Sprache keine natürliche Zahl , so dass jedes mit dargestellt werden kann, wobei die folgenden drei Bedingungen gelten: 1.

in der Form

für alle

2. 3. dann ist

, nicht kontextfrei.

Um also zu zeigen, dass eine Sprache nicht kontextfrei ist, genügt es, zu jeder Zahl ein Wort mit angeben zu können, das die drei Bedingungen des Pumping Lemma nicht erfüllt. Wir betrachten die Sprache

über dem Alphabet

.

Wir nehmen an, ist kontextfrei. Dann gibt es eine Zahl , so dass alle Wörter , die länger sind als , die drei Bedingungen aus dem Pumping Lemma erfüllen. Speziell betrachten wir das Wort mit . Die pumpbaren Bestandteile und in bestehen entweder aus einer Art Symbol, also z .B. , oder aus verschiedenenen Symbolen. Im ersten Fall zerstört das Wiederholen von und das Gleichgewicht der und und für alle . Im zweiten Fall, also z. B. wenn , wird durch das Wiederholen von die Zahl der Übergänge zwischen Teilwörtern, die nur aus und bestehen, erhöht. In allen Wörtern gibt es aber nur genau zwei solche Übergänge, bei denen die Symbole von nach bzw. von nach wechseln. Also gilt wieder für alle , und es kann kein mit den geforderten Eigenschaften geben. ist also nicht kontextfrei. Wir betrachten die Sprache

über dem Alphabet

.

Ist die Mindestwortlänge aus dem Pumping Lemma, dann betrachten wir speziell das Wort , das sich laut Pumping Lemma in der Form mit pumpbaren Bestandteilen und darstellen lässt. Dann können wir drei Fälle unterscheiden: 1.

und liegen in der linken Worthälfte: führt also zu dem Wort Lemma und nicht beide null sein können.

2.

und liegen in der rechten Worthälfte: Auch dann gilt Fall lässt sich analog zum ersten Fall behandeln.

3.

. Weglassen von und , da nach dem Pumping und der

und

erstrecken sich über beide Worthälften. Dann muß wegen gelten , wobei . Weglassen von und führt in diesem Fall zu dem Wort .

In allen drei Fällen ist es also nicht möglich, aus herauszufallen. Widerspruch!

und

aus

zu entfernen, ohne

Ein äquivalentes Maschinenmodell Um das Wortproblem für kontextfreie Sprachen zu lösen, liegt es nahe, zunächst wie bei den Typ-3-Sprachen in Kapitel 6 nach einem äquivalenten deterministischen Maschinenmodell Ausschau zu halten. Wir haben weiter oben die Sprache als kontextfrei (aber nicht regulär) erkannt und wissen aus Kapitel 3, dass diese Sprache von einem deterministischen PDA erkannt werden kann. DPDAs erscheinen also als heiße Kandidaten, obwohl kontextfreie Grammatiken und DPDAs als Berechnungsmodelle auf den ersten Blick komplett unterschiedlich erscheinen. Tatsächlich sind kontextfreie Sprachen aber genau die von nichtdeterministischen PDAs erkannten Sprachen. Der Nichtdeterminismus wird benötigt, um die Wahlfreiheit zwischen mehreren passenden Regeln, die man bei der Erzeugung eines Wortes mit Hilfe einer kontextfreien Grammatik besitzt, auch im Automatenmodell nachzubilden.

Kontextfreie Sprachen und NPDAs sind äquivalent. Die kontextfreien Sprachen sind genau die von nichtdeterministischen Kellerautomaten (NPDAs) akzeptierten Sprachen.

Ich möchte Ihnen die wesentlichen Ideen zum Beweis der Äquivalenz von NPDAs und kontextfreien Grammatiken nicht vorenthalten, ohne dabei aber einen vollständigen Beweis zu führen. Beginnen wir mit der Aufgabe, einen zu einer Typ-2-Grammatik äquivalenten NPDA zu finden. Wenn wir davon ausgehen, dass in Chomsky-Normalform ist, so wird der Syntaxbaum zur Ableitung eines Wortes immer so ähnlich aussehen wie in Abbildung 7.1. Wir simulieren den Aufbau des Syntaxbaums, indem wir die Variablen des Baums in den Kellerspeicher schreiben, ohne dabei Zeichen vom Eingabeband zu lesen: Als Erstes setzen wir

Abbildung 7.1: Syntaxbaum für . Der Weg von jedem der Blätter zur Wurzel enthält eine mehrfach vorkommende Variable. Die unterste Ebene enthält die Terminalsymbole. Entfernt man Sie, erhält man einen vollständigen Binärbaum der Höhe 3.

und schreiben so die Startvariable in den Keller. Der Baum wird weiter aufgebaut durch Anwendung von Regeln der Form . Für jede solche Regel legen wir einen Übergang

fest, der im Kellerspeicher durch ersetzt (wir konnten nicht einfach schreiben, da es mehrere Regeln der Form und somit auch mehrere Übergänge geben kann. Hier zeigt sich, dass man tatsächlich einen nichtdeterministischen PDA braucht). Auf diese Weise lässt sich der Ableitungsbaum so weit aufbauen, bis die vorletzte (nur aus Variablen bestehende) Ebene im Keller abgelegt ist. Bis jetzt haben wir noch keine Zeichen vom Eingabeband gelesen. Das holen wir nun nach: Für jedes Zeichen auf dem Eingabeband prüfen wir, ob es zu der jeweils obersten im Keller abgelegten Variablen passt, d. h., ob eine Regel der Form existiert. Ist das der Fall, so wird aus dem Speicher gelöscht und das nächste Eingabezeichen betrachtet. Der zu der Regel passende Übergang des NPDA lautet also

Dieser letzte Schritt entspricht dem Aufbau der letzten Ebene des Syntaxbaums, die nur aus Terminalsymbolen besteht. Wir haben es also geschafft, den Syntaxbaum für ein Wort zunächst im Keller bis auf die letzte Ebene abzulegen und dann das Erzeugen des Worts in der letzten Ebene durch Leeren des Kellers zu simulieren.

Nun zur umgekehrten Aufgabe, der Konstruktion einer kontextfreien Grammatik aus einem NPDA. Wir machen zwei vereinfachende Annahmen zu dem NPDA, die aber an der Allgemeinheit der Aussage nichts ändern. Zum einen soll der NPDA durch leeren Keller und durch Endzustände akzeptieren, d. h., ein Wort wird akzeptiert, wenn der Keller leer ist und gleichzeitig ein Endzustand aus einer Menge angenommen wird. Zum anderen soll der NPDA in jedem Schritt genau ein Kellersymbol verarbeiten, d. h. entweder entfernen (Pop) oder auf den Stack legen (Push). Ein akzeptiertes Wort kann nun auf zwei Arten von dem NPDA verarbeitet werden: 1. Der Keller wird durch Push-Operationen der Form

einmalig gefüllt und später durch einen dazu passenden Pop-Übergang der Form

wieder geleert. Das bedeutet, die Symbole und gehören zu , ohne dass wir aber wissen, welche Symbole sich zwischen ihnen befinden. Wir simulieren diese Situation innerhalb , indem wir eine Regel

für die Grammatik festlegen. Das bedeutet außerdem, dass die Menge Variablen von aus einer Startvariablen sowie der Menge besteht. 2.

der

besteht aus mehreren Komponenten: , wobei jedes einzelne Teilwort wie im ersten Fall bearbeitet wird: Das bedeutet, der Keller wird im Laufe der Verarbeitung mehrfach geleert und wieder aufgefüllt. Angenommen, die Verarbeitung von beginnt im Zustand und endet im Zustand mit einem leeren Keller. Danach beginnt in die Verarbeitung von , die wiederum in mit einem leeren Keller endet. Dieses Verhalten können wir durch Regeln

abbilden, die gewissermaßen die Prüfung der beiden Teilwörter an die Variablen und delegieren. Da wir die Zustände nicht im Voraus kennen, formulieren wir diese Regeln für alle möglichen Kombinationen der Variablen . Insbesondere erhalten wir so auch Regeln der Form . Schließlich brauchen wir noch Regeln, um die Variablen endgültig aus den abgeleiteten Ausdrücken entfernen zu können. Da Terminalsymbole ausschließlich über die Regeln abgeleitet werden, sind für das Entfernen die Regeln

ausreichend. Schließlich lässt sich der Ableitungsprozess durch die Regel

starten. Die Konstruktion einer äquivalenten Typ-2-Grammatik ist damit komplett. Der Vorteil eines äquivalenten Automatenmodells ist darin begründet, dass wir zwischen den beiden alternativen Berechnungsmodellen »Erzeugung durch kontextfreie Grammatik« und »Akzeptanz durch NPDA« beliebig hin und her wechseln können, je nachdem welches Modell uns in einem bestimmten Kontext einfacher erscheint. Wir betrachten den NPDA mit und einer Übergangsfunktion folgenden Übergänge definiert ist:

, , wobei

durch die

Wir wir in Kapitel 3 gesehen haben, akzeptiert die Sprache . Um unsere Konstruktion einer äquivalenten kontextfreien Grammatik anwenden zu können, erklären wir zunächst zum Endzustand und formulieren dann die Übergänge so um, dass nur genau ein Kellersymbol in jedem Übergang auftaucht:

Nun können wir eine äquivalente Typ-2-Grammatik konstruieren: und

Mit Hilfe dieser Grammatik lässt sich tatsächlich

ableiten:

Deterministisch kontextfreie Sprachen Ähnlich wie bei den Typ-3-Grammatiken benötigten wir im obigen Abschnitt den Nichtdeterminismus, um ein zu Typ-2-Grammatiken äquivalentes Automatenmodell zu finden. Aber anders als bei den NEAs sind NPDAs und DPDAs nicht äquivalent, d. h., es gibt keine Möglichkeit, den zu einer Typ-2-Grammatik äquivalenten Automaten in der Realität, z. B. in Software, nachzubilden. Hierfür müsste der betreffende Automat deterministisch sein. Beschränken wir uns nun auf die Untermenge der Typ-2-Sprachen, die von deterministischen PDAs erkannt werden können, erhält man eine wichtige weitere Sprachklasse, die deterministisch kontextfreien Sprachen. Für diese Sprachen existiert Software (nämlich so genannte Compiler), die automatisiert prüfen kann, ob ein Wort von einer deterministisch kontextfreien Grammatik erzeugt werden kann. Aus diesem Grund lassen sich vor allem Programmiersprachen als deterministisch kontextfreie Sprachen auffassen. Tatsächlich lassen sich diese Sprachen auch dadurch charakterisieren, dass sie durch Syntaxdiagramme beschreibbar sind. Grammatiken, die zu einem DPDA äquivalent sind, werden auch als -Grammatiken bezeichnet. Wie bei den regulären Sprachen kann man bei den deterministisch kontextfreien Sprachen das Wortproblem in linearer Zeit lösen, indem man das zu prüfende Wort in den äquivalenten Automaten, in diesem Fall einen DPDA, eingibt.

Das Wortproblem für kontextfreie Sprachen Gegeben sei eine kontextfreie Grammatik in Chomsky-Normalform und ein Wort . Wir wollen wissen, ob durch erzeugt wird. Im Prinzip lässt sich dieses Problem lösen, indem wir alle Strings der Länge bilden, die von erzeugt werden können, und nachschauen, ob darunter ist. Wie praktikabel ist ein solches Vorgehen für große ? Um einen String der Länge zu erzeugen, wenden wir zunächst Regeln der Form mal an. Das Ergebnis ist ein Ausdruck, der aus Variablen besteht. Um ein Wort aus Terminalsymbolen zu bekommen, müssen wir zusätzlich die Regeln der Form mal anwenden. Wir erhalten also alle Wörter der Länge durch -malige Anwendung der Produktionsregeln. Besteht aus Produktionsregeln, von denen die eine Hälfte die Form und die andere Hälfte die Form hat, ergibt dieses Verfahren zirka abzuleitende Wörter. Das naive Ableiten aller Wörter besitzt also eine exponentielle Laufzeit. Zum Glück gibt es aber einen schnelleren Algorithmus, den Algorithmus von Cocke, Younger und Kasami, oder kurz CYK-Algorithmus. Er besitzt eine Laufzeit in (vgl. Kapitel 9 zur -Notation) und basiert auf der Idee der dynamischen Programmierung: Dabei versucht man, ein Problem in kleinere Unterprobleme aufzubrechen und durch geschicktes Kombinieren der Teillösungen das ursprüngliche Problem zu lösen: Wir versuchen zunächst, Substrings unseres Wortes von zu erzeugen. Dazu setzen wir für

Ist insbesondere die Startvariable

enthalten, so ist

aus den Variablen

in der Menge

. Außerdem ist klar, dass gilt

Aber wie können wir die Mengen folgende Beobachtung:

für

bestimmen? Dazu nutzen wir die

Denn dann kann der String aufgespalten werden in zwei Substrings und , von denen der erste aus abgeleitet werden kann und der zweite aus . Auf diese Weise können die nacheinander aus zuvor bestimmten Mengen bestimmt werden. Beispielweise kann die Menge mit Hilfe der Paare

, und bestimmt werden. Fassen wir unsere Überlegungen in einem Algorithmus zusammen:

CYK-Algorithmus Gegeben sei eine kontextfreie Grammatik in Chomsky-Normalform und ein Wort . Der folgende Algorithmus entscheidet mit Laufzeit , ob : Für alle

setze

Für alle

füge

mit

und zu

.

hinzu, falls es eine Regel

und

und ein

gibt

.

Es gilt

.

Die kubische Laufzeit des CYK-Algorithmus ergibt sich daraus, dass es zu bestimmende Mengen gibt und für jede davon mögliche Aufteilungen von in Substrings und zu betrachten sind. Schauen wir uns ein Beispiel an:

mit

und

Wir prüfen mittels des CYK-Algorithmus, ob das Wort Zunächst halten wir fest:

Die Menge kann aus rechte Seite jeder Regel Fall für die Regeln

und und

ist.

erzeugt werden. Dazu prüfen wir für die , ob und . Dies ist der . Deshalb ist

Analog können aus werden. Wir erhalten

und

bzw.

aus

und

erzeugt

Wir vergrößern nun sukzessive den Abstand zwischen und bei der Berechnung der . kann aus und oder aber aus und erzeugt werden. Wegen kommt nur die zweite Alternative in Betracht. Da und ist wegen der Regel . Andere Variablen finden sich nicht, so dass

kann aus und oder aber aus und erzeugt werden. Wegen kommt wieder nur die zweite Alternative in Betracht. Da und ist wegen der Regel . Andere Variablen finden sich nicht, so dass

Schließlich bleibt noch zu berechnen, wobei insbesondere interessant ist, ob . Für kommen die Zerlegungen , oder in Betracht. Wegen und , ist und damit auch . Außerdem ist auch noch , so dass

Da

die Länge 4 hat und

, gilt

.

Abschlusseigenschaften Zum Abschluss des Kapitels über kontextfreie Sprachen wenden wir uns, wie in Kapitel 2 bei den regulären Sprachen, noch den Abschlusseigenschaften zu, d. h., wir möchten wissen, wie sich die kontextfreien Sprachen unter den Mengenoperationen (Vereinigung), (Konkatenierung), (Kleene-Stern), (Schnitt) sowie (Komplementbildung) verhalten.

Abschlusseigenschaften kontextfreier Sprachen Sind

und

kontextfreie Sprachen, dann gilt:

1.

ist kontextfrei.

2. 3. 4. 5.

ist kontextfrei. ist kontextfrei. ist nicht immer kontextfrei. ist nicht immer kontextfrei.

Anders als bei den regulären Sprachen wird sich hier der Grammatik-basierte Ansatz zur Beschreibung der Sprachen beim Beweis als günstiger erweisen. Wir gehen davon aus, dass die kontextfreien Grammatiken und , die bzw. erzeugen, mit dem gleichen Alphabet arbeiten. Außerdem können wir durch Umbenennungen der Variablen erreichen, dass gilt. 1.

ist kontextfrei: Offenbar entsteht eine kontextfreie Grammatik , die erzeugt, durch Vereinigung der Variablenmengen und Produktionen: . Allerdings haben wir dann zwei Startvariablen . Wir lösen dieses Problem durch Einführung einer neuen Startvariable und der Regeln .

2.

ist kontextfrei: Wir erhalten eine geeignete Grammatik aus und , indem wir eine neue Startvariable mit der Regel einführen und alle Produktionsregeln und Variablen aus und für übernehmen.

3.

ist kontextfrei: besteht aus allen Kombinationen der Wörter aus sowie dem leeren Wort . Diese können wir erzeugen durch eine neue Startvariable sowie die neuen Regeln und , die zu den bisherigen Regeln hinzukommen.

4.

ist nicht immer kontextfrei: Ein Gegenbeispiel: Die Sprachen und sind kontextfrei (s. die Aufgaben zu kontextfreien Sprachen), ihre Schnittmenge

aber nicht.

5.

ist nicht immer kontextfrei: Angenommen, mit und

und

wären auch

und

kontextfrei. Dann sind auch

kontextfrei. Das ist aber ein Widerspruch wegen

Aufgaben zu kontextfreien Sprachen Als kleine Hilfe, so zur Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wiley-vch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. 1. Bringen Sie die Grammatik

, wobei

auf Chomsky-Normalform. 2. Welche Sprache erzeugt die Grammatik und

mit ?

3. Finden Sie eine kontextfreie Grammatik über Palindromsprache (vgl. Kapitel 3) erzeugt. 4. Finden Sie kontextfreie Grammatiken und

und

, die die

, die die Sprachen erzeugen.

Kapitel 8

Kontextsensitive und Phasen-StrukturSprachen IN DIESEM KAPITEL betrachten wir die beiden obersten Sprachkategorien der Chomsky-Hierarchie, nämlich die kontextsensitiven (Typ-1-) Sprachen sowie die Phasen-Struktur-(Typ-0)Sprachen lernen Sie das Wortproblem von Typ-1- und Typ-0-Sprachen kennen stelle ich äquivalente Maschinenmodelle vor

Typ-1-Sprachen sind dadurch gekennzeichnet, dass die Länge der abgeleiteten Ausdrücke bei einer Regelanwendung anwächst, während Phasen-Struktur-Sprachen keinerlei Einschränkungen hinsichtlich ihrer Grammatik unterliegen. In diesem Kapitel werden wir untersuchen, wie sich diese strukturellen Unterschiede auf die äquivalenten Maschinenmodelle und das Wortproblem für diese Sprachen auswirken.

Ein erstes Beispiel Wir beginnen mit einem wichtigen prototypischen Beispiel, das deutlich macht, dass die kontextfreien Sprachen eine echte Teilmenge der kontextsensitiven Sprachen bilden. Die Grammatik

mit

und

ist kontextsensitiv, aber nicht kontextfrei, da die Länge der Ausdrücke auf den rechten Seiten der Regeln zwar größer ist als auf der linken, sich aber andererseits auf der linken Seite der Regeln nicht nur einzelne Variablen finden. Welche Sprache erzeugt ? Wir leiten probeweise ein Wort ab:

Nach dem gleichen Muster lässt sich das Wort

ableiten:

Andererseits zeigt eine Analyse der Produktionsregeln, dass zu Beginn aus nur Ausdrücke abgeleitet werden können, die eine gleiche Anzahl von oder , oder und oder enthalten. Jede weitere Regelanwendung erhält dieses Gleichgewicht. Außerdem wird durch die Regeln, die Terminalsymbole beinhalten, sichergestellt, dass links von einem nur ein stehen kann und links von einem nur ein oder ein . Die von erzeugte Sprache ist also , eine Sprache, die wir in Kapitel 7 bereits als nicht kontextfrei identifiziert haben. Es kann damit keine alternative kontextfreie Grammatik geben, die erzeugt.

Das Wortproblem für Typ-1-Sprachen Das Wortproblem für Typ-1-Sprachen ist entscheidbar Es gibt einen Algorithmus, der bei Eingabe einer Typ-1-Grammatik in endlicher Zeit entscheidet, ob oder nicht.

und eines Wortes

Das heißt, die Typ-1-Sprachen bilden eine Untermenge der entscheidbaren Sprachen. Die Mengen sind aber nicht gleich, das bedeutet, es gibt durchaus entscheidbare Sprachen, die nicht durch Typ-1-Grammatiken beschreibbar sind. Der Algorithmus, der das Wortproblem für Typ-1-Sprachen entscheidet, ist vergleichsweise schlicht: Hat die Länge , so leiten wir aus der Startvariablen sukzessive alle Ausdrücke ab mit Länge . Genauer gesagt bilden wir zunächst die Menge der Ausdrücke, die aus in einem Schritt ableitbar sind und die Länge haben. Darauf wenden wir alle passenden Produktionsregeln an

und erhalten . Da aufgrund der Typ-1-Eigenschaft die Ausdrücke immer länger werden und es nur endlich viele Ausdrücke der Länge gibt, muss der Prozess irgendwann anhalten, d. h., für irgendein muss gelten

Nun suchen wir unter allen abgeleiteten Ausdrücken der Länge , die nur aus Terminalsymbolen bestehen. Leider ist der Algorithmus nicht besonders effizient, denn er hat exponentielle Laufzeit. Wir betrachten wieder die obige Grammatik und und wollen wissen, ob :

mit

ist. Wir bilden sukzessive die Mengen

Unter den abgeleiteten Ausdrücke findet sich Terminalsymbolen besteht. Deswegen ist

als einziges Wort, das nur aus .

Das Wortproblem für Typ-0-Sprachen Das Ansteigen der Länge der abgeleiteten Ausdrücke in Typ-1-Sprachen war entscheidend dafür, dass der oben vorgestellte Algorithmus terminiert und das Wortproblem für Typ-1Sprachen entscheidbar ist. Diese Eigenschaft fehlt uns in Typ-0-Sprachen: Hier ist das Wortproblem nur semi-entscheidbar, d. h., das Anhalten eines Algorithmus für das Wortproblem kann nicht in jedem Fall garantiert werden.

Das Wortproblem für Typ-0-Sprachen ist semientscheidbar Das Wortproblem für Typ-0-Sprachen ist semi-entscheidbar, weil es für jede Typ-0-Sprache Maschine gibt, die akzeptiert. Es kann jedoch nicht für alle Eingabewörter

garantiert werden, dass

anhält.

eine Turing-

Die Aussage im Kasten entspricht unserer früheren Definition der Semi-Entscheidbarkeit einer Sprache aus Kapitel 4. Die Konstruktion einer TM , die genau die Wörter aus akzeptiert, wird im nächsten Abschnitt gezeigt.

Äquivalente Maschinenmodelle Typ-0-Sprachen Der Ableitungsprozess eines Wortes aus der Startvariablen einer Typ-0-Grammatik lässt sich relativ leicht auf einer nichtdeterministischen 2-BandTuring-Maschine nachvollziehen. Die Grundidee besteht darin, den Ableitungsprozess umzukehren, bis am Ende die Startvariable auf dem Eingabeband steht. Dazu nehmen wir an, befindet sich zu Beginn auf dem Eingabeband. Die TM wählt nun nicht-deterministisch eine der Produktionen von aus und sucht den Ergebnisstring innerhalb von . Wird nicht gefunden, geht die TM in den Ablehnzustand. Wird aber gefunden, kann die TM auf dem Eingabeband durch ersetzen. Da wir von einer Typ-0-Grammatik ausgehen, kann es sein, dass länger ist als . In diesem Fall muss beim Ersetzen von durch das Eingabewort entsprechend auseinandergezogen werden, um Platz für zu schaffen. Entscheidet sich die immer für die richtigen Regeln, wird am Ende irgendwann die Startvariable auf dem Eingabeband stehen, und die TM kann in den Endzustand wechseln. Damit ist klar, dass sich zu einer Typ-0-Grammatik immer eine äquivalente TM finden lässt, da wir aus Kapitel 4 wissen, dass sowohl 1-Band- und Mehrband-TMs als auch nichtdeterministische und deterministische TMs zueinander äquivalent sind. Tatsächlich lässt sich auch umgekehrt zu einer TM eine Typ-0-Grammatik konstruieren, die die Arbeitsschritte der TM in ihren Produktionsregeln nachbildet. Das geht so: Die TM

beginnt in einer Startkonfiguration . Wir machen drei vereinfachende Annahmen über :

ist das einzige Symbol

.

besteht nur aus einem Akzeptanzzustand Wenn akzeptiert wird und /Ausgabeband leer.

.

in den Akzeptanzzustand

übergeht, ist das Ein-

Wegen der dritten Bedingung lässt sich auch die Endkonfiguration für ein Wort explizit angeben. Während also nach und nach in ein leeres Ein-/Ausgabeband umwandelt, geht die Grammatik genau umgekehrt vor: Sie beginnt

mit der Startvariabeln und erzeugt daraus nach und nach . Die Grundidee zur Konstruktion einer äquivalenten Typ-0-Grammatik besteht deshalb darin, mit den Produktionsregeln die Konfigurationswechsel der TM nachzubilden, aber in umgekehrter Richtung: Wir starten mit der Regel

die die Endkonfiguration der TM mit Hilfe von zwei Variablen von kommen nämlich aus der Menge . Angenommen, die TM befindet sich in der Konfiguration und . Ein Zustandsübergang von der Form

nachbildet. Diese mit

bewirkt dann den Konfigurationsübergang

Dieser Übergang kann für alle auftreten. Die dazu passenden Produktionsregeln arbeiten in der umgekehrten Richtung:

Zum Zustandsübergang

gehört der Konfigurationsübergang

Dazu passen die Produktionsregeln

Zum Zustandsübergang

gehört schließlich der Konfigurationsübergang

Dazu passt die Produktionsregel

Mit Hilfe dieser Produktionsregeln lässt sich, falls von akzeptiert wird, aus der Startvariablen der Ausdruck ableiten. Wir sind fast am Ziel, denn wir müssen nur noch die Nicht-Terminalsymbole aus dem

Ausdruck entfernen. Dies erreichen wir durch die Regeln

und die

-Regel

Damit haben wir gezeigt:

Äquivalenz von Typ-0-Sprachen und TuringMaschinen Die von (deterministischen oder nichtdeterministischen) TMs akzeptierten Sprachen sind genau die Typ-0Sprachen.

Gleichzeitig haben wir durch die Angabe einer zu einer Typ-0-Sprache äquivalenten TM auch einen Beweis für die obige Behauptung gefunden, dass das Wortproblem für Typ-0Sprachen semi-entscheidbar ist. Die zum Halteproblem gehörige Sprache

aus Kapitel 4 ist vom Typ 0, denn es gibt eine TM, die sie akzeptiert. Genauer gesagt hält die von uns in Kapitel 4 konstruierte universelle TM in einem Endzustand an, falls . Die Sprache ist aber nicht entscheidbar. Dazu müsste das allgemeine Halteproblem entscheidbar sein, von dem wir am Ende von Kapitel 4 gesehen haben, dass es nicht entscheidbar ist. Da wir im obigen Abschnitt gesehen haben, dass das Wortproblem für Typ-1-Sprachen durch einen Algorithmus entschieden werden kann, kann die Sprache deshalb nicht vom Typ 1 sein. Damit ist auch klar, dass die Typ-0Sprachen eine echte Obermenge der Typ-1-Sprachen bilden.

Typ-1-Sprachen Wie steht es nun mit Typ-1-Sprachen? Wenn wir uns die obige Konstruktion einer äquivalenten TM aus einer Grammatik anschauen, dann ist der kritische Part die Ersetzung von durch auf dem Band, falls es eine passsende Regel in gibt. Bei einer Typ-1-Grammatik gilt aber immer , so dass durch den Ersetzungsprozess der Ausdruck auf dem Band immer kürzer wird. Also muss der Schreib-/Lesekopf bei einer Typ-1-Grammatik den Bandbereich mit dem Eingabewort niemals verlassen, und die Konstruktion liefert eine nichtdeterministische, linear

beschränkte TM. Konstruiert man jetzt umgekehrt eine Grammatik aus einer TM, so erfüllen die Produktionsregeln auf den ersten Blick alle die Typ-1-Bedingung . Bei genauerem Hinsehen zeigt sich aber, dass es durchaus Regeln gibt, die die Bedingung verletzen. Zum Beispiel haben wir oben für die Simulation des Übergangs die Regeln

eingeführt. Ist speziell

, so kann aufgrund der Regel

wegfallen:

und die rechte Seite der Regel ist kürzer als die linke. Es kann also durchaus sein, dass bei der Konstruktion von eine Typ-0-Grammatik entsteht. Aber wann genau passiert das? Die kritische Regel dient der Simulation des Konfigurationswechsels

wobei und . Der Schreib-/Lesekopf der TM steht nach dem Wechsel also auf einem -Zeichen. Bei einer linear beschränkten TM kann ein solcher Übergang aber nicht vorkommen: Bei ihnen wird der Rand des Eingabewortes speziell markiert, so dass garantiert ist, dass der Schreib-/Lesekopf niemals den vom Eingabewort eingenommenen Platz auf dem Ein-/Ausgabeband verlassen muss (s. Kapitel 4). Nur bei einer linear beschränkten TM erfüllt die äquivalente Grammatik also die Bedingung für Typ-1-Sprachen. Wir haben damit gezeigt:

Äquivalenz von Typ-1-Sprachen und LBNTMs Die von linear beschränkten, nichtdeterministischen TMs akzeptierten Sprachen sind genau die Typ-1Sprachen.

Eine deterministische LBTM, die die Typ-1-Sprache

akzeptiert, lässt sich leicht informell angeben: Die TM markiert das erste und sucht dann ein dazu passendes . Findet sie ein solches , markiert sie auch dieses, geht zurück zum Wortanfang, sucht ein weiteres unmarkiertes und wiederholt den Vorgang.

Wird kein unmarkiertes gefunden, enthält das Wort mehr als . Wird kein unmarkiertes mehr gefunden, sucht die Maschine nach einem ersten . Begegnet die Maschine auf dem Weg dorthin einem noch unmarkierten , enthält das Wort mehr als . Wird erfolgreich ein erstes gefunden, ist die Anzahl der 's gleich der Anzahl der 's, und der Vergleich kann mit den und wiederholt werden. Es ist unmittelbar klar, dass die TM für diesen Vorgang niemals den Bereich auf dem Band verlassen muss, der vom Eingabewort eingenommen wird. Zudem sind die Zustandsübergänge in jedem Fall eindeutig definiert. Es handelt sich also um eine deterministische LBTM.

Teil III

Harte Probleme

IN DIESEM TEIL… behandeln wir die Komplexitätstheorie. Bislang ging es uns bei einem Problem in erster Linie darum, ob es überhaupt mit Hilfe eines Algorithmus gelöst werden kann, also ob es entscheidbar ist oder nicht. Aber auch bei den entscheidbaren Problemen gibt es sowohl qualitative als auch quantitative Unterschiede, nämlich bei der Laufzeit der Algorithmen bzw. ihrer Komplexität. Manche Probleme sind zwar in der Theorie lösbar, in der Praxis steigt die Laufzeit des Algorithmus aber exponentiell mit der Größe des Problems an, so dass man in absehbarer Zeit keine Lösung berechnen kann. In diesem Teil werden wir versuchen, den Begriff der Laufzeit genauer zu fassen und zu untersuchen, was genau die schwierigen von den weniger schwierigen Problemen unterscheidet.

Kapitel 9

Zeitkomplexität von Algorithmen IN DIESEM KAPITEL führen wir die

-Notation zur Klassifizierung des Aufwands für Algorithmen ein

gehe ich auf die Zeit- und Speicherkomplexität von Algorithmen ein führe ich die Komplexitätsklassen von Sprachen ein

Bei einer -Notation handelt es sich um eine Klassifikation des Ressourcen-Verbrauchs (Zeit- und Speicherbedarf) eines Algorithmus in Abhängigkeit von der Problemgröße . Die -Notation ist grob genug, um durch Implementationsdetails eines Algorithmus nicht beeinflusst zu werden. Andererseits ist sie fein genug, um quantitative Unterschiede im Ressourcenverbrauch verschiedener Algorithmen sichtbar zu machen.. Als ersten Schritt auf dem Weg zur -Notation benötigen wir eine geeignete Definition für die Größe eines Problems.

Einführende Überlegungen Wir möchten in diesem Kapitel die intrinsische Komplexität eines Algorithmus messen. Mit »Komplexität« ist dabei der Aufwand gemeint, den man betreiben muss, um einen Algorithmus auszuführen, und das Wort »intrinsisch« bedeutet, dass wir versuchen müssen, so weit wie möglich von der Hardware, die einen Algorithmus ausführt, zu abstrahieren. Dasselbe gilt für Implementierungsdetails auf einem Computer in einer bestimmten Programmiersprache: Auch diese sollten die intrinsische Komplexität eines Algorithmus nicht beeinflussen. Wenn wir die Komplexität eines Algorithmus betrachten, interessiert uns in erster Linie der Aufwand, den ein Algorithmus erfordert, wenn sehr große Probleme gelöst werden müssen, denn nur in diesem Fall wird z.B. die verbrauchte Rechenzeit wirklich wichtig. Um ein Gefühl für das Thema zu bekommen, erinnern Sie sich bitte für einen Moment an Ihre (Grund-)Schulzeit zurück und lassen uns schriftlich zwei dreistellige Zahlen multiplizieren: 4 5 6 × 1 2 2 4 5 6 9 1 2 9 1 2

1 1 5 5 6 3 2

Wie viel Zeit benötigt dieser Algorithmus zur schriftlichen Multiplikation? Unterschiedliche menschliche Rechner werden unterschiedlich viel Zeit für die Aufgabe benötigen. Computer sind natürlich deutlich schneller als jeder Mensch, aber auch hier hängt die tatsächliche Laufzeit von der Taktfrequenz der CPU, dem Betriebssystem und vielen anderen Faktoren ab, die nichts mit dem eigentlichen Algorithmus zu tun haben. Versuchen wir daher, uns von der verwendeten »Hardware« zu lösen und zählen wir einfach die Rechenoperationen: Der Multiplikations-Algorithmus beruht darauf, die Multiplikation mehrstelliger Zahlen auf die elementare Multiplikation einstelliger Zahlen und darauf folgende Additionen zurückzuführen. In diesem Beispiel benötigen wir neun elementare Multiplikationen und fünf Additionen. Es hätte natürlich deutlich länger gedauert, zwei fünfstellige Zahlen schriftlich miteinander zu multiplizieren. Allgemein lässt sich sagen, dass der Schul-Algorithmus zur Multiplikation zweier -stelliger Zahlen elementare Multiplikationen und höchstens Additionen benötigt. Allgemein hängt die Laufzeit eines Algorithmus (in Operationen gemessen) offenbar von der Größe des Inputs ab: wobei eine Funktion ist, die natürliche Zahlen auf natürliche Zahlen abbildet. Dieselben Überlegungen gelten für den Speicherplatz , die andere wichtige Ressource, mit der man den Aufwand für einen Algorithmus beschreibt. Der Speicherplatz lässt sich hier einfach messen in Form der »Rechenkästchen«, die man auf Karopapier beschreiben muss, um die Multiplikation von und durchzuführen: Bei zwei -stelligen Zahlen benötigt man Kästchen, um sich die Ergebnisse der elementaren Multiplikationen zu merken. Hinzu kommen ca. Kästchen für das Endergebnis. Aber wie misst man die Grösse des Inputs? Beispielsweise werden die Input-Zahlen für den Multiplikationsalgorithmus üblicherweise im Dezimalsystem geschrieben, wenn ein Mensch den Algorithmus ausführen soll (fünfstellig bedeutet, dass die Zahl aus fünf Ziffern im Dezimalsystem besteht). Soll aber ein Computer multiplizieren, wird er den Input in Bits erwarten, also im Binärsystem geschrieben, was normalerweise einen längeren Input bedeutet. Im Allgemeinen unterscheiden sich die Längen dieser unterschiedlichen Codierungen nur um einen Faktor , der in der Größenordnung von liegt. In jedem Fall brauchen wir eine Übereinkunft, wie wir die Größe der konkreten Ausprägung eines bestimmten Problems (der so genannten Probleminstanz) messen

wollen. Normalerweise bezeichnen wir als Größe einer Probleminstanz die Anzahl an Bits, die man benötigt, um das Problem genau zu beschreiben. Im Falle von Algorithmen, die beispielsweise auf Graphen arbeiten, kann aber auch die Anzahl der Knoten oder der Kanten des Graphen sein, je nachdem, was dem Charakter des Problems angemessen ist. Wir werden weiter unten sehen, dass die unterschiedlichen Definitionen der Größe eines Problems sich nicht entscheidend auf die Komplexität eines Algorithmus auswirken. Nun ist die Laufzeit eines Algorithmus natürlich nicht für alle Probleminstanzen mit derselben Länge gleich. Im obigen Rechenbeispiel etwa brauchten wir nur 5 Kästchen, um das Endergebnis niederzuschreiben, im Allgemeinen hat aber das Ergebnis der Multiplikation zweier dreistelliger Zahlen 6 Stellen. Um auf der sicheren Seite zu sein und keine bösen Überraschungen zu erleben, sind wir in erster Linie an der Worst-Case-Laufzeit interessiert, d. h., der Laufzeit des Algorithmus im ungünstigsten Fall. Die Laufzeit des obigen Multiplikationsalgorithmus ist zwar im Wesentlichen gleich lang für alle Inputzahlen gleicher Länge, aber z. B. bei einem Sortieralgorithmus spielt es durchaus eine Rolle, inwieweit der Input bereits vor der Sortierung eine gewisse Ordnung besitzt. Die Worst-Case-Laufzeit liefert uns somit eine obere Schranke für die Laufzeit, die für alle Probleminstanzen gültig ist.

Zeit- und Speicherkomplexität von Algorithmen Wir haben uns oben darauf geeinigt, die Laufzeit eines Algorithmus durch die Anzahl der benötigten Operationen zu messen, um von der den Algorithmus ausführenden Hardware unabhängig zu sein. Analog kann man auch den Verbrauch des Speicherplatzes, messen, indem man zählt, wie viele Speicherzellen von einem Algorithmus im Laufe der Verarbeitung besucht werden. Aber wie sind die Begriffe »Algorithmus« und »Operationen« überhaupt definiert? Und ist der Begriff »Speicherzelle« nicht völlig von der Hardware abhängig? Beim Begriff Algorithmus haben wir in Kapitel 4 bereits wichtige Vorarbeit geleistet. Dort haben wir nämlich »Algorithmus« mit einer Turing-Maschine , die diesen Algorithmus ausführt, gleichgesetzt. In Kapitel 4 haben wir außerdem einen Berechnungsschritt einer TM als einen Konfigurationswechsel der TM definiert. Deshalb setzen wir jetzt den Begriff »Operationen« mit der Anzahl der Berechnungsschritte von , also der Konfigurationswechsel, die bei der Ausführung des Algorithmus durchführt, gleich. Analog können wir »Speicherzellen« mit der von benötigten Anzahl Zellen auf dem Ein-/Ausgabeband identifizieren. Wir können damit die Zeit- und Speicherkomplexität eines Algorithmus präzise definieren:

Ein Algorithmus besitzt eine Laufzeit Turing-Maschine bei einem Input der Größe Berechnungsschritten anhält.

, falls die ihn realisierende im Worst Case nach

Ein Algorithmus besitzt einen Speicherplatzbedarf realisierende Turing-Maschine bei einem Input der Größe Felder auf dem Ein-/Ausgabeband beschreibt.

, falls die ihn im Worst Case

Da das Beschreiben eines Feldes immer nur durch einen Berechnungsschritt einer TM ausgelöst wird, kann der Speicherplatzbedarf niemals größer sein als die Laufzeit der TM. Im Allgemeinen steht deshalb die Laufzeit bei der Betrachtung des Ressourcenverbrauchs eines Algorithmus im Vordergrund. Komplett befreit von Implementierungsdetails haben wir uns durch die obigen Definitionen noch nicht, denn natürlich lassen sich Arbeitsschritte der Turing-Maschine einsparen, wenn man beispielweise mehr Symbole in das Eingabealphabet aufnimmt. Ein und derselbe Algorithmus kann von einer 1-Band- oder einer äquivalenten 2-Band TuringMaschine ausgeführt werden, wobei klar ist, dass die 1-Band-Maschine (quadratisch) mehr Schritte als die 2-Band-Maschine benötigt (siehe Kapitel 4). Weiter unten werden wir sehen, dass andere Maschinenmodelle die Laufzeit eines Algorithmus noch weiter nach unten treiben können. Schließlich kann auch der Begriff des Inputs, wie oben diskutiert, durchaus verschiedene Formen annehmen. Trotzdem sind wir doch einen großen Schritt in Richtung unseres Ziels der Beschreibung der intrinsischen Komplexität von Algorithmen vorangekommen. Von den erwähnten Details werden wir uns im nächsten Kapitel durch einen weiteren Abstraktionsschritt befreien. Die Türme von Hanoi Wir haben drei Tische , und . Auf dem Tisch liegen unterschiedlich große Scheiben übereinander. Diese sind der Größe nach so geordnet, dass die größte Scheibe ganz unten liegt. Die anderen Tische sind leer. Der Stapel auf soll nun nach transferiert werden, wobei die folgenden drei Punkte beachtet werden müssen: 1. Bei jedem Schritt darf nur eine Scheibe bewegt werden. Insbesondere heißt dies, dass immer nur die oberste Scheibe eines Stapels bewegt werden kann. 2. Eine Scheibe darf nur auf einen der Tische bzw. auf einen Stapel von Scheiben gelegt werden. 3. Es darf keine Scheibe auf eine kleinere Scheibe gelegt werden. Der Input für dieses Problem besteht offenbar in der Anzahl

der Scheiben. Für

und ist das Problem noch trivial, aber wie sieht es für größere aus? Eine direkte Abfolge von Zügen anzugeben, erscheint schwierig, aber nach etwas Nachdenken kommt man auf die folgende Beobachtung: Wenn es gelingt, Scheiben von nach zu verschieben, ist der Rest der Aufgabe trivial: Man verschiebt die unterste Scheibe von nach und nutzt dann die gleiche Abfolge von Schritten wie zuvor, um die restlichen Scheiben von nach zu schieben. Hierbei handelt es sich um einen rekursiven Algorithmus, das bedeutet, man gibt die Lösung des Problems nicht explizit an, sondern nur einen Weg, wie die Problemgröße verkleinert werden kann. Dies wiederholt man so lange, bis das Problem so klein geworden ist, dass seine Lösung trivial ist (hier die Bewegung einer Scheibe). Danach kann man mit den erhaltenen Lösungen für die kleinen Probleminstanzen auch die größeren bewältigen. In Pseudocode sieht der Algorithmus so aus: Hanoi(n,i,j,k) //move begin if

disks from

to

, using

, where

then return(); //nothing to do

else Hanoi(n-1,i,k,j); //move disks from move(i,j); //move 1 disk from to Hanoi(n-1,k,j,i); //move end

disks from

to to

Dabei ist zu beachten, dass lokale Variablen sind, die je nach Inkarnation des Algorithmus unterschiedliche Werte annehmen. Lassen Sie uns die einzelnen Schritte nachvollziehen, die zum Bewegen eines drei Scheiben hohen Turms von Tisch 1 nach Tisch 2 nötig sind. Es ist also zu Beginn : Hanoi(3,1,2,3) Hanoi(2,1,3,2) Hanoi(1,1,2,3) Hanoi(0,1,3,2) move(1,2) Jetzt ist Hanoi(1,1,2,3) vollständig abgearbeitet. Wir kehren zurück zu Hanoi(2,1,3,2): Hanoi(2,1,3,2) move(1,3) Hanoi(1,2,3,1) Hanoi(0,2,1,3) move(2,3) Jetzt ist auch Hanoi(2,1,3,2) komplett. Wir kehren zurück zu Hanoi(3,1,2,3): Hanoi(3,1,2,3) move(1,2) Hanoi(2,3,2,1) Hanoi(1,3,1,2) Hanoi(0,3,2,1) move(3,1) Hanoi(2,3,2,1) move(3,2) Hanoi(1,1,2,3) Hanoi(0,1,3,2) move(1,2)

Damit sind alle Instanzen von Hanoi komplett abgearbeitet, und der Turm wurde in der gewünschten Weise bewegt. Dafür waren sieben move()-Befehle, also sieben

Scheibenbewegungen notwendig. Eine Turing-Maschine könnte diesen Algorithmus etwa in der Form ausführen, dass sie im Startzustand zunächst die Inputvariablen vom Band liest. Diese werden dann gemäß dem Pseudocode oben manipuliert. Die move()-Befehle werden auf einem Ausgabeband ausgegeben und könnten dann von einem Menschen oder auch einem Roboter physisch ausgeführt werden. Schließlich muss sich die TM noch merken, welche Instanz von Hanoi(n,i,j,k) sie aktuell ausführt, d.h. die aktuellen Input-Variablen vor dem Überschreiben auf dem Eingabeband. Dazu kann die TM mehrere Stacks (bzw. Kellerspeicher, vgl. Kapitel 3) benutzen: Der aktuelle Wert einer Variablen, z. B. , wird vom Eingabeband gelesen und oben auf den Stack gepusht. Wenn eine Unterinstanz abgearbeitet ist, wird die oberste Zahl aus dem Stack ausgelesen und als Inputvariable auf das Band geschrieben. Eine neue Hanoi-Instanz kann durch Wechsel in gestartet werden. Der obige Pseudocode hilft uns auch dabei, die Anzahl der Schritte, die man benötigt, um einen Turm der Höhe zu bewegen, zu bestimmen: Da wir zwei Türme der Höhe und eine einzelne Scheibe verschieben müssen, muß gelten Die einzige Funktion, die diese Eigenschaft besitzt, ist Unser rekursiver Algorithmus zur Lösung des Problems der Türme von Hanoi hat also eine exponentielle Laufzeit. Aber Halt! Gibt es nicht vielleicht auch noch einen schnelleren Algorithmus als den rekursiven, den wir oben beschrieben haben? Tatsächlich ist das nicht der Fall, wie man wiederum durch vollständige Induktion zeigen kann: Für brauchen wir genau Zug. Angenommen, wir wollten nun einen Turm der Höhe von nach bewegen. Irgendwann muss dafür auch die unterste Scheibe bewegt werden. Wenn auf allen drei Tischen bereits Scheiben liegen, ist dies unmöglich, denn die unterste Scheibe ist gleichzeitig auch die größte und könnte deshalb nirgends abgelegt werden. Also muss ein Tisch komplett frei sein, und die restlichen Scheiben müssen (der Größe nach geordnet) auf dem dritten Tisch liegen. Nach Induktionsvoraussetzung brauchten wir für den Transport dieser Scheiben auf den dritten Tisch Schritte. Wir legen die unterste Scheibe auf und transferieren die restlichen Scheiben von nach , wofür nach Induktionsvoraussetzung nochmals Schritte nötig sind. Insgesamt haben wir also Schritte gebraucht. Addition

Wir addieren zwei Zahlen und mittels einer 3-Band TM. soll dabei aus Bits bestehen und aus Bits. Das Eingabewort besteht aus den Bits von bzw. , die sich bereits untereinander angeordnet auf Band 1 bzw. Band 2 befinden. Die Gesamtlänge des Inputs ist also . Die Köpfe von Band 1 und 2 laufen nun synchron von rechts nach links über und . Dabei wird bitweise mit Übertrag addiert und das Ergebnis auf Band 3 geschrieben. Die Anzahl der bitweisen Additionen beträgt dabei , und die Anzahl der auf Band 3 für das Ergebnis beschriebenen Speicherzellen ist im Worst Case . Wegen hat die Addition eine Laufzeit und Speicherplatzbedarf . Lineare Suche Die lineare Suche ist der einfachste Suchalgorithmus für unsortierte Listen aus Datensätzen. Eine TM durchläuft die Liste auf dem Ein-/Ausgabeband von Anfang bis Ende, bis der gesuchte Datensatz gefunden ist. Im Worst Case ist dies das letzte Element der Liste, wir brauchen also Schritte, wobei die Zahl der Schritte für einen Datensatz ist. Damit hat die lineare Suche die Laufzeit . Binäre Suche Die binäre Suche bildet ein Beispiel für einen Algorithmus, bei dem das verwendete Maschinenmodell eine große Rolle spielt. Wir suchen in einer sortierten Liste von Datensätzen nach einem Datensatz mit einem bestimmten Merkmal, z. B. nach einem Kontaktdatensatz mit einem bestimmten Nachnamen. Da der Datensatz nach dem Merkmal sortiert ist, kann eine Registermaschine (siehe Kapitel 4) direkt zu dem Register springen, das den Datensatz in der Mitte der Liste enthält. Kommt die dort gefundene Telefonnummer in der Sortierung nach der gesuchten, kann im nächsten Schritt die Suche auf die erste Hälfte der Liste beschränkt werden. So kann in jedem Schritt die zu durchsuchende Menge halbiert werden, bis sie im Extremfall (der auch gleichzeitig den Worst Case darstellt) nur noch aus einem Datensatz besteht. Bis dahin braucht man im Worst Case ca. Schritte, die binäre Suche hat also auf Registermaschinen die Laufzeit . Eine Turing-Maschine hingegen würde zunächst zählen, wie viele Datensätze auf dem Ein-/Ausgabeband vorhanden sind, mittels Division durch 2 die Mitte des Datensatzes bestimmen und dann in einer weiteren Reihe von Schritten zur Mitte laufen. Allein für das Zählen des Datensatzes benötigt die TM also schon mindestens Schritte.

Die O-Notation Bei der Klassifizierung der Laufzeit eines Algorithmus sind wir hauptsächlich daran

interessiert, wie sich die Laufzeit für sehr große , also für sehr umfangreichen Input verhält, da nur für sehr große eventuelle zeitliche Beschränkungen der Laufzeit eine Rolle spielen. Um dieses Langzeitverhalten abzubilden, führen wir die -Notation für die Beschreibung der Laufzeit von Algorithmen ein. Die Laufzeit eines Algorithmus wird durch eine Funktion beschrieben, wobei ein Maß für die Größe der Probleminstanz ist. Die -Notation klassifiziert alle diese Funktionen nach ihrem Verhalten für große . und seien Funktionen mit Wir definieren: Es gilt Es gilt schreibt man anstatt

, und

(oder auch

sei eine Konstante.

), falls

(oder auch

), falls auch

Manchmal .

Die Menge stellt also eine Äquivalenzklasse von Funktionen dar, die sich in Bezug auf ihr Wachstumsverhalten für große nur durch eine Konstante unterscheiden. Deswegen ist die Notation formal nicht ganz korrekt, aber bequem und deshalb weit verbreitet. Das relativ unwichtige Verhalten der Laufzeit-Funktionen für kleine Inputlängen wird durch die Verwendung der -Notation gewissermaßen ausgeblendet. Wie wir gesehen haben, können außerdem unterschiedliche Kodierungen dazu führen, dass sich die Längen der Inputs durch eine (multiplikative) Konstante unterscheiden. Durch die -Notation wird auch dieses Detail unwichtig, und wir lassen auch die Frage der Kodierung des Inputs, die für die intrinsische Komplexität eines Algorithmus unwesentlich ist, hinter uns. Betrachten wir nun einige konkrete Beispiele für Laufzeitfunktionen und ihre um ein Gefühl für die -Notation zu bekommen.

, denn:

-Klasse,

Dieses Beispiel zeigt exemplarisch, dass alle Polynome mit der gleichen führende Potenz in der gleichen -Klasse sind, da nur die führende Potenz das Verhalten für große bestimmt. Für alle

gilt

, denn:

Dieses zweite Beispiel beweist, dass kein Polynom in für große so stark wächst wie die Exponentialfunktion - und das gilt natürlich auch für alle anderen Exponentialfunktionen der Form mit : Polynomiales Wachstum, egal mit welcher Potenz, ist immer schwächer als exponentielles Wachstum. Schließlich betrachten wir noch die natürliche Logarithmusfunktion. Sie wächst schwächer als jede positive Potenz von : Für alle

gilt

, denn:

Bei der Berechnung des letzten Grenzwerts haben wir die Regel von de L'Hospital angewandt, die besagt, dass man bei unbestimmten Grenzwerten der Form » « Zählerund Nennerfunktion getrennt voneinander ableiten darf, ohne dass sich etwas am Grenzwert ändert. Unsere Argumentation zeigt, dass logarithmisches Wachstum immer schwächer ist als polynomiales Wachstum, egal mit welcher Potenz. Damit können wir eine Art Wachstumshierarchie typischer Funktionen aufstellen:

Komplexitätsklassen von Sprachen Zu jeder Sprache gehört immer auch ein Problem, nämlich das Wortproblem für , bei dem entschieden werden muss, ob ein Wort in liegt oder nicht. Ist entscheidbar, gibt es einen Algorithmus, der das Wortproblem für jedes löst. Kann man umgekehrt zu einem Problem immer auch eine dazugehörige Sprache definieren? Das gelingt auf jeden Fall bei so genannten Entscheidungsproblemen, also bei Problemen, bei denen die Antwort Ja oder Nein ist: Nehmen wir als Beispiel ein klassisches Problem aus der Graphentheorie : Wir möchten gerne wissen, ob ein gegebener Graph eulersch ist, d. h., ob ein Kreis existiert, der jede Kante von genau einmal enthält (s. Kapitel 14). Wir können einen Graphen mit Knoten z. B. über seine Adjazenzmatrix als Wort kodieren. Das Problem zu prüfen, ob eulersch ist, ist damit äquivalent zum Wortproblem für die Sprache , die aus allen Wörtern besteht, die einen eulerschen Graphen kodieren:

Analog können wir definieren:

Bei den so genannten Optimierungsproblemen wird aber nicht nach einer Ja/NeinAntwort gefragt, sondern nach einer Zahl oder einem anderen Objekt, das ein bestimmtes Problem löst. Im Kontext von Graphen könnte ein solches Objekt der kürzeste Weg sein, der zwei Knoten miteinander verbindet, oder der kürzeste Kreis in einem vollständigen Graphen, der jeden Knoten genau einmal enthält. Optimierungsprobleme mit einer Zahl als Lösung lassen sich zumeist leicht auf Entscheidungsprobleme reduzieren, das heißt, eine Lösung des Entscheidungsproblems führt in kurzer Zeit auch zu einer Lösung des Optimierungsproblems. Beispielsweise können wir statt nach der Länge des kürzesten Hamilton-Kreises fragen: »Gibt es in einen Hamilton-Kreis der Länge ?« Wenn es uns gelingt, Fragen dieses Typs zu beantworten, können wir die tatsächlich gesuchte Länge durch sukzessives Verkleinern von bestimmen. Wenn nach dem kürzesten Kreis selbst gefragt ist, hilft der folgende Trick: Wir bestimmen zunächst seine Länge . Danach entfernen wir eine Kante aus dem Graphen und fragen nach der Länge des kürzesten Hamilton-Kreises für diesen neuen Graphen. Lautet die Antwort wieder , ist klar, dass die Kante nicht zu dem gesuchten Hamilton-Kreis gehören kann. So lässt sich sukzessive bestimmen, aus

welchen Kanten der kürzeste Hamilton-Kreis für

besteht.

Es besteht also meist kein wesentlicher Unterschied zwischen einem Entscheidungsproblem und einem Optimierungsproblem. Weil aber ein Entscheidungsproblem in natürlicher Weise immer auch eine Sprache definiert, konzentrieren wir uns im Folgenden auf Entscheidungsprobleme. Wir definieren nun Komplexitätsklassen für Sprachen, indem wir die Zeit- und Speicherkomplexität der Algorithmen betrachten, die das Wortproblem dieser Sprachen lösen.

sei ein Alphabet. Eine Sprache ist in der Klasse , falls es einen Algorithmus gibt, der das Wortproblem für ein Inputwort der Länge Laufzeit löst.

mit

Eine Sprache ist in der Klasse , falls es einen Algorithmus gibt, der das Wortproblem für ein Inputwort der Länge Speicherbedarf löst.

mit

In Teil II dieses Buchs haben wir für die wichtigsten Sprachklassen Algorithmen zur Lösung ihres Wortproblems kennengelernt. Diese waren: Reguläre Sprachen (s. Kapitel 6) Das Wortproblem für reguläre Sprachen konnte gelöst werden, indem man einen DEA konstruiert, der genau die Wörter der Sprache akzeptiert, und dann das Inputwort durch den DEA verarbeiten lässt. Hat die Länge , benötigt der DEA Zustandsübergänge, um zu einer Entscheidung zu kommen. Reguläre Sprachen sind also in der Klasse . Kontextfreie Sprachen (s. Kapitel 7) Das Wortproblem für kontextfreie Sprachen kann durch den in Kapitel 7 beschriebenen CYK-Algorithmus in Schritten gelöst werden. Zwar arbeitet der CYK-Algorithmus nur auf Grammatiken in Chomsky-Normalform, der Aufwand für die Transformation in die Normalform ist jedoch von der Länge des betrachteten Wortes unabhängig und deshalb als konstant anzusehen. Kontextfreie Sprachen sind also in der Klasse . Kontextsensitive Sprachen (s. Kapitel 8)

Bei einer kontextsensitiven Sprache kann das Wortproblem im Wesentlichen durch die Anwendung aller möglichen Produktionsregeln der zugrunde liegenden Grammatik gelöst werden, bis alle Wörter der Länge gebildet sind. Für z.B. können dies im Extremfall Wörter sein, so dass kontextsensitive Sprachen in sind. Wie steht es mit den weiter oben definierten Sprachen und ? In Kapitel 14 werden wir sehen, dass man sehr einfach entscheiden kann, ob ein Graph eulersch ist: Man muß nur prüfen, ob jeder Knoten von in einer geraden Anzahl von Kanten enthalten ist. Betrachten wir die Anzahl der Knoten als Inputgröße , so hat der entsprechende Algorithmus eine Laufzeit in , und ist in . Ganz anders die Situation bei : Wir sind weit davon entfernt, ein ähnlich handliches Kriterium dafür angeben zu können, ob ein Graph einen Kreis enthält, der jeden Knoten genau einmal enthält, wie bei den Euler-Kreisen. Trotzdem ist die Sprache natürlich mittels eines »Brute-Force«-Algorithmus entscheidbar: Ein Hamilton-Kreis enthält alle Knoten und ist deshalb als eine Permutation der Knoten darstellbar. Wir bilden alle möglichen Permutationen und prüfen für jedes nach, ob für alle die Kanten enthält. Ist dies der Fall, haben wir einen Hamilton-Kreis gefunden. Im Worst Case aber müssen wir alle Permutationen durchprobieren, bevor wir sicher sein können, dass keinen Hamilton-Kreis enthält. Natürlich ist nicht ausgeschlossen, dass es einen noch schnelleren Algorithmus gibt, aber einstweilen halten wir fest, dass .

Aufgaben zur Komplexität von Algorithmen Als kleine Hilfe, so zur Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wiley-vch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. 1. Beweisen Sie die folgenden Beziehungen: a. Für alle

und

gilt

.

b. Für alle

und

gilt

.

2. Zeigen Sie: 3. Der Bubble-Sort-Algorithmus zum Sortieren einer Liste aus funktioniert so: BubbleSort(List) //sort List of size .

Datensätzen

begin for to : for to : if (List[j] < List[j+1]) then swap List[j] and List[j+1]; endfor endfor end

Zeigen Sie, dass BubbleSort

ist.

Kapitel 10

Die Klassen P und NP IN DIESEM KAPITEL führen wir die beiden wichtigsten Problemklassen P und NP ein finden Sie Erläuterungen zum SAT-Problem und zur Reduktion

P steht für die in polynomialer Zeit lösbaren Probleme. Etwas verkürzt lässt sich sagen, dass dieses die effizient lösbaren Probleme sind. NP hingegen steht für nichtdeterministisch-polynomial und umfaßt die Probleme, für die sich Lösungen nichtdeterministisch raten lassen und dann in polynomialer Zeit verfizieren lassen.

Die Klasse P In den vergangenen Kapiteln haben wir viele Probleme (hauptsächlich Wortprobleme für Sprachen aus der Chomsky-Hierarchie) kennengelernt, die sich mit einer deterministischen Turing-Maschine und einer Anzahl von Berechnungsschritten lösen lassen, die polynomial von der Größe des Inputworts abhängt. Wir fassen nun alle diese Probleme in einer Problemklasse zusammen: Eine Sprache ist in der Klasse P, falls ihr Wortproblem von einer deterministischen Turing-Maschine mit polynomialer Laufzeit mit gelöst werden kann. Gemeinhin geht man davon aus, dass sich in der Klasse P die effizient lösbaren Probleme aufhalten. Warum betrachtet man gerade polynomiale Laufzeit? Weil die Klasse hinreichend robust ist, um verschiedene Arten äquivalenter Turing-Maschinen abdecken zu können, zum Beispiel solche mit einer unterschiedlichen Zahl von Bändern: In Kapitel 4 haben wir gesehen, wie sich eine 2-Band-TM durch eine 1-Band-TM simulieren lässt. Um einen Schritt der 2-Band TM simulieren, musste die 1-Band TM die gesamte Länge des Bands ablaufen, auf dem Symbole zu finden waren, um herauszufinden, wo sich die beiden Schreib/Leseköpfe der 2-Band-TM gerade befinden. Nach Schritten der 2-Band TM können maximal Felder auf den beiden Eingabebändern beschrieben sein, was bedeutet, dass die 1-Band TM im Worst Case zur Simulation des -ten Schrittes allein selber Schritte benötigt. Insgesamt zeigt sich, dass die 1-Band-TM eine Laufzeit in besitzt, falls die äquivalente 2-Band-TM

eine Laufzeit in hat. Entscheidend ist aber: Hat die 2-Band-TM polynomiale Laufzeit, so hat auch die simulierende 1-Band-TM polynomiale Laufzeit. Die Anzahl der Bänder ist schließlich eine reine Hardware-Eigenschaft, die nichts mit der eigentlichen Essenz des betrachteten Problems zu tun hat. Diese Essenz wird offenbar durch die Tatsache beschrieben, dass alle äquivalenten TMs, die das Problem lösen, eine polynomiale Laufzeit besitzen.

Die Klasse NP Wenn sich in der Klasse P die effizient lösbaren Probleme befinden, welche sind dann die schwierigen Probleme? Dies sind natürlich zunächst einmal die nicht entscheidbaren Probleme sowie diejenigen mit exponentieller Laufzeit . Aber es gibt noch eine weitere Klasse schwieriger Probleme, die gewissermaßen zwischen der Klasse P und der Klasse EXP der Probleme mit expontieller Laufzeit liegt: Die Klasse NP. Die Abkürzung NP steht für nichtdeterministisch-polynomial. Es handelt sich dabei um eine Klasse von Problemen, für die man eine nichtdeterministische Turing-Maschine braucht, um sie in polynomialer Zeit lösen zu können. Wir wir noch sehen werden, kann man sich alternativ vorstellen, dass man einen Lösungsvorschlag für ein Problem in NP von einem Orakel erhält und dann mit einer deterministischen TM in polynomialer Zeit prüfen kann, ob die Lösung korrekt ist. Eine Sprache ist in der Klasse NP, falls ihr Wortproblem von einer nichtdeterministischen Turing-Maschine mit polynomialer Laufzeit gelöst werden kann. Sowohl die Sprachen in P als auch in NP sind entscheidbar, denn wir haben in Kapitel 4 gesehen, dass nichtdeterministische TMs durch deterministische TMs simuliert werden können. Allerdings, und das ist hier entscheidend, benötigt die simulierende deterministische TM exponentiell mehr Operationen. Der Unterschied zwischen P und NP liegt also vor allem in der Laufzeit, die man zur Lösung des Wortproblems benötigt.

Zertifikate Die Klassifikation der Probleme in NP durch nichtdeterministische Turing-Maschinen mit polynomialer Laufzeit erscheint sehr abstrakt, denn schließlich gibt es in der Praxis keine nichtdeterministischen TMs. Was also bedeutet es in der Realität, wenn ein Problem in der Klasse NP ist? Wie sich zeigen wird, sind das genau die Probleme, für die Lösungen zwar schwierig (d. h. mit (vermutlich) exponentiellem Aufwand) zu finden sind, aber bei denen man einfach (d. h. mit polynomialem Aufwand) prüfen kann, ob es sich bei einem gegebenen Vorschlag tatsächlich um eine Lösung handelt. Solche Lösungsvorschläge bezeichnet man als Zertifikate: Ein Zertifikat (engl.: Witness) ist ein Wort , mit dessen Hilfe man das Wortproblem für eine Sprache und ein Wort

schnell (d. h. in polynomialer Zeit) positiv beantworten kann. Im Fall von lässt sich beispielsweise sehr einfach eine Turing-Maschine (ein so genannter Verifier) konstruieren, die überprüfen kann, ob ein bestimmter Kreis einen Hamilton-Kreis für einen Graphen darstellt. Ist ein solcher Kreis gefunden, ist klar, dass ein Hamilton-Graph ist. Kodiert man und als Wörter und , so ist ein Zertifikat für , das gewissermaßen bezeugen kann, dass ist. Wir können also alternativ auch so beschreiben:

Formalisieren wir diese Überlegungen: Ein Verifier ist eine 2-Band Turing-Maschine. verifiziert eine Sprache , falls die folgenden beiden Bedingungen erfüllt sind: 1. Für alle existiert ein Zertifikat , so dass Band 1 und den Input auf Band 2 akzeptiert. 2. Für alle den Input

gilt: Für alle auf Band 2 ab.

lehnt

den Input

den Input

auf

auf Band 1 und

Damit können wir eine alternative Charakterisierung der Klasse NP angeben:

Charakterisierung von NP durch Verifier NP ist die Menge der Sprachen, für die ein Verifier

existiert, der

in polynomialer Zeit verifiziert.

Ist nämlich eine Sprache mit einem polynomialen Verifier , so können wir eine polynomiale nichtdeterministische TM konstruieren, die genau die Wörter akzeptiert: Hat die Länge , gibt es ein dazugehöriges Zertifikat . Da polynomiale Laufzeit hat, kann der von genutzte Bestandteil von nicht beliebig lang sein, sondern es muss für irgendein sein. Wir lassen jetzt zunächst nichtdeterministisch ein Wort mit einer Maximallänge erzeugen. Danach arbeitet in derselben Weise weiter wie der Verifier mit und als Input: Falls , gilt für irgendeinen der nichtdeterministischen Berechnungswege, und wird akzeptiert. Falls , gibt es kein Zertifikat , und keiner der Berechnungswege führt zu einem Akzeptanzzustand.

Ist umgekehrt eine Sprache, die von einer polynomialen nichtdeterministischen TM akzeptiert wird, so gibt es für ein einen nichtdeterminischen Berechnungspfad der Länge , der in einen Akzeptanzzustand mündet. Dieser Pfad kann als Zertifikat mit aufgefaßt werden, indem man sich bei jedem Berechnungsschritt von die von der Maschine in gewählte Option merkt und sie als Symbol von kodiert. Ein Verifier für arbeitet dann mit und als Input deterministisch polynomial, indem er die durch eindeutig vorgebenenen Zustandsübergänge von durchführt und am Ende in einem Akzeptanzzustand endet. Ist , gibt es keinen Berechnungspfad , der in einen Akzeptanzzustand mündet, und somit auch keinen Pfad , der ein Zertifikat kodiert. Da genau wie arbeiten soll, heißt das, dass der Input für kein in einen Akzeptanzzustand führt. Wir haben damit eine andere Betrachtungsweise der Sprachen gewonnen: Wir können sie uns vorstellen als die Menge der Sprachen bzw. Probleme, für die eine Lösung nur schwer (d. h. nichtdeterministisch oder mit vermutlich exponentiellem Aufwand) zu beschaffen ist, eine gegebene Lösung aber einfach (d. h. mit polynomialem Aufwand) zu verifizieren ist. Beispiele für solche Probleme gibt es viele: Neben dem schon in Kapitel 9 erwähnten Problem, zu entscheiden, ob ein gegebener Graph einen Hamilton-Kreis enthält, ist vor allem auch das Faktorisierungsproblem von hoher praktischer Bedeutung. Das Faktorisierungsproblem besteht in folgender Aufgabe: Gegeben: Eine natürliche Zahl Gesucht: Die Primfaktoren von

. .

Wirklich schwer wird das Faktorisierungsproblem nur im Worst Case, d. h., wenn sehr groß ist und keine kleinen Primfaktoren wie 2,3,5 oder 7 enthält, sondern lediglich zwei ungefähr gleich große Primfaktoren und besitzt. In dieser Form kommt das Faktorisierungsproblem im RSA-Verschlüsselungsverfahren zur Anwendung. Bis heute ist kein polynomialer Algorithmus (d. h. polynomial bezogen auf die Bitlänge von ) gefunden worden, der die Primfaktoren zu findet. Sind aber zwei Primfaktoren als Zertifikat gegeben, so lässt sich mit einer einzigen Multiplikation durch einen Verifier prüfen, ob wirklich gilt. Das Faktorisierungsproblem lässt sich auch in einer Entscheidungsvariante formulieren, die an unser Verständnis von einem Problem als dem Wortproblem für eine Sprache besser angepaßt ist.

Das Faktorisierungsproblem in der Entscheidungsvariante ist in NP Die Sprache

ist in der Klasse NP.

Beispielsweise ist die Kodierung des Paars aber nicht, da .

, die Kodierung des Paars

Ein weiteres Problem in der Klasse NP, das SAT-Problem (SAT steht für Satisfiability) ist für unsere weiteren Untersuchungen so wichtig, dass es einen eigenen Abschnitt verdient.

Das SAT-Problem Ich möchte zu meinem Geburtstag ein paar alte Freunde einladen. Zur Auswahl stehen Alice, Bob und Carl. Leider kann ich nicht einfach alle einladen, denn es gibt ein paar zwischenmenschliche Probleme: Alice und Bob sind meine besten Freunde, und ich möchte, dass wenigstens einer von beiden kommt. Alice und Bob sind seit Kurzem ein Paar, so dass ich entweder beide oder keinen von beiden einladen kann. Bob und Carl mögen sich nicht besonders. Ich sollte also nicht beide gleichzeitig einladen. Bob und Carl sind mit meiner Frau befreundet, und sie möchte, dass ich wenigstens einen von beiden einlade. Wen sollte ich also einladen? Lassen Sie uns das Problem formalisieren, indem wir drei boolesche Variablen einführen, die jeweils die Werte true oder false annehmen können. Falls also , wird Alice zu der Party eingeladen, und falls , wird Bob nicht eingeladen usw. Mit diesen Variablen lassen sich die obigen Bedingungen als logische Ausdrücke darstellen:

Jede einzelne Bedingung muß erfüllt sein, d. h. alle logischen Ausdrücke müssen am Ende den Wert true besitzen. Das lässt sich so ausdrücken, dass wir alle vier Bedingungen über den -Operator verketten. Wir erhalten den folgenden Ausdruck:

Die Funktion ist ein Beispiel für eine boolesche Funktion (siehe auch Kapitel 12. Der Ausdruck auf der rechten Seite wird auch als boolesche Formel bezeichnet. Boolesche Funktionen sind Funktionen, die boolesche Variablen auf eine einzige abbilden:

Man kann zeigen, dass sich jede boolesche Funktion mit Hilfe einer booleschen Formel darstellen lässt, die nur die drei logischen Operatoren (AND), (OR) und (NOT) benutzt.

Darstellung boolescher Funktionen durch logische Operatoren Jede boolesche Funktion

besitzt eine Darstellung durch eine boolesche Formel, in der nur (AND), vorkommen.

(OR) und (NOT)

Zum Beweis stellen wir uns vor, sei in Form einer Wahrheitstafel gegeben. Jede Zeile der Tafel steht für eine Variablenbelegung. Insgesamt hat die Tafel also Zeilen. Jede Zeile, also jede Variablenbelegung, für die false ergibt, wird in eine -Klausel umgewandelt. In der -Klausel werden die Inputvariablen unverändert übernommen, falls sie in der Belegung false sind. Falls ein in der betreffenden Zeile true sein sollte, wird in der -Klausel die Negation der Variablen verwendet. Danach werden alle so erhaltenen -Klauseln per verknüpft. Das Verfahren funktioniert, denn durch die Übernahme der Variablen in ursprünglicher bzw. negierter Form in die -Klauseln wird sichergestellt, dass die -Klauseln genau für die Variablenbelegung, aus der sie entstanden sind, false ergeben. Die Verkettung der Klauseln per stellt sicher, dass für alle Belegungen, für die die Klauseln stehen,

false ergibt. Alle anderen Belegungen führen zu

Definition von

, in Einklang mit der

.

Als Beispiel für die Darstellung einer booleschen Funktion mittels betrachten wir eine Funktion die zwei booleschen Variablen auf ein einziges Bit abbildet:

false false

false

false true

false

true

false

true

true

true

false

und ,

Die ersten zwei Belegungen führen dazu, dass gilt. Wir brauchen also zwei -Klauseln. Aus den Wahrheitswerten der Variablen erhalten wir die Klauseln und . Wir verketten die beiden Klauseln per und ersetzen danach noch durch . Insgesamt erhalten wir die boolesche Funktion

Das Verfahren aus dem Beweis führt zu eine spezielle Form der Darstellung von booleschen Funktionen, der konjunktiven Normalform. Dabei werden einzelne Klauseln , die ihrerseits nur aus Variablen, ihrer Verneinung (man spricht zusammenfassend auch von Literalen) sowie dem -Operator bestehen, per (also per Konjunktion verknüpft:

Kehren wir zurück zu unserem ursprünglichen Geburtstagsproblem: Unsere Aufgabe besteht darin, eine Belegung für die drei Variablen mit true oder false zu finden, so dass . Sie haben sicher schnell herausgefunden, dass die Lösung des Problems darin besteht, Alice und Bob einzuladen und Carl nicht, also . Tatsächlich gilt . Diese Art von Problemen ist allgemein für boolesche Funktionen interessant. Man nennt sie Satisfiability-Probleme oder kurz SAT-Probleme. Das SAT-Problem ist das folgende Problem: Gegeben: Eine boolesche Funktion mit Inputvariablen

. , so dass

Gesucht: Eine Belegung der Variablen .

In der Entscheidungsvariante ist SAT in der Klasse NP. Da eine boolesche Funktion in vielen Formen gegeben sein kann (z.B. duch direkte Angabe der Funktionswerte), ist die Entscheidungsvariante mit Hilfe von booleschen Formeln definiert. So ist sichergestellt, dass die syntaktische Korrektheit der booleschen Formel durch eine kontextfreie Grammatik überprüft werden kann.

SAT ist in NP Wir betrachten das Alphabet

.

Die Sprache

ist in der Klasse NP.

Um einen polynomialen Verifier für zu konstruieren, überlegen wir uns zunächst eine kontextfreie Grammatik , die prüft, ob eine syntaktisch korrekt gebaute boolesche Formel kodiert. Eine boolesche Formel, bestehend aus den booleschen Variablen , muss korrekt geklammert sein. Die einzelnen Teile der Formel sind durch und miteinander verknüpft. Zudem kann auch der -Operator auf einen Teilausdruck angewendet werden. sieht damit folgendermaßen aus: , wobei

Mit Hilfe des CYK-Algorithmus (s. Kapitel 7) lässt sich nun eine 2-Band TM bauen, die in Schritten prüft, ob das Inputwort auf Band 1 von dieser Grammatik erzeugt wird, also eine syntaktisch korrekt kodierte boolesche Formel darstellt. Ist dies der Fall, geht die TM in einen Zustand über, der die Überprüfung eines auf Band 2 gegebenen Zertifikats (d. h. einer gegebenen Variablenbelegung) startet. Aus wird die Belegung der Variablen gelesen. Ist beispielsweise bzw. , so

wird jedes Vorkommen der Variablen in durch 1 ersetzt. So fährt man fort, bis alle Variablen durch die in vorgegebenen Wahrheitswerte ersetzt sind. Danach kann die TM den Wert von für die Belegung aus berechnen. Diese Verifikation von geschieht in polynomialer Zeit, so dass als Verifier für abgesehen werden kann.

Reduktion Die große Bedeutung des SAT-Problems liegt in seiner Flexibilität. Durch eine geeignete Transformation lässt sich das Lösen vieler anderer Problem auf die Lösung des SATProblems abbilden. Die Transformation eines Problems auf ein anderes, eventuell leichteres Problem bezeichnet man als Reduktion. Damit ist genau das Folgende gemeint:

und

seien Sprachen.

heißt auf reduzierbar, in Zeichen , falls es eine Turingberechenbare Funktion gibt, so dass gilt:

Ist in polynomialer Zeit berechenbar, dann heißt reduzierbar, in Zeichen .

auf

polynomial

Gilt , dann können wir das Wortproblem »Ist ?« für lösen, indem wir zunächst auf das Kandidatenwort anwenden und dann das Wortproblem für und lösen. Deshalb kann man anstatt auch sagen »Das Wortproblem für ist nicht schwerer als das für « oder noch kürzer » ist nicht schwerer als «, falls man nicht zwischen dem Wortproblem für und selbst unterscheidet. Abbildung 10.1 verdeutlicht den durch vermittelten Zusammenhang zwischen und , falls .

Abbildung 10.1: Das Wortproblem für

wird durch auf das für

reduziert.

Ein ungerichteter Graph heißt 3-färbbar, falls sich jeder Knoten so mit einer der drei Farben färben lässt, dass jede Kante verschieden farbige Knoten miteinander verbindet. Eine solche Färbung nennt man auch zulässig. Beim dazugehörigen Entscheidungsproblem 3-Färbbarkeit bekommt man also einen Graphen als Input und muß entscheiden, ob 3-färbbar ist. Abbildung 10.2 zeigt jeweils ein Beispiel für einen 3-färbbaren Graphen und einen nicht 3-färbbaren Graphen.

Abbildung 10.2: Ein 3-färbbarer und ein nicht 3-färbbarer Graph

Das 3-Färbbarkeitsproblem kann auf SAT reduziert werden: Dazu weisen wir jedem Knoten drei boolesche Variablen zu. Falls beispielsweise grün gefärbt ist, gilt . Bei einem färbbaren Graphen dürfen die Variablen benachbarter Knoten , also solche mit für alle drei Farben nicht gleichzeitig true sein, mit anderen Worten: Die -Verknüpfung der betreffenden Variablen muß false ergeben. Wir erhalten die Bedingungen

Zudem muss jeder Knoten

genau eine Farbe haben:

Daraus lässt sich einfach eine boolesche Funktion Färbung den Wert true besitzt. Ist durch

bauen, die bei einer zulässigen , so ist gegeben

Hier ein konkretes Beispiel für einen einfachen 3-färbbaren Graphen und die dazugehörige boolesche Funktion:

Überzeugen Sie sich selbst davon, dass und

z. B. für die Belegung .

SAT, KNF-SAT und 3-SAT Als weiteres wichtiges Beispiel für eine Reduktion betrachten wir in diesem Abschnitt die konjunktive Normalform (KNF) einer booleschen Funktion. Zur Erinnerung: Eine boolesche Funktion befindet sich in konjunktiver Normalform, falls sie aus Klauseln besteht, die über den -Operator verknüpft sind. Die einzelnen Klauseln wiederum dürfen nur aus einzelnen Variablen , ihrer Verneinung bzw. und ihrer Verknüpfung durch den -Operator bestehen. Beispielsweise ist die Funktion

in KNF. Wir haben oben gesehen, dass sich jede boolesche Funktion in KNF darstellen lässt. Allerdings erfordert der Algorithmus, den wir oben betrachtet haben, für alle möglichen Belegungen der Input-Variablen auszuwerten, hat also exponentielle Komplexität in der Anzahl der Variablen. Das SAT-Problem für eine boolesche Funktion in KNF wird auch KNF-SAT genannt. Wir zeigen jetzt, dass eine boolesche Funktion polynomialer Zeit in eine erfüllbarkeitsäquivalente Funktion werden kann, das bedeutet: ist erfüllbar genau dann, wenn enthält die dafür konstruierte Formel zusätzliche Variablen

von einer TM in in KNF überführt erfüllbar ist. Allerdings .

Möchte man nur mit den ursprünglichen Variablen auskommen, kann es passieren, dass die resultierende Formel in KNF exponentiell viele (d. h. ) Klauseln enthält. Das wäre natürlich ein Problem, weil schon das Aufschreiben dieser Formel exponentiell viel Zeit in Anspruch nehmen würde. Da sich das SAT-Problem für aber auch mit Hilfe der erfüllbarkeitsäquivalenten Funktion beantworten lässt, gilt trotzdem:

SAT ist nicht schwerer als KNF-SAT. SAT

KNF-SAT

Die Abbildung einer booleschen Funktion

auf

in KNF erfolgt in zwei Schritten.

Zunächst werden mit Hilfe der De Morganschen Regeln

die -Zeichen nach innen in die Klauseln gezogen. Beispielsweise wird so aus der Funktion die äquivalente Funktion

Es bleibt zu klären, ob eine TM dazu in polynomialer Zeit in der Lage ist. Dazu kann die TM zunächst den Ausdruck auf dem Eingabeband durchlaufen und jede Variable , der ein -Zeichen vorangeht, durch ersetzen. Findet die TM hingegen die

Kombination vor, so wird die dazugehörige schließende Klammer gesucht und durch ersetzt. In einem zweiten Durchlauf werden, sobald (aber noch nicht die dazugehörige schließende Klammer) gelesen wurde, gemäß der De Morganschen Regeln durch , durch , durch und durch ersetzt. Wird eine weitere Negation vorgefunden, wird bis zum schließenden nichts verändert. Allgemein geprochen, wechselt die TM bei Lesen eines ersten in einen NegierZustand , der die angesprochenen Veränderungen durchführt. Wird vor der schließenden Klammer ein weiteres gelesen, wechselt die TM in einen reinen Lesezustand und beim eventuellen Lesen einer dritten Klammer wieder in usw. Ist die Eingabe komplett abgearbeitet, können schließlich in einem dritten Durchlauf alle -Zeichen entfernt werden. Das folgende Beispiel soll verdeutlichen, wie sich die Situation auf dem Band während der drei Durchläufe verändert:

Für unsere Beispiel-Funktion

ergibt sich der folgende Ablauf:

Im zweiten Schritt müssen wir dafür sorgen, dass alle Klauseln durch -Operatoren verknüpft sind. Dies erfolgt durch die Einführung geeigneter zusätzlicher Hilfsvariablen. Die Grundlage hierfür bildet der folgende Hilfssatz: und seien zwei Formeln, die aus booleschen Variablen gebildet sind. Dann sind die Formeln und erfüllbarkeitsäquivalent, wobei eine zusätzliche boolesche Variable ist. Denn: Ist nicht erfüllbar, dann sind und beide nicht erfüllbar. Für jede Belegung von ist dann entweder oder nicht erfüllbar, also ist auch nicht erfüllbar. Durch Kontraposition erhalten wir daraus die Aussage:

Ist

, erfüllbar, so können wir drei Fälle unterscheiden: 1.

und sind beide erfüllbar. Dann ist auch unabhängig von der Belegung für .

2.

erfüllbar, sowohl

3.

nicht erfüllbar. Mit der Belegung als auch erfüllbar.

nicht erfüllbar,

erfüllbar, sind dann

erfüllbar. Analog zum zweiten Fall ist dann mit der Belegung .

Also ist in allen drei Fällen

erfüllbar, und es gilt:

und insgesamt Diesen Hilfssatz nutzen wir, um bei jeder auftretenden -Verknüpfung mittels einer zusätzlichen neuen Variablen eine -Verknüpfung einzuführen. Für unsere BeispielFunktion haben wir mittlerweile die -Operatoren entfernt. Jetzt entfernen wir über den Hilfssatz auch die -Operatoren zwischen den Klauseln. ist erfüllbarkeitsäquivalent zu

Ausmultiplizieren nach dem Distributivgesetz der booleschen Algebra (siehe Kapitel 12) sorgt nun dafür, dass innerhalb der Klauseln nur noch der

-Operator auftaucht:

Damit ist erfolgreich auf in KNF transfomiert. Aber auch in diesem Schritt stellt sich wieder die Frage, ob er sich in polynomialer Zeit auf einer TM realisieren lässt. Dazu stellen wir uns einen Ableitungsbaum für den fraglichen Ausdruck vor. Wir können davon ausgehen, dass es sich dabei nach dem Entfernen der -Zeichen um einen Binärbaum handelt. Hier der Ableitungsbaum für :

Abbildung 10.3: Syntaxbaum für

Durchläuft man den Ableitungsbaum von links unten aus nach oben, benötigen wir für jeden -Knoten, auf den wir treffen, eine neue Variable , die wir mit den bereits gefundenen Ausdrücken per verknüpfen. Befindet sich der Ausdruck im linken Teilbaum unterhalb des -Knotens, benötigen wir , ansonsten . Im Beispiel treffen wir zunächst auf , dann auf , dann auf . wird also mit verknüpft und mit . Als Zwischenergebnis für den linken Teilbaum erhalten wir den Ausdruck . Da sich dieser Ausdruck im Baum wiederum links vom -Wurzelknoten befindet, wird er als Ganzes mit verknüpft und der Ausdruck des rechten Teilbaums mit . Insgesamt erhält man den Ausdruck

aus dem man durch Anwenden des Distributivgesetzes einen Ausdruck in KNF erhält. Um dieses Vorgehen auf einer TM zu simulieren, durchlaufen wir zunächst den Eingabestring von links nach rechts. Dabei nummerieren wir die -Symbole, die wir finden, und die Klammerpaare. Aus dem String wird dadurch der String

Wir durchlaufen diesen String erneut von links nach rechts. Zu jedem Literal bzw. jeder Klausel, die wir finden, können wir nun entscheiden, zu welchem der -

Symbole sie gehört und ob sie in den linken oder rechten Teilbaum des -Symbols gehört: Beispielsweise gehört im String oben zu das Klammerpaar . Wenn also eine Klausel oder ein Literal in einem geöffneten Klammerpaar, das zu gehört, vor dem Operator gelesen wird, wird sie mit verknüpft. Wird in einem zu geöffneten Klammerpaar nach gelesen, wird es entsprechend mit verknüpft. Im Beispiel erhalten wir so zunächst

und schließlich

In einem weiteren Durchlauf entfernen wir alle Indizes von den Klammern und Operatoren, bevor wir für jeden -Operator außerhalb einer Zweierklausel das Distributivgesetz auf den String anwenden. In einer Formel mit Variablen können höchstens -Operatoren vorkommen. Für jeden -Operator haben wir für eine neue Variable hinzugefügt, so dass höchstens -Operatoren in vorkommen können. Für jeden dieser Operatoren müssen wir einmal den Ableitungsbaum durchlaufen, um die Ersetzung gemäß dem Distributivgesetz vorzunehmen, so dass der Aufwand insgesamt polynomial bleibt. Durch die in obigem Beweis vorgestellten Schritte konnten wir unsere Beispiel-Funktion auf eine erfüllbarkeitsäquivalente Funktion in KNF transformieren:

Wie man sieht, haben die Klauseln unterschiedliche Längen, denn sie bestehen aus zwei oder drei Literalen. Durch weitere Transformationsschritte ist es möglich, dafür zu sorgen, dass alle Klauseln die Länge drei haben. Man spricht dann vom 3-KNF. Besteht eine Klausel nur aus einem Literal , lässt sie sich durch die Einführung einer Zusatzvariablen auf zunächst Länge zwei bringen:

Genauso lassen sich Klauseln der Länge zwei auf Länge drei bringen:

Für Klauseln die aus

der Länge führen wir zusätzliche Variablen ein. Die Klausel wird nun ersetzt durch Teilklauseln bestehende 3-KNF Klausel

Wir müssen uns überlegen, dass

und

logisch gleichwertig sind, d. h., dass gilt:

Beginnen wir mit dem Fall, dass erfüllt ist. Dann muss es mindestens ein geben. Ist dies oder , ergibt die erste Teilklausel von ebenfalls true. Die restlichen Teilklauseln von lassen sich dann durch erfüllen. Ist für ein , bedeutet dies, dass die te Klausel den Wert true ergibt, unabhängig von den Wahrheitswerten von und . Wir setzen deshalb . Somit sind die ersten Klauseln erfüllt. Durch = false lassen sich auch die restlichen Klauseln von erfüllen. Sei nun umgekehrt mit einer bestimmten Belegung der . Die Frage ist, ob dies möglich ist, wenn gleichzeitig ist. Nehmen wir also an. Dann müssen alle false ergeben. Betrachtet man jetzt die ersten Teilklauseln von , zeigt sich, dass aus folgt: . Mit dieser Belegung wird aber die letzte Teilklausel von . Widerspruch! Mit ganz ähnlichen Argumenten wie beim Beweis des Satzes zuvor überlegt man sich, dass diese Umformungen von einer TM in polynomialer Zeit ausgeführt werden können. Damit haben wir gezeigt:

KNF-SAT ist nicht schwerer als 3-SAT KNF-SAT

3-SAT

Wir transformieren unsere Beispielfunktion

Wir ersetzen

, die bereits in KNF ist, auf 3-KNF:

mit der Hilfsvariablen durch , und wir ersetzen durch . Somit erhalten wir als 3-KNF von

:

Reduktion und Entscheidbarkeit Der große Nutzen von Reduktionen besteht darin, dass sich mit ihrer Hilfe der Entscheidbarkeits-Status von unbekannten Problemen auf den von bekannten Problemen zurückführen lässt:

Reduktion von Entscheidungsproblemen und Ist Ist Ist Ist

seien Sprachen. Dann gilt: entscheidbar und gilt P und gilt

, so ist auch , so ist auch

unentscheidbar und gilt P und gilt

P.

, so ist auch

, so ist auch

entscheidbar.

unentscheidbar.

P.

Die Beweise dieser vier wichtigen Aussagen, die den eigentlichen Grund dafür darstellen, dass man sich mit Reduktionen befaßt, sind recht simpel: Ist entscheidbar und gilt mit einer Abbildung , so kann man entscheiden, indem man für ein Kandidatenwort zunächst berechnet und dann entscheidet, ob . Damit ist die erste Aussage bewiesen. Gilt mit einem , das zwischen und vermittelt, so kann man zunächst das Wortproblem für (bei einem Inputwort der Länge ) auf das Wortproblem für in Schritten reduzieren. Da , kann das Wortproblem für mit dem Inputwort in Schritten gelöst werden, wobei die Länge von ist. Wegen muss aber auch die Länge von in der Klasse sein. Insgesamt erhält man einen Aufwand von Schritten für das Wortproblem von . Ist unentscheidbar und gilt mit einer Abbildung , so muss auch unentscheidbar sein. Wäre nämlich entscheidbar, so könnte man über die Abbildung auch entscheiden. Widerspruch!

Wäre P und gilt auch das Wortproblem für

mit einer Abbildung , dann ließe sich in polynomialer Zeit entscheiden. Widerspruch!

Die folgende Aussage ist eine einfache Folgerung aus dem obigen Satz. Mit ihr lassen sich auch Beweisketten über mehrere Sprachen hinweg bilden:

Transitivität der »nicht schwerer als«-Relation Die Relationen

und

Gilt nämlich

für Funktionen zwischen und

sind transitiv, d. h., es gilt:

und

, so bedeutet das für ein Wort

. Also kann die verkettete Funktion vermittelnde Funktion angesehen werden.

:

als die

Gilt außerdem und , so können die Funktionen und in polynomialer Zeit berechnet werden: und , wobei die Länge der Wortes ist. Die Länge des Wortes ist damit wie selbst in und die Anwendung von auf erfordert maximal Schritte. Hinzu kommen noch die Schritte für die Berechnung von . Insgesamt aber erfordert die Berechnung von polynomial viele Schritte, so dass gilt. Mit den Ergebnissen des letzten Abschnitts und der Transitivitätseigenschaft der »nicht schwerer als«-Relation können wir nun noch festhalten:

SAT ist nicht schwerer als 3-SAT SAT

3-SAT

,

Aufgaben zu P und NP Als kleine Hilfe, so zur Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wiley-vch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. 1. Finden Sie einen effizienten Algorithmus zum Lösen von 2-Färbbarkeit und zeigen Sie . 2. Geben Sie die passenden booleschen Funktionen zu den Graphen aus Abbildung 10.2 explizit an. 3. Die XOR-Verknüpfung zweier boolescher Variablen ist durch die folgende Tabelle definiert:

true

true

false

true

false

true

false true

true

false false

false

Stellen Sie die XOR-Verknüpfung mit Hilfe von

und

dar.

4. Finden Sie zu der boolesche Funktion

eine erfüllbarkeitsäquivalente boolesche Funktion

in 3-KNF.

Kapitel 11

NP-Vollständigkeit IN DIESEM KAPITEL lernen Sie den Satz von Cook kennen stelle ich Ihnen Beispiele NP-vollständiger Sprachen vor gibt es eine Einführung in den Quantencomputer

Das Hauptziel dieses Kapitels ist eine Beweisskizze des berühmten Satzes von Cook. Dieser Satz besagt, dass das SAT-Problem aus dem letzten Kapitel so schwierig ist, dass jedes andere Problem aus der Klasse NP darauf zurückgeführt werden kann. Die Beweisskizze ersetzt Turing-Maschinen durch einen äquivalenten Schaltkreis aus logischen Gates und zeigt dadurch noch einmal auf, dass Turing-Maschinen tatsächlich ein geeignetes Modell für unsere Computer darstellen.

Der Satz von Cook Probleme aus der Klasse NP sind schwierig zu lösen, da man bislang trotz intensiver Suche keine polynomialen Algorithmen zu ihrer Lösung gefunden hat. Es scheint, als würde man zu einer Lösung in Polynomzeit eine nichtdeterministische Turing-Maschine benötigen. Auf der anderen Seite hat sich das SAT-Problem bzw. das 3-SAT-Problem aus dem letzten Kapitel als sehr flexibel erwiesen. Viele andere Probleme aus der Klasse NP lassen sich auf das 3-SAT-Problem reduzieren, d. h.: Wenn man das 3-SAT-Problem effizient, also in polynomialer Zeit lösen kann, ließen sich auch alle diese anderen Probleme effizient lösen. Tasächlich liegt das 3-SAT-Problem gewissermaßen im harten Kern der Klasse NP, da sich alle Probleme aus NP auf 3-SAT reduzieren lassen. Solche Probleme im harten Kern von NP bezeichnet man als NP-vollständig. Die NP-harten Probleme bilden eine Obermenge der NP-vollständigen Probleme: Auch auf sie lassen sich alle Probleme aus NP in Polynomzeit reduzieren. Die NP-harten Probleme müssen aber nicht notwendigerweise selbst in NP liegen. Eine Sprache und

heißt NP-vollständig, falls

Eine Sprache

heißt NP-hart, falls

Das Travelling-Salesman-Problem (TSP) in der Optimierungsvariante (siehe Kapitel 14) bildet ein Beispiel für ein NP-hartes Problem. Wir werden später noch sehen, dass sich alle Probleme in NP in Polynomzeit auf das TSP reduzieren lassen. Bis heute hat jedoch noch niemand einen Weg gefunden, für einen vorgelegten Kreis durch einen gewichteten Graphen (also ein Zertifikat, vgl. Kapitel 10) in Polynomzeit zu entscheiden, ob er tatsächlich die optimale Lösung darstellt. Wir werden uns im Folgenden aber auf NP-vollständige Probleme konzentrieren, also auf Probleme in NP, auf die sich alle anderen Probleme in NP in polynomialer Zeit reduzieren lassen. Hierbei ist es wichtig, zumindest ein Anfangsbeispiel eines NP-vollständigen Problems zu haben. Für andere Probleme lässt sich die NP-Vollständigkeit dann zeigen, indem man das Anfangsbeispiel auf das andere Problem reduziert. Das 3-SAT-Problem bildet ein solches Anfangsbeispiel. Diese enorm wichtige Tatsache ist der Inhalt des Satzes von Cook:

3-SAT ist NP-vollständig Für alle Sprachen

gilt:

Das Wortproblem für jede Sprache , die von einer nichtdeterministischen TuringMaschine in polynomialer Zeit entscheidbar ist, soll sich also in polynomialer Zeit auf das 3-SAT-Problem zurückführen lassen, das wir in Kapitel 10 eingeführt haben. Wie um alles in der Welt soll das gehen? Das war zumindest meine Reaktion, als ich diesen Satz das erste Mal las: Wie kann ein einzelnes Problem so schwer sein, dass sich alle anderen schweren Probleme darauf zurückführen lassen? Ein formal korrekter Beweis dieses Satzes ist mit großem formelmäßigem Aufwand verbunden, der es dem Leser schwer macht, das eigentlich dahinter stehende Prinzip zu erkennen. Ich möchte Ihnen hier deshalb nur eine Beweisskizze präsentieren, in der nicht alle Details formal korrekt bewiesen werden, von der ich aber hoffe, dass sie eher durchschaubar ist. Diese Beweisskizze reduziert Turing-Maschinen zunächst auf äquivalente Schaltkreise, die dann ihrerseits auf boolesche Formeln in 3-KNF reduziert werden. Somit wird auch ein neuerliches Schlaglicht auf die Universalität von TuringMaschinen geworfen.

Boolesche Schaltkreise und deterministische TuringMaschinen Zu einer Sprache gehört immer bekanntlich eine NTM , die das Wortproblem für löst: Genau dann, wenn , geht in einen akzeptierenden Zustand über. Wir werden nun zunächst die Arbeitsweise einer deterministischen TM mit Hilfe eines so genannten booleschen Schaltkreises simulieren und die Konstruktion dann auf nichtdeterministische Maschinen ausdehnen. Ein boolescher Schaltkreis ist ein mathematisches Modell für digitale Schaltungen. In solchen Schaltungen, wie man sie im Miniaturformat auch auf Computerchips vorfindet, kommen bekanntlich so genannte logische Gatter zum Einsatz. Diese verarbeiten eine oder zwei boolesche Input-Variablen zu einer Output-Variablen. Die für uns wichtigen Gatter sind das AND-Gatter , das OR-Gatter und das NOT-Gatter . Wir fassen diese Gatter nun als Knoten in einem gerichteten, zusammenhängenden kreisfreien Graphen auf, der den Schaltkreis symbolisiert. Zeichnet man diese Graphen, entsteht eine baumartige Struktur wie in Abb. 11.1. Die Blätter des Baums bilden die booleschen Input-Variablen . Diese werden von den Gattern verarbeitet und eine Ebene weiter gereicht. An der Wurzel des Baums steht eine einzige Variable , die Output-Variable des Schaltkreises. Hier als Beispiel ein einfacher boolescher Schaltkreis mit der OutputVariablen .

Abbildung 11.1: boolescher Schaltkreis für

.

Auch für boolesche Schaltkreise lässt sich ein Entscheidungsproblem definierten: Das CIRCUIT-SAT-Problem ist das folgende Problem: Gegeben: Ein boolescher Schaltkreis und der Output-Variablen .

mit Inputvariablen

Gesucht: Eine Belegung der Inputvariablen, so dass

.

Das CIRCUIT-SAT-Problem hat bereits große Ähnlichkeit mit dem eigentlichen SATProblem. Wenn es uns also gelingt, eine (deterministische oder nichtdeterministische) TM mit Hilfe von booleschen Schaltkreisen zu simulieren, und das mit einer Anzahl Gatter, die polynomial von der Anzahl der Inputbits für abhängt, haben wir einen großen Teil des Weges zurückgelegt. Auf diesem Weg sind jedoch zwei formale Hürden zu überwinden: kann Inputwörter mit unterschiedlichen Längen verarbeiten. Die Zahl der Inputvariablen für einen booleschen Schaltkreis ist jedoch fest. Wir können deshalb nicht erwarten, mit einem einzigen Schaltkreis simulieren zu können. Vielmehr müssen wir eine ganze Familie von Schaltkreisen betrachten, bei denen jeder Schaltkreis Inputwörter der Länge verarbeiten kann. Genau genommen simulieren wir also nicht durch einen einzelnen Schaltkreis, sondern durch eine Familie von Schaltkreisen. Die drei Arten von Gates, die einen booleschen Schaltkreis bilden, haben entweder zwei oder eine Inputvariable bzw. . Für die Simulation einer TM brauchen wir aber Gates, die auf einem größeren Zeichenvorrat arbeiten und mehr als eine Inputvariable verabeiten können. Solche verallgemeinerten Gates stellen also Funktionen dar, wobei aus mehr als zwei Symbolen bestehen kann. Die Frage ist nun, ob sich ein Schaltkreis aus verallgemeinerten Gates prinzipiell auch durch einen booleschen Schaltkreis ersetzen lässt. Dazu nehmen wir zunächst an, dass sich jedes Symbol durch einen Bitstring kodieren lässt. Solche Kodierungen lassen sich immer finden, wenn groß genug ist. Jetzt können wir jede Verbindung im verallgemeinerten Schaltkreis durch Verbindungen ersetzen, die jeweils ein Bit transportieren. Jedes einzelne verallgemeinerte Gate wird so zu einem Gate . Man kann zeigen, dass sich ein solches Gate durch boolesche Schaltkreise mit jeweils binären Inputvariablen ersetzen lässt. Nach diesen Vorüberlegungen sind wir bereit, eine TM durch eine Familie von booleschen Schaltkreisen zu simulieren. Wir beginnen mit dem einfacheren Fall einer deterministischen TM . Bevor wir beginnen, machen wir zwei Annahmen über , die uns die Arbeit erleichtern sollen, aber die eigentliche Arbeitsweise von nicht betreffen: Wenn einen akzeptierenden Zustand erreicht, bleibt läuft an den linken Wortrand zurück.

nicht stehen, sondern

Der linke Wortrand des Eingabewortes wird vom Schreib/Lesekopf nicht

überschritten. Die erste Annahme lässt sich leicht durch Hinzunahme eines weiteren Zustands realisieren, der an den linken Wortrand zurückläuft. Die zweite Annahme wird nicht von allen unseren Beispiel-TMs aus Kapitel 4 erfüllt. Beispielsweise kann es sein, dass eine TM, die 1 zu einer binären Inputzahl addiert, auch die Zelle links vom Eingabewort beschreibt, um einen Übertrag aus der ersten Stelle zu realisieren. Allerdings ist es so, dass sich links vom Eingabewort keine relevanten Informationen befinden können (wenn es so wäre, wären sie ein Teil des Eingabeworts). Es gibt also keinen Grund, den Inhalt dieser Zellen zu lesen. Benötigt eine TM mehr Platz auf dem Eingabeband für das Schreiben von Informationen, kann sie hierfür den rechten Teil des Eingabebands hinter dem Eingabewort nutzen. Wir illustrieren die Idee der Simulation durch einen booleschen Schaltkreis anhand einer einfachen DTM, die prüft, ob das Eingabewort eine gerade Anzahl von 1 enthält. Beachten Sie dabei, dass diese Maschine gemäß unserer Vereinbarung an den Wortanfang zurückläuft, wenn sie den Endzustand erreicht hat. Offenbar hat die Maschine in Abbildung 11.2 eine Zeitkomplexität von . Lassen Sie uns die Arbeit dieser TM anhand der zeitlichen Veränderung des Ein/Ausgabebands, des Zustands und der Position des Schreib-/Lesekopfs in Abbildung 11.3 nachvollziehen.

Abbildung 11.2: Eine TM, die

entscheidet

Abbildung 11.3: Zeitliche Abfolge der Situation auf dem Ein-/Ausgabeband

Die Verarbeitung eines Eingabeworts der Länge drei durch diese spezielle TM lässt sich anhand eines -Rasters nachvollziehen, dessen Zeilen für die sechs Zeitschritte stehen. Die Zellen des Rasters zeigen für eine bestimmte Zelle zu einem bestimmten Zeitpunkt auf dem Ein-/Ausgabeband, welches Zeichen dort aktuell steht, ob der Schreib/Lesekopf auf dieser Zelle steht und in welchem Zustand sich die TM befindet. Kodiert werden diese Informationen entweder durch ein Symbol aus dem Bandalphabet oder (falls sich der Schreib-/Lesekopf an dieser Stelle befindet) durch ein Paar , bestehend aus einem Zustand und einem Symbol . Hat allgemein die TM eine Laufzeit , so benötigen wir ein Raster mit Zeilen und Spalten, also insgesamt Zellen. Wir simulieren jetzt die Arbeit der TM, indem wir jeden Platz im Raster durch ein verallgemeinertes Gate füllen. Weil ein Arbeitsschritt der TM im Allgemeinen durch drei Zellen auf dem Band beeinflusst wird (die Zelle, auf dem aktuell der Schreib/Lesekopf steht sowie deren linker und rechter Nachbar), lassen sich die verallgemeinerten Gates als Funktionen auffassen, wobei . Um zu verstehen, wie ein solches Gate arbeitet, vergrößern wir in Abbildung 11.4 einen Teilbereich von Abbildung 11.3.

Abbildung 11.4: Arbeitsweise eines verallgemeinerten Gates

Ein Gate erhält seinen Input immer aus den drei (bzw. zwei, wenn es sich am linken oder rechten Rand des Rasters befindet) über ihm liegenden Zellen im Raster, und befüllt immer nur die unmittelbar unter ihm liegende Zelle. In dem in Abb. 11.4 dargestellten Fall gilt also . Wir können die Arbeitsweise eines solchen Gates aber auch ganz allgemein mit Hilfe der Übergangsfunktion der TM angeben. Dazu betrachten wir die drei Inputvariablen des Gates und unterscheiden drei Fälle danach, welche der Inputvariablen in der Menge liegt. Ein vierter Fall ergibt sich aus der Situation, wenn alle Inputvariablen aus dem Bandalphabet kommen. : In diesem Fall ist der Schreib-/Lesekopf auf der linken der drei Inputzellen des Gates. Das Gate befindet sich also rechts vom Schreib-/Lesekopf. Falls sich dieser nach rechts bewegt, muss das Gate einen Wert gemäß der Übergangsfunktion ausgeben. Dieser Wert setzt sich zusammen aus dem aktuellen Zustand und dem aktuellen Zeichen direkt über dem Gate. Bewegt sich der Schreib-/Lesekopf nicht nach rechts, wird der direkt über dem Gate stehende Wert ausgegeben.

: In diesem Fall befindet sich das Gate direkt unterhalb vom Schreib-/Lesekopf. Falls sich dieser nicht bewegt, muss das Gate einen Wert gemäß der Übergangsfunktion ausgeben. Wenn sich der Kopf von der aktuellen Zelle weg bewegt, muss der vom Kopf dort neu geschriebene Wert ausgegeben werden:

: In diesem Fall befindet sich das Gate links vom Schreib-/Lesekopf. Falls sich dieser nach links bewegt, muss das Gate einen Wert gemäß der Übergangsfunktion ausgeben. Ansonsten wird der über dem Gate stehende Wert ausgegeben.

: In diesem Fall steht der Schreib-/Lesekopf der TM auf keiner der drei Inputzellen des

Gates. Deshalb wird auch die unmittelbar über dem Gate stehende Zelle nicht durch die Arbeit der TM beeinflusst, und das Gate kann einfach ausgeben:

In ganz ähnlicher Weise kann man die Gates spezifizieren, die sich in der ersten Spalte am linken Rand oder in der letzten Spalte am rechten Rand des Rasters befinden und deshalb nur zwei Inputvariablen zu verarbeiten haben. Es bleibt noch, ein Ausgangsgate zu spezifizieren, das dafür sorgt, dass der aus den Gates gebildete boolesche Schaltkreis genau dann ausgibt, wenn das Inputwort . Da sich nach unserer Vereinbarung die TM immer an den linken Rand des Eingabeworts bewegt, sobald ein akzeptierender Zustand erreicht wurde, muss sich auch am linken Rand des Rasters aufhalten, genauer gesagt an Position , wenn die TM eine Laufzeit besitzt. Demnach hat sie zwei Inputvariablen , wobei die Outputvariable des Gates unmittelbar oberhalb von darstellt. Falls das Inputwort von akzeptiert wird, kommt diese Variable aus , d. h., der Schreib-/Lesekopf befindet sich nach Schritten am linken Wortrand, und der betreffende Zustand ist ein akzeptierender Zustand. Wir definieren deshalb:

Damit haben wir bis jetzt gezeigt:

wobei

ein verallgemeinerter boolescher Schaltkreis ist. Man könnte auch sagen:

ist genau dann in

, wenn

erfüllbar ist.

Jeder der verallgemeinerten Schaltkreise enthält verallgemeinerte Gates. Jedes einzelne dieser verallgemeinerten Gates kann durch eine konstante Anzahl von AND, OR und NOT-Gattern ersetzt werden, und somit kann jeder einzelne verallgemeinerte Schaltkreis durch einen äquivalenten booleschen Schaltkreis ersetzt werden, der ebenfalls Gates enthält. Insgesamt können wir eine deterministische TM mit Laufzeit durch eine Familie von booleschen Schaltkreisen simulieren, in der jeder Schaltkreis eine Anzahl Gates in der Größenordnung enthält.

Boolesche Schaltkreise und nichtdeterministische TuringMaschinen Zur Erinnerung: Eine nichtdeterministische TM hat die Möglichkeit, sich in jedem

Arbeitsschritt zwischen verschiedenen Verhaltensalternativen »zu entscheiden«. Beispielsweise könnte für einen bestimmten Zustand und ein Symbol gelten:

Aufgrund der Verhaltensalternativen in jedem Schritt entsteht ein Baum mit der Startkonfiguration an der Wurzel und exponentiell vielen alternativen Berechnungspfaden. Ein Wort wird von einer solchen TM akzeptiert, falls mindestens einer der Berechnungspfade in eine Konfiguration mit einem akzeptierenden Zustand mündet. Wir können diesen Berechnungspfad beschreiben, indem wir uns bei jedem Knoten im Baum die richtige Alternative merken und sukzessive in einem Wort speichern. Bei Berechnungsschritten und jeweils zwei Alternativen in jedem Schritt entsteht so beispielsweise ein Wort . Wir haben diese Idee bereits einmal in Kapitel 4 benutzt, als wir gezeigt haben, dass man zu einer nichtdeterministischen TM immer eine äquivalente deterministische TM finden kann, und verwenden sie nun wieder. Um auch nichtdeterministische TMs durch boolesche Schaltkreise simulieren zu können, erweitern wir die verallgemeinerten Gates, die wir oben definiert haben, so dass sie verschiedene alternative Verhaltensweisen der TM simulieren können. Welches Verhalten konkret von einem verallgemeinerten Gate ausgeführt wird, wird durch eine weitere Inputvariable spezifiziert, die festlegt, welche der Alternativen vom Gate realisiert werden soll (s. Abbildung 11.5). Im Folgenden gehen wir der Einfachheit halber davon aus, dass die TM in jedem Berechnungsschritt die Wahl zwischen zwei alternativen Berechnungswegen hat. Verallgemeinerte Gates mit noch mehr Alternativen lassen sich analog konstruieren.

Abbildung 11.5: Alternative Arbeitsweisen eines verallgemeinerten Gates zur Simulation von nichtdeterministischen TMs

Für die beiden in Abbildung 11.5 gezeigten Alternativen würde man beispielsweise festlegen:

oder

Aus den so definierten erweiterten Gates lässt sich wieder, wie oben für eine deterministische TM beschrieben, ein verallgemeinerter Schaltkreis bauen, der Inputwörter der Länge verarbeiten kann. Wie oben beschrieben, werden die zu einem Wort zusammengefasst, das zusammen mit dem zu entscheidenden Wort als Inputwort für dient. Für eine nichtdeterministische Turing-Maschine mit Inputwort der Länge und Laufzeit gilt dann:

Die , aus denen besteht, werden hier also als Konstanten aufgefaßt, die den Schaltkreis definieren, während das variable Eingabewort für ist. Auch nichtdeterministische TMs lassen sich also durch eine Familie von booleschen Schaltkreisen simulieren, sofern die Schaltkreise zusätzlich zum Eingabewort für die TM ein weiteres binäres Inputwort verarbeiten können, das einen konkreten Berechnungspfad spezifiziert. Genauer gesagt, lässt sich für jede NTM und jedes Wort ein äquivalenter boolescher Schaltkreis finden, der genau dann erfüllbar ist, wenn . Die Anzahl der Gates in hängt polynomial von der Länge von ab. Somit wissen wir jetzt: ist durch eine Abbildung , die Wörter auf Schaltkreise abbildet, reduzierbar auf CIRCUIT-SAT. Es bleibt noch zu zeigen, dass in polynomialer Zeit von einer deterministischen TM berechnet werden kann. lässt sich relativ einfach formal beschreiben, da nur vier Typen von Gates vorkommen können: -, -, NOT-Gates sowie ein Output-Gate. Der Typ jedes Gates lässt sich also durch eine Zahl beschreiben. Die Position eines Gates im Raster wird durch eine weitere Zahl beschrieben. Des weiteren müssen wir die Nummern und der Gates angeben, welche die Input-Variablen bzw. für Gate liefern. Die Beschreibung von besteht jetzt aus einer Liste, deren Einträge die Form haben und die einzelnen Gates beschreiben. muss nun so eine Liste in polynomialer Zeit aus dem Eingabewort erzeugen können. Dazu erstellt zunächst aus der Spezifikation der Übergangsfunktion von und der Länge eine Beschreibung eines Rasters der Größe aus

verallgemeinerten Gates. Diese verallgemeinerten Gates können dann jeweils mit konstantem Aufwand in äquivalente boolesche Gates umgewandelt werden. Schließlich durchläuft das Raster erneut, analysiert die booleschen Gates mit ihren Inputs und erstellt die Liste, die beschreibt. Dies ist mit polynomialem Aufwand möglich, weil die Zahl der booleschen Gates ebenfalls in liegt. Wir können festhalten:

CIRCUIT-SAT ist NP-vollständig Für alle Sprachen

gilt:

Wir haben also unser erstes NP-vollständiges Problem gefunden. Allerdings könnte man argumentieren, dass es sich bei der Reduktion von auf boolesche Schaltkreise nur um eine hardwarenähere Darstellung der ursprünglichen Turing-Maschine handelt, so dass dieses erste NP-vollständige Problem noch wenig Strahlkraft besitzt.

Reduktion von CIRCUIT-SAT auf 3-SAT Für den Beweis des Satzes von Cook bleibt nun noch der letzte Schritt der Reduktion von CIRCUIT-SAT auf 3-SAT zu tun. Genauer gesagt werden wir jetzt eine boolesche Formel in 3-KNF konstruieren, die zu einem gegebenen booleschen Schaltkreis in dem Sinne äquivalent ist, dass gilt: und sind also erfüllbarkeitsäquivalent. Allerdings enthält die Formel zusätzliche Variablen , die daher rühren, dass wir die Funktionsweise jedes Gates in durch eine boolesche Klausel simulieren müssen, die eine Outputvariable enthält. Bei einem OR-Gate gilt beispielsweise , wobei die Outputvariable ist, und die Inputvariablen sind. Lässt man die Variablen und sämtliche möglichen Wahrheitswerte durchlaufen und prüft dann, ob der Ausdruck eine wahre Aussage darstellt oder nicht, erhält man die folgende Wahrheitstafel für das OR-Gate:

0

0

0

0

1

0

0

1

0

0

0

1

0

1

0

0

1

1

1

1

1

0

0

1

0

1

0

1

1

1

1

1

0

1

0

1

1

1

1

1

Die Beziehung zwischen der Outputvariablen und den Inputvariablen lässt sich nun mit Hilfe des Verfahrens aus Kapitel 10 in eine boolesche Formel in KNF umwandeln. Zur Erinnerung: Bei diesem Verfahren wird jede Zeile der Wahrheitstafel, die 0 ergibt, in eine -Klausel umgewandelt. Variablen, die in der entsprechenden Zeile den Wert false haben, werden unverändert in die -Klausel übernommen, während Variablen mit dem Wert true in negierter Form übernommen werden. Danach werden alle -Klauseln per miteinander verknüpft. Für das OR-Gate ergibt sich somit folgende äquivalente Formel in 3-KNF:

Analog erhält man für die anderen Gate-Typen:

Die letzte Formel ist zwar nicht in 3-KNF, kann aber durch die Einführung geeigneter Zusatzvariablen einfach auf 3-KNF gebracht werden (s. Kapitel 10). Wenn wir nun den booleschen Schaltkreis durch eine Liste von Gates beschreiben, wobei jedes Gate wie oben durch einen Eintrag beschrieben wird, können wir jeden Listeneintrag durch eine Formel in KNF ersetzen. Beispielsweise gehören zu einem Gate der Listeneintrag und die Formel . Alle diese Formeln müssen gleichzeitig erfüllt sein, um den Schaltkreis zu beschreiben. Außerdem muss, damit der Schaltkreis den Wert ergibt, auch die Output-Variable des Output-Gates den Wert besitzen. Verknüpft man also alle Formeln per , haben wir die gesuchte Reduktion von auf eine Formel . Eine TM, die diese Reduktion aus der Beschreibung von

errechnet, muss nur die Listeneinträge sukzessive nach dem obigen Schema durch die äquivalenten Booleschen Formeln ersetzen, was in linearer Zeit möglich ist. Somit gilt:

und wegen der Transitivität von

für alle Sprachen

:

. Der Satz von Cook ist bewiesen!

Wir ersetzen den booleschen Schaltkreis aus Abildung 11.1 durch eine äquivalente boolesche Formel. In der folgenden Abbildung sind dazu die Gates nummeriert und ein zusätzliches Output-Gate eingeführt worden. Dieser Schaltkreis

wird durch die folgende Liste von Gates beschrieben:

Abbildung 11.6: Boolescher Schaltkreis für

Er ist äquivalent zu der folgenden Formel

mit nummerierten Gates.

:

Beispiele NP-vollständiger Sprachen Jede Sprache , auf die sich 3-SAT in polynomialer Zeit reduzieren lässt (also Probleme , von denen man sagen kann, dass 3-SAT nicht schwerer ist als ), ist selbst NP-vollständig. Es gibt Hunderte solcher Probleme. Ich möchte Ihnen in diesem Abschnitt einige typische Beispiele solcher Sprachen zeigen, die auch wichtige Anwendungen besitzen.

SUBSET-SUM-Problem Jedes Mal, wenn wir im Supermarkt an der Kasse stehen und passend bezahlen möchten, stehen wir vor einem sogenannten SUBSET-SUM-Problem: Wir müssen nämlich aus der Menge der Scheine und Münzen in unserem Portemonnaie eine Teilmenge so auswählen, dass ihre Summe genau dem Kassenbetrag entspricht. Formal lässt sich das SUBSETSUM-Problem in dieser Weise definieren: Das SUBSET-SUM-Problem ist folgendes Problem: Gegeben: Eine Menge

von natürlichen Zahlen und eine Zielsumme

Gesucht: Eine Teilmenge

.

mit

Zunächst ist klar, dass SUBSET-SUM liegt, da ein Zertifikat für dieses Problem aus einer Teilmenge besteht und wir mit einer deterministischen TM nur prüfen müssen, ob wirklich gilt. Um nun zu zeigen, dass 3-SAT nicht schwerer ist als SUBSET-SUM, müssen wir eine boolesche Formel in 3-KNF auf ein SUBSET-SUM-Problem so abbilden, dass gilt:

bestehe aus Klauseln mit insgesamt Variablen. Für jede Variable , die in vorkommt, schreiben wir zwei -stellige Zahlen und in die Menge . Die -te Stelle von und ist jeweils gleich 1. Für die te Ziffer dieser Zahlen, wobei , gilt: die -te Ziffer von ist gleich 1, falls

in Klausel

enthalten

die -te Ziffer von

in Klausel

enthalten

Alle anderen Ziffern von von : Die Formel

ist gleich 1, falls und

sind gleich 0. Hier ein Beispiel für die Konstruktion

führt zu den folgenden 6-stelligen Zahlen: Zahl 1

0

0

1

0

0

1

0

0

0

1

1

0

1

0

1

0

1

0

1

0

0

1

0

0

0

1

1

0

0

0

0

1

0

1

1

Beachten Sie, dass es sich bei den und um Dezimalzahlen handelt (wie auch bei allen anderen Zahlen, die wir für das SUBSET-SUM-Problem noch definieren werden). Die Ziffern der Zahlen sind deshalb so klein gewählt, um bei der späteren Summenbildung garantieren zu können, dass keine Überträge auftreten können. Auch ansonsten sind die und so gebildet, dass sich ihre Summe gut kontrollieren lässt: Die Spaltensumme der ersten Spalten ergibt immer 2, und die Spaltensumme der restlichen Spalten ist immer 3, da wir von einer Formel in 3-KNF ausgegangen sind. Jede Klausel enthält also genau drei Literale, und somit finden sich in jeder der Spalten bis genau drei Einsen. Die Summe über die und ergibt für unsere Beispielformel also 222.333, und zwar unabhängig davon, ob erfüllbar ist oder nicht. Wir benötigen deshalb noch weitere Zahlen für unsere Kollektion , wobei . Die und bestehen wie die und aus Ziffern. Die -te Ziffer von und ist 1, alle anderen Ziffern sind 0. Es gilt also jeweils : Zahl

0

0

0

1

0

0

0

0

0

1

0

0

0

0

0

0

1

0

0

0

0

0

1

0

0

0

0

0

0

1

0

0

0

0

0

1

Die Menge ist damit vollständig: . Wir müssen aber noch eine geeignete Zielsumme für unser SUBSET-SUM-Problem definieren. Klar ist, dass auch aus Ziffern bestehen sollte, da wir Überträge bei der Addition der Zahlen aus vermeiden wollen. Die -te Ziffer von legen wir fest als 1 für . Alle weiteren Ziffern von sollen gleich 3 sein. In unserem Beispiel ergibt sich also als Zielsumme. Die Gründe für diese Definition von ergeben sich aus dem Nachweis der Gleichwertigkeit mit dem SAT-Problem für : Gehen wir zunächst davon aus, dass erfüllbar ist mit einer bestimmten Variablenbelegung für die . Wir müssen dann eine Teilmenge angeben mit . Dazu wählen wir für folgende Zahlen aus: , falls

in der erfüllenden Belegung.

, falls

in der erfüllenden Belegung.

, falls Klausel

höchstens 2 Literale mit dem Wert true enthält.

, falls Klausel

genau 1 Literal mit dem Wert true enthält.

Unsere obige Beispielformel

hat die erfüllende Belegung . Daraus ergibt sich für

1

0

0

1

0

0

0

1

0

1

0

1

0

0

1

0

1

1

0

0

0

1

0

0

0

0

0

0

1

0

0

0

0

0

1

0

0

0

0

0

0

1

1

1

1

3

3

3

:

Durch die ersten beiden Auswahlbedingungen wird für jedes entweder oder ausgewählt, aber niemals beide gleichzeitig. Dadurch beträgt die Summe der ersten Spalten immer 1, in Übereinstimmung mit der Definition von . Die letzten Spalten der Tabelle korrespondieren zu den Klauseln von . Jede Klausel muß mindestens ein Literal mit dem Wert true enthalten, sonst wäre nicht erfüllt. Die Summe über die ersten Zeilenelemente in jeder Spalte ist daher mindestens 1 und höchstens 3. Die dritte und vierte Auswahlbedingung sorgen dann dafür, dass die Summe über die komplette Spalte in jedem Fall 3 ergibt. Aus der Erfüllbarkeit von folgt also die Lösbarkeit des SUBSET-SUM-Problems mit der wie oben definierten Menge und Zielsumme . Sei nun das SUBSET-SUM-Problem mit und der Zielsumme definieren eine erfüllende Belegung für

lösbar durch eine Teilmenge

. Wir

durch:

, falls , falls Dass für ein sowohl als auch in liegen, kann nicht passieren, denn dann wäre die -te Ziffer der Summe der Elemente von gleich 2. Die Wertezuweisung ist also konsistent. wird durch diese Belegung erfüllt, denn so enthält jede Klausel von mindestens ein Literal mit dem Wert true. Gäbe es nämlich ein Literal in ohne Literal mit dem Wert true, wären die ersten Elemente in der zu gehörenden Spalte allesamt 0. Durch die weiteren Elemente können in dieser Spalte höchstens zwei Einsen hinzukommen, und die Zielsumme wird nicht erreicht. Wir haben also gezeigt:

SUBSET-SUM ist NP-vollständig.

Hamilton-Kreise Alle folgenden Beispiele für NP-vollständige Probleme beziehen sich auf Graphen, ein mathematisches Konzept von großer Wichtigkeit und Anwendbarkeit innerhalb der Informatik und darüber hinaus. Einige der wichtigsten Begrifflichkeiten und Fakten im

Zusammenhang mit Graphen finden Sie, wenn nötig, kompakt zusammengestellt in Kapitel 14. Insbesondere wird dort auch die Adjazenzmatrix eines Graphen definiert, eine binäre Matrix, die zeigt, wie viele Knoten ein Graph hat und welche der Knoten miteinander verbunden sind. Ein Hamilton-Kreis ist ein Kreis in einem Graphen, der jeden Knoten des Graphen genau einmal enthält. Das Hamilton-Kreis-Problem (HC) besteht deshalb in folgendem Problem: Das Hamilton-Kreis-Problem (HC) ist folgendes Problem: Gegeben: Ein Graph Gesucht: Ein Kreis in

, der jeden Knoten

genau einmal enthält.

Formuliert man HC als Entscheidungsproblem, fragt man danach, ob ein gegebener Graph einen Hamilton-Kreis enthält. In Kapitel 9 haben wir die dazugehörige Sprache definiert:

Es ist klar, dass in NP liegt, da sich bei einem vorliegenden Graphen und Kreis leicht in polynomialer Zeit prüfen lässt, ob aus Kanten in besteht und alle Knoten in in enthalten sind. Je nachdem, ob die Adjazenzmatrix von symmetrisch ist oder nicht, handelt es sich bei um einen gerichteten oder einen ungerichteten Graphen. Das Hamilton-Kreis-Problem für gerichtete Graphen wird auch als DHC (Directed Hamilton Circuit) bezeichnet. Wir zeigen zunächst, dass DHC NPvollständig ist und reduzieren dann DHC auf HC.

Hamilton-Kreise in gerichteten Graphen sei eine Formel in 3-KNF, bestehend aus

Klauseln

und

Variablen

:

Wir erzeugen uns daraus einen gerichteten Graphen , indem wir zunächst für jedes einen so genannten Diamanten wie in Abbildung 11.7 anlegen. Die Diamanten werden in kreisförmig angeordnet und durch weitere Kanten bzw. miteinander verbunden. Die Diamanten können in einem Hamilton-Kreis entweder von rechts nach links oder von links nach rechts durchlaufen werden. Jeder Hamilton-Kreis von entspricht also einer Belegung der , indem man z.B. festlegt:

Abbildung 11.7: Ein Diamant aus Klauseln.

aus

Knoten für die Variable

Durchlaufe

von links nach rechts

Durchlaufe

von rechts nach links

. Die dazugehörige Formel

besteht

In seiner jetzigen Form enthält immer Hamiltonkreise, unabhängig davon, ob erfüllbar ist. Wir fügen deshalb für jede Klausel einen weiteren Knoten und weitere Kanten hinzu (vgl. Abbildungen 11.8 und 11.9):

Abbildung 11.8: Ein modifizierter Diamant

für den Fall, dass

das Literal

enthält.

Abbildung 11.9: Ein modifizierter Diamant

und und

für den Fall, dass

das Literal

enthält

, falls die Klausel

das Literal

enthält.

, falls die Klausel

das Literal

enthält.

ist nun komplett. Beachten Sie, dass ein Knoten mit bis zu drei Diamanten verbunden sein kann (s. auch Abbildung 11.10) und auf der anderen Seite ein Diamant mehrere Knoten enthalten kann. Für jede der Variablen enthält einen Diamanten aus Knoten. Hinzu kommen Knoten für die Klauseln und die dazugehörigen Kanten. Die Konstruktion von ist also in Polynomzeit möglich. Wir müssen nun zeigen, dass gilt:

Abbildung 11.10: Zwei Diamanten und Übersichtlichkeit halber weggelassen.

, die über

verbunden sind. Die Knoten

und wurden der

Sei also erfüllbar mit einer gewissen Belegung für die Variablen . Diese Belegungen geben die Durchlaufrichtungen für die Diamanten vor. Beispielsweise bedeutet die Belegung : »Durchlaufe von links nach rechts«. Durch Ablaufen aller Diamanten in der vorgegebenen Richtung entsteht ein Kreis in , der auch alle Knoten enthält: Da erfüllbar ist, muss jede Klausel mindestens ein Literal mit dem Wert true enthalten, sagen wir . In der erfüllenden Belegung hat also den Wert false. wird also von rechts nach links durchlaufen, und nach Abbildung 11.9 wird dabei auch der Knoten erreicht. Enthält die Klausel mehr als ein Literal mit dem Wert true, beispielweise und , kann der Knoten sogar auf mehr als einem Weg erreicht werden, in diesem Fall über die Diamanten oder (vgl. auch Abbildung 11.10). In jedem Fall können wir schließen, dass einen Hamilton-Kreis enthält. Gehen wir nun umgekehrt davon aus, dass einen Hamilton-Kreis konstruieren aus eine erfüllende Belegung der Formel : Beim Durchlaufen des Hamiltonkreises wird jeder Diamant

enthält. Wir

entweder von links nach

rechts durchlaufen, mit einem Umweg über

(s. Abb. 11.8), oder von rechts nach links

mit dem Umweg über (s. Abb. 11.9). Zwar könnte es sein, dass auch mit einem anderen Diamanten verbunden ist (s. Abb. 11.10). Enthielte der Hamilton-Kreis aber die Kante , würde man also via zum Knoten in wechseln, ist es danach nicht mehr möglich, die restlichen Knoten des Diamanten zu erreichen, da nicht mehrfach genutzt werden darf. Deswegen muss jeder Hamilton-Kreis in nacheinander die Kanten , bzw. , enthalten und verlässt den Diamanten nicht, bevor er vollständig durchlaufen ist. Die Durchlaufrichtungen der Diamanten sind damit eindeutig bestimmt und können genutzt werden, um die Belegung der Variablen von vorzugeben, z. B. so:

Da einen Hamilton-Kreis enthält, wird jeder Knoten beim Durchlaufen eines Diamanten erreicht. Sagen wir, wird von links nach rechts durchlaufen, also . Da dabei erreichbar ist, muß die Klausel das Literal enthalten (s. Abbildung 11.8). Also enthält jede Klausel mindestens ein Literal mit dem Wert true, und ist erfüllbar. Damit gilt:

DHC ist NP-vollständig.

Ungerichtete Hamilton-Kreise Zum Nachweis, dass HC NP-vollständig ist, fehlt uns noch die NP-Vollständigkeit des Hamilton-Kreis-Problems für ungerichtete Graphen. Um dies zu zeigen, reduzieren wir das DHC-Problem für gerichtete Graphen auf das HC-Problem für ungerichtete Graphen. Die Reduktion erhält als Input einen gerichteten Graphen und bildet ihn in Polynomzeit auf einen ungerichteten Graphen ab. Sei also ein gerichteter Graph. Für jeden Knoten Knotenmenge von definieren wir drei neue Knoten bilden zusammengenommen die Knotenmenge von :

Die Kantenmenge von

aus der . Diese

besteht aus ungerichteten Verbindungen zwischen

und

bzw. und . Hinzu kommen weitere Kanten , falls in Knoten mit dem Knoten verbunden ist (s. auch Abbildung 11.11):

Abbildung 11.11: Knoten und Kanten in

Die Konstruktion von

bzw.

, falls

der

einen Hamilton-Kreis enthält.

ist damit komplett.

Enthält nun einen Hamilton-Kreis offenbar den Hamilton-Kreis

Umgekehrt können Hamiltonkreise in

, so enthält

nur die Form

annehmen, weil die Knoten nur mit bzw. verbunden sind. Davon abgesehen, sind die Knoten mit keinen anderen Knoten verbunden, mit Ausnahme von , falls die Kante in existiert. Startknoten und Umlaufrichtung des Hamiltonkreises sind natürlich beliebig. Die Abbildungen 11.12 und 11.13 verdeutlichen die Konstruktion, falls einen bzw. keinen Hamilton-Kreis enthält.

Abbildung 11.12: Hamiltonkreise in

Abbildung 11.13: und keinen Hamilton-Kreis.

, wobei

bzw.

keinen Hamilton-Kreis enthält. Offensichtlich enthält auch

Entscheidend ist nun die Tatsache, dass in die Knoten immer von und »eingerahmt« werden und dass die einzigen Verbindungen von Knoten mit

verschiedenen Indizes

die Kanten

darstellen. In

entsprechen

diese Kanten den gerichteten Kanten . Die Knotentripel wiederum entsprechen einem einzigen Knoten in . Somit ergibt sich aus durch Ersetzen der Knotentripel , der Kanten und Wahl der richtigen Umlaufrichtung ein Hamilton-Kreis in : Da die Konstruktion von

aus

in Linearzeit möglich ist, haben wir gezeigt:

und als Folgerung:

HC ist NP-vollständig.

Das Travelling-Salesman-Problem Stellen Sie sich vor, Sie arbeiten bei einer Firma, die Büroartikel vertreibt, und müssen eine Liste von Kunden, die sich in verschiedenen Städten aufhalten, besuchen. Nachdem Sie alle Kunden besucht haben, kehren Sie wieder zu Ihrem Ausgangspunkt zurück. Die Reihenfolge der Kundenbesuche ist Ihnen freigestellt, und für den Transport dürfen Sie das firmeneigene Flugzeug benutzen. Allerdings sind Sie gehalten, das Flugzeug so wenig wie möglich zu beanspruchen, und natürlich wollen Sie auch so wenig Zeit wie irgend möglich auf Reisen verbringen. Bei der Planung der Reise stehen Sie also vor dem Problem, die kürzeste Rundreise zu finden, in der jeder Kunde genau einmal vorkommt. Dieses Problem ist als das Problem des Handlungsreisenden bzw. als TravellingSalesman-Problem (TSP) bekannt. Zwar könnten Sie im Prinzip alle möglichen Rundreisen durchprobieren. Da es aber bei Städten genau Rundreisen gibt, stoßen Sie damit schnell an die Grenzen des Machbaren. Tatsächlich ist das TSP das vielleicht bekannteste unter allen NP-vollständigen Problemen. Nun sind in Zeiten von Internet und E-Commerce zwar die Handlungsreisenden ein wenig aus der Mode gekommen, aber das TSP hat nach wie vor eine Menge interessanter Anwendungen. Denken Sie beispielsweise an einen Schweißroboter, der eine Reihe von vorgegebenen Schweißpunkten auf einem Werkstück anfahren muss. Um das TSP in ein graphentheoretisches Problem zu übertragen, machen wir die zu besuchenden Städte zu Knoten in einem Graphen . ist vollständig, da alle Städte miteinander per Luftlinie

verbunden sind. Die Entfernungen zwischen den Städten merken wir uns in Form von so genannten Gewichten, d. h. natürlichen Zahlen, die wir den Kanten von zuordnen (s. auch Kapitel 14). Damit können wir das TSP als ein Optimierungsproblem für einen gewichteten Graphen beschreiben: sei ein gewichteter, vollständiger Graph mit mehr als zwei Knoten. Das Problem, einen Kreis in mit dem kleinsten Gesamtgewicht zu finden, der jeden Knoten genau einmal besucht, heißt Travelling-Salesman-Problem (TSP). Beim TSP sucht man also nach dem kürzesten Hamilton-Kreis in . Um zu zeigen, dass TSP NP - vollständig ist, formulieren wir das Problem als Entscheidungsproblem um, indem wir fragen, ob ein gegebener vollständiger, gewichteter Graph einen HamiltonKreis der Länge enthält. Das kleinste , für das die Antwort »Ja« lautet, ist die Länge des kürzesten Hamilton-Kreises, den enthält.

TSP in der Entscheidungsvariante ist NP vollständig. Die Sprache

ist NP - vollständig.

TSP liegt in NP, da man ein vorgelegtes Zertifikat (also einen Kreis in darauf prüfen kann, ob es sich um einen Hamilton-Kreis der Länge NP-Vollständigkeit beweisen wir, indem wir zeigen, dass

) sehr schnell handelt. Die .

Dazu machen wir aus einem ungewichteten Graphen mit Knoten einen vollständigen, gewichteten Graphen , indem wir allen Kanten von das Gewicht 1 zuweisen. Alle anderen Kanten von bekommen das Gewicht zugewiesen (siehe auch Abbildung 11.14). Enthält einen Hamilton-Kreis, muss dieser aus Kanten bestehen. Also enthält einen Hamilton-Kreis der Länge , und das ist auch die kürzeste mögliche Länge.

Abbildung 11.14: Erzeugen von

aus

Enthält auf der anderen Seite einen Hamilton-Kreis der Länge , kann dieser nur aus den Kanten bestehen, die auch zu gehören. Also enthält auch einen HamiltonKreis. Die Frage, ob einen Hamilton-Kreis enthält, ist damit äquivalent zu der Frage, ob einen Hamilton-Kreis der Länge enthält. Da das Erzeugen von in polynomialer Zeit möglich ist, gilt .

Das Cliquen-Problem Eine Clique in einem ungerichteten Graphen besteht aus einem vollständigen Teilgraphen von , also einem Teilgraph, in dem jeder Knoten mit jedem anderen verbunden ist. Das passt recht gut zur umgangssprachlichen Bedeutung des Wortes Clique, nämlich einer Gruppe von Menschen, die alle untereinander befreundet sind. Eine -Clique ist eine Clique aus Knoten. Wir definieren nun eine Sprache

Das Wortproblem für diese Sprache entspricht also der Frage, ob ein gegebener Graph eine -Clique enthält. Dabei könnte beispielsweise die Freundschaftsbeziehungen in einem sozialen Netzwerk beschreiben. Enthält eine -Clique, gibt es also eine Gruppe von Nutzern in dem Netzwerk, die alle miteinander befreundet sind. CLIQUE

ist NP-vollständig:

CLIQUE ist NP-vollständig.

Bevor wir uns überlegen, dass CLIQUE NP-vollständig ist, hier zunächst ein Beispiel für einen Graphen mit einer 4-Clique:

Abbildung 11.15: Die Knoten

bilden eine 4-Clique in diesem Graphen.

sei eine Formel in 3-KNF, die aus Klauseln besteht. Wir übersetzen in einen Graphen , der genau dann eine -Clique enthält, wenn erfüllbar ist. Jede Klausel von entspricht einer Dreiergruppe von Knoten. Jeder Knoten in einer Dreiergruppe entspricht wiederum einem Literal in der entsprechenden Klausel. besitzt also

Knoten. Die Kanten von werden so gebildet: Alle Knoten, die zu verschiedenen Dreiergruppen gehören, werden miteinander verbunden, es sei denn, sie korrespondieren zu einer Variablen und seiner Negation . Innerhalb derselben Dreiergruppe gibt es aber keine Kanten. Ist erfüllbar, so gibt es eine Belegung der Betrachte beispielsweise die Formel

mit der erfüllenden Belegung dazugehörigen Graphen :

, so dass

.

und

und dem

In Abbildung 11.16 gehören die Knoten zur ersten Klausel, die Knoten zur zweiten und zur dritten Klausel von . Die Knoten sowie die Knoten bilden jeweils 3-Cliquen.

Abbildung 11.16: Der zu

gehörende Graph

Allgemein muss bei einer erfüllenden Belegung von jede der Klauseln mindestens ein Literal mit dem Wert true enthalten. Im Graphen sind dies Knoten, die zu den verschiedenen Dreiergruppen gehören. Da in der Belegung keine Variable zweifach mit einem unterschiedlichen Wahrheitswert vorkommen kann, existiert zwischen diesen Knoten jeweils eine Kante. Also enthält eine -Clique. Nun nehmen wir umgekehrt an, enthält eine -Clique. Da es innerhalb der Dreiergruppen keine Kanten gibt, gehört jeder Knoten der Clique zu einer anderen der Klauseln von . Wir bilden nun eine Belegung der Variablen aus den Knoten der Clique: , falls ein zu gehörender Knoten Mitglied der Clique, und , falls ein -Knoten Mitglied der Clique. Auf diese Weise enthält jede Klausel von mindestens ein Literal mit dem Wert true, und ist erfüllt.

Ist P = NP? Die Frage, ob P = NP gilt, ist eine der wichtigsten in der gesamten Informatik. Formal geht es dabei um die Frage, ob sich zu irgendeinem NP-vollständigen Problem , das sich nach derzeitigem Wissensstand auf einer deterministischen TM (und nur solche lassen sich physisch realisieren) nur mit exponentiellem Aufwand lösen lässt, nicht doch ein polynomialer Algorithmus finden lässt. Aufgrund der NP-Vollständigkeit von würden sich dann auch alle anderen Probleme in NP mit polynomialem Aufwand lösen lassen, und die Klasse NP würde zur Klasse P kollabieren. Trotz aller Fortschritte auf dem Gebiet der Algorithmik halten die weitaus meisten Experten solch ein Szenario aber für unwahrscheinlich, d. h., nach aktuellem Wissensstand geht man davon aus, dass gilt. Die Frage, ob P = NP gilt oder nicht, ist deshalb so wichtig, weil die Unterscheidung zwischen P und NP eine qualitative Grenze zwischen schwierigen und einfachen Problemen zu markieren scheint. Wäre P = NP, würde dies letztlich bedeuten, dass die Verifikation der Lösung eines Problems ähnlich schwierig ist wie das Finden einer Lösung. Das entspricht aber nicht unser täglichen Erfahrung. Wir sind es gewohnt, dass das Finden einer Lösung zu einem schwierigen Problem, beispielsweise das Finden eines mathematischen Beweises, deutlich schwieriger ist als dessen Verifikation. Gemeinhin schreiben wir die Fähigkeit zum Lösen schwieriger Problem der menschlichen Kreativität zu – eine Eigenschaft, die wir Maschinen absprechen. Die Frage, ob P= NP gilt, rührt also nicht nur an unser Verständnis dessen, was schwierige Probleme sind, sondern auch an das, was uns unserer Ansicht nach als Menschen auszeichnet.

Quantencomputer Kehren wir zum Abschluss unserer Reise noch einmal zum Anfang zurück: Unser Ziel war es ursprünglich, ein mathematisches Modell für unsere heutigen Computer zu formulieren, um so Einsichten über die Möglichkeiten und Grenzen dieser Maschinen zu gewinnen. Mit der universellen Turing-Maschine scheint uns das tatsächlich gelungen zu sein. Wir sind sogar einen Schritt weiter gegangen und haben im Rahmen der ChurchTuring-These vermutet, dass alle intuitiv berechenbaren Funktionen auch von einer Turing-Maschine berechnet werden können (s. Kapitel 4). Seit einigen Jahren nun ist in der Wissenschaft und auch in den Medien verstärkt von Quantencomputern die Rede. Diese scheinen sich fundamental anders zu verhalten als unsere klassischen Computer. Müssen wir mit dem Aufkommen der Quantencomputer auch unsere Vorstellung von der Turing-Maschine als einem universellen mathematischen Modell von rechnenden Maschinen aufgeben? Müssen wir vielleicht auch die ChurchTuring-These revidieren? Nein, denn auch Quantencomputer brauchen einen Algorithmus, d. h. eine feste Abfolge von Berechnungsschritten, um zu einem Ergebnis zu kommen. Sie

können deshalb keine fundamental anderen Funktionen als Turing-Maschinen berechnen, und die Church-Turing-These als Grundlage des Algorithmenbegriffs bleibt nach wie vor gültig. Quantencomputer können aber manche Probleme schneller lösen als klassische Computer. Sie haben vielleicht schon einmal gehört, dass sich subatomare Teilchen wie z. B. Elektronen sehr merkwürdig verhalten, wenn man ihre genaue Position messen möchte. Je nach Versuchsaufbau und Messanordnung scheinen sie an mehreren Orten gleichzeitig sein zu können, und nicht nur miteinander, sondern sogar mit sich selbst interagieren zu können. Erst der Moment der Messung zwingt sie, ihren unbestimmten Zustand aufzugeben und sich (mit einer gewissen Wahrscheinlichkeit) für einen bestimmten Ort zu »entscheiden«. Die Quantenmechanik lehrt uns, dass diese Unbestimmtheit auf subatomarem Level eine Eigenschaft der Natur ist und nicht etwa auf unzureichende Genauigkeit der Messinstrumente zurückzuführen ist. Quantencomputer machen sich diese Überlagerung von verschiedenen Zuständen zunutze, indem sie anstelle von klassischen Bits mit sogenannten Qubits arbeiten. Ein Qubit ist eine Überlagerung der beiden Zustände, die ein klassisches Bit annehmen kann:

und sind dabei die beiden quantenmechanischen Basiszustände, die das Qubit annehmen kann. Nach Physiker-Sitte werden diese als sogenannte Ket-Vektoren geschrieben, eine Anspielung auf das englische Wort bracket, also Klammer. und sind beides komplexe Zahlen. Im Moment der Messung des Qubits »kollabiert« es auf einen der beiden Basis-Zustände 0 oder 1, und zwar mit Wahrscheinlichkeit bzw. , weswegen gelten muss. Ein Quantencomputer besteht aus vielen solchen miteinander interagierender Qubits in einer Überlagerung von Zuständen. Bei Qubits gibt es Basiszustände, die jedoch vom Quantencomputer gewissermaßen gleichzeitig angenommen werden. Ein 2-QubitZustand hätte beispielsweise die Form

mit

.

Möchte man einen Quantencomputer bauen, steht man vor der technischen Herausforderung, einerseits die Interaktion der Zustände untereinander zu ermöglichen, andererseits aber eine Interaktion der Zustände mit ihrer Umgebung zu verhindern, da diese Interaktionen zu einer vorzeitigen Messung und damit zum vorzeitigen Kollaps auf einen Basiszustand führen können. Ein Quantenalgorithmus für ein bestimmtes Problem steuert die Interaktion der Qubits in der Weise, dass im Moment der Messung mit einer hohen Wahrscheinlichkeit die Lösung

des Problems erscheint. Quantencomputer können schneller sein als klassische Computer, weil sie in der Lage sind, mehrere Pfade durch ihren Zustandsraum gleichzeitig zu nehmen. In diesem Sinne erinnern Quantencomputer stark an nichtdeterministische Turing-Maschinen, die sich während der Ausführung eines Algorithmus nichtdeterministisch für den einen oder anderen Pfad durch den Berechnungsbaum entscheiden. Quantencomputer hingegen scheinen durch Zustandsüberlagerung den gesamten Berechnungsbaum gleichzeitig durchlaufen zu können. Dadurch lassen sich für manche Probleme aus der Klasse NP polynomiale Quantenalgorithmen finden. Es gibt aber einen wichtigen Unterschied zwischen NTMs und Quantencomputern: Für eine NTM sind alle Pfade durch den Berechnungsbaum gleichberechtigt und damit auch gleich wahrscheinlich, während ein geeigneter Quantenalgorithmus das richtige Ergebnis mit einer rechnerischen Wahrscheinlichkeit liefern kann. Es sieht aber im Moment so aus, als müssten wir für diese hohe Wahrscheinlichkeit dadurch zahlen, dass sich ausgerechnet für die NP-vollständigen Probleme keine polynomialen Algorithmen finden lassen.

Die Klasse BQP Vielleicht haben Sie bei unserer kleinen Aufzählung NP-vollständiger Probleme das Faktorisierungsproblem vermisst, das wir in Kapitel 10 eingeführt haben und das darin besteht, die Primfaktoren einer großen natürlichen Zahl zu finden. Das Faktorisierungsproblem ist von großer praktischer Bedeutung, denn es bildet den Kern des 1978 veröffentlichten RSA-Kryptosystems, das wiederum die Grundlage des im Internet zur Absicherung webbasierter Kommunikation breit genutztem TLS-(Transport-LayerSecurity-)Protokolls darstellt. Wegen dieser großen praktischen Bedeutung ist das Faktorisierungsproblem sehr gut untersucht, aber trotz intensiver Bemühungen ließ sich bislang weder ein klassischer polynomialer Algorithmus finden, noch ließ sich nachweisen, dass das Faktorisierungsproblem NP-vollständig ist. Dasselbe gilt auch für die kryptografische Alternative zum Faktorisierungsproblem, dem Diskreter-Logarithmus-Problem, das ebenfalls im Rahmen von TLS zum Einsatz kommt und das ich Ihnen hier kurz vorstellen möchte: Das Diskreter-Logarithmus-Problem, abgekürzt DLP besteht in folgender Aufgabe: Gegeben: Eine große Primzahl

.

Ein primitives Element , das bedeutet, dass jede Zahl in der Form (d. h. als Potenz von ) geschrieben werden kann).

Eine Zahl

.

Gesucht: Ein Exponent mit

.

2 ist ein primitives Element modulo 13, wovon man sich leicht durch Aufzählen sämtlicher Potenzen von 2 modulo 13 überzeugen kann (für größere existieren effinientere Tests auf Primitivität).

Wir können deshalb ein DLP mit Gegeben:

als Basis beispielsweise so formulieren: .

Gesucht: Ein Exponent mit Die Lösung dieses speziellen DLP lautet

. .

Das DLP bildet die Grundlage des Diffie-Hellman-Schlüsseltausch-Protokolls von 1976 und kommt ebenfalls im Rahmen von TLS zum Einsatz. Die besten klassischen Algorithmen zur Lösung des DLP besitzen eine ähnliche Komplexität wie die Algorithmen zur Lösung des Faktorisierungsproblems, so dass es scheint, als würden das Faktorisierungsproblem und das DLP in einer eigenen Komplexitätsklasse zwischen P und NP liegen. Umso größer war die Aufregung in der Fachwelt, als Peter W. Shor 1994 seine Quantenalgorithmen für das Faktorisierungsproblem und das DLP vorstellte, die in polynomialer Zeit mit hoher Wahrscheinlichkeit zu einer Lösung kommen konnten. Zwar sind auch die heutigen Quantencomputer noch weit davon entfernt, die für das TLSProtokoll relevanten Instanzen des Faktorisierungsproblems lösen zu können, aber in ca. 10 Jahren könnte es so weit sein. Deshalb wird seit einiger Zeit im Rahmen der »PostQuantum Cryptography« nach sicheren Alternativen für das Faktorisierungsproblem gesucht. Uns sollen aber in diesem Zusammenhang mehr die Konsequenzen von Shors Entdeckung für die vermutete Komplexitätsklasse zwischen P und NP interessieren. In den mehr als zwanzig Jahren danach ist es nämlich nicht gelungen, einen polynomialen Quantenalgorithmus für ein NP-vollständiges Problem zu finden. Die neue Komplexitätsklasse zwischen P und NP scheint also gerade dadurch gekennzeichnet, dass sich für ihre Probleme keine polynomialen Algorithmen für klassische Turing-Maschinen finden lassen, wohl aber für Quantencomputer. Wir definieren deshalb:

Bounded Error Quantum Polynomial, kurz BQP, ist die Klasse der Probleme, die sich durch einen Quantenalgorithmus in polynomialer Zeit mit einer Wahrscheinlichkeit lösen lassen. Fasst man Quantencomputer als eine Verallgemeinerung klassischer Computer auf, so bildet BQP eine Obermenge von P, d. h., P ist in BQP enthalten. Am interessantesten sind natürlich die Probleme in BQP, die nicht in P zu liegen scheinen und so die Grenze zwischen P und NP markieren, immer vorausgesetzt, dass nicht doch gilt. Neben dem Faktorisierungsproblem und dem DLP gibt es noch einen weiteren heißen Kandidaten für die Mitgliedschaft in der vermuteteten Komplexitätsklasse , das so genannte Graph-Isomorphismus-Problem. Bei diesem Problem geht es um die Frage, ob zwei unterschiedliche Graphen nach einer Umbenennung der Knoten vielleicht gleich sind: Das Graph-Isomorphismus-Problem besteht in folgender Aufgabe: Gegeben: Zwei Graphen Gefragt: Gibt es eine Abbildung

und

. mit der Eigenschaft

Abbildung 11.17 zeigt ein Paar von Graphen , die isomorph zueinander sind. Obwohl die beiden Graphen nur sechs Knoten haben, ist es relativ schwer, mit bloßem Auge zu sehen, dass es sich bis auf die Namen der Knoten um die gleichen Graphen handelt.

Abbildung 11.17: Zwei isomorphe Graphen

und

Die besten klassischen Algorithmen zur Lösung des Graph-Isomorphismus-Problems sind sehr nahe an der Polynomialität, aber eben nur sehr nahe. Deshalb ist es unwahrscheinlich, dass Graph-Isomorphismus NP-vollständig ist. Auf der anderen Seite scheint es, dass sich die Methoden aus Shors Algorithmus nur bedingt auf das GraphIsomorphismus-Problem übertragen lassen. Weitere Forschungen und ein besseres Verständnis der Funktionsweise von Quantencomputern werden notwendig sein, um zu

zeigen, dass Graph-Isomorphismus in BQP liegt.

Aufgaben zur NP-Vollständigkeit Als kleine Hilfe, so zur Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wiley-vch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. 1. Betrachten Sie die folgende Formel

:

Bilden Sie den zu gehörenden gerichteten Graphen . Finden Sie einen Hamilton-Kreis in und geben Sie eine erfüllende Belegung für an. 2. Betrachten Sie die folgende Formel

:

Bilden Sie den zu gehörenden Graphen und das zu gehörige SUBSETSUM-Problem und überzeugen Sie sich davon, dass nicht erfüllbar ist. 3. Finden Sie eine Abbildung , so dass Graphen und

für die aus Abbildung 11.17.

Teil IV

Mathematische Grundlagen

IN DIESEM TEIL… behandeln wir die mathematischen Grundlagen für unsere Überlegungen aus den ersten drei Teilen des Buchs. Normalerweise sind diese Grundlagen Bestandteil der ersten Semester Ihres Studiums, weswegen ich die Darstellung eher knapp gehalten und weitgehend auf Beweise verzichtet habe. Lediglich im Kapitel zur Graphentheorie bin ich davon etwas abgewichen. Logik und Mengenlehre liefern uns in den Kapiteln 12 und 13 den nötigen formalen Background für unsere Untersuchungen in Teil I und Teil II, während die Graphentheorie in Kapitel 14 eine Fülle interessanter Beispiele und Probleme für Teil III bereithält.

Kapitel 12

Logische Grundlagen IN DIESEM KAPITEL lernen Sie die booleschen Variablen und booleschen Formeln kennen führe ich Sie in die Themen Aussagen und Beweise ein

In den vorangegangenen Kapiteln haben wir das Erfüllungsproblem für boolesche Formeln als das Paradebeispiel eines NP-vollständigen Problems kennengelernt. Die Beweisskizze für den Satz von Cook fußte wiederum darauf, sich eine Turing-Maschine als einen Booleschen Schaltkreis vorzustellen, also letztlich eine Realisierung einer Booleschen Formel in Hardware. Das folgende Kapitel führt boolesche Variablen und Formeln formal ein, indem die logischen Operatoren, aus denen boolesche Formeln bestehen, definiert werden. Außerdem lernen wir in diesem Kapitel die Gesetze der Aussagenlogik kennen, die schon in der Antike formuliert wurden. Sie formalisieren und definieren gültige mathematische Schlussweisen und geben uns verschiedene Schemata an die Hand, nach denen mathematische Beweise aufgebaut sein können.

Boolesche Variablen und boolesche Formeln Boolesche Variablen sind Variablen, die nur die Werte 0 oder 1 annehmen können. Diese Werte können je nach Kontext mit den Wahrheitswerten false bzw. true oder auch mit »Spannung« bzw. »keine Spannung« assoziiert werden. Boolesche Variablen werden normalerweise mit Kleinbuchstaben bezeichnet. Eine boolesche Formel bildet mehrere boolesche Inputvariablen auf eine Outputvariable ab. Sie wird mit Hilfe der logischen Operatoren (AND), (OR) und (NOT) gebildet, die auf eine oder mehrere boolesche Variablen angewendet werden. Die logischen Operatoren sind über so genannte Wahrheitsstabellen definiert, die für jede Wertekombination der Inputvariablen den jeweiligen Outputwert angeben: Die logischen Operatoren

0 0

0

0

1

0 1

1

0

1

1 0

1

0

0

und

sind folgendermaßen definiert:

1 1

1

1

0

Diese Definitionen können umgangssprachlich so interpretiert werden, dass bedeutet » oder ist wahr«. bedeutet » und sind beide wahr«, und bedeutet gerade die Umkehrung des Wahrheitswerts von . Statt schreibt man oft auch . Wir betrachten die boolesche Formel

ist wahr, d. h., nimmt den Wert 1 an, genau dann, wenn und unterschiedliche Wahrheitswerte besitzen. Haben und nämlich den gleichen Wert, ist immer einer der beiden Ausdrücke oder wahr. Also ist dann auch wahr und hat den Wert 0. Haben auf der anderen Seite und verschiedene Wahrheitswerte, sind sowohl als auch falsch. Damit ist falsch und wahr. Im Allgemeinen lassen sich boolesche Formeln oft durch Rechenregeln vereinfachen, wie sie in ähnlicher Form auch für die arithmetischen Operatoren und gelten. Insbesondere verhält sich in mancher Hinsicht wie und wie . Beispielsweise gelten die Regeln und . Deshalb lassen viele Autoren wie bei der Multiplikation den Operator einfach weg, schreiben also statt .

Rechengesetze für boolesche Variablen Für boolesche Variablen Assoziativgesetze:

Distributivgesetze:

gelten die folgenden Regeln:

Beachten Sie, dass die Distributivgesetze und analog für Zahlen gelten, wenn man durch und durch ersetzt. Dies gilt jedoch nicht für die Regeln und . Wegen der Gültigkeit der Distributiv- und Assoziativgesetze, die sich mit Hilfe von Wahrheitstafeln leicht zeigen lassen, wird das mathematische System, das aus booleschen Variablen und den logischen Operatoren , und gebildet wird, auch als boolesche Algebra bezeichnet. Für den Negations-Operator gelten ebenfalls bestimmte Regeln:

De Morgansche Regeln Für boolesche Variablen und

gelten folgende Regeln:

Wir wenden die obigen Regeln auf unsere boolesche Beispiel-Formel

ist also wahr, wenn falsch und gleichzeitig gleichzeitig falsch ist.

Aussagen und Beweise

wahr ist oder wenn

an:

wahr und

Eine Aussage ist ein sprachliches Gebilde, dem, genau wie einer booleschen Variablen, ein eindeutiger Wahrheitswert »wahr« oder »falsch« zugeordnet werden kann, wie z.B. »Es regnet« oder »Die Straße ist nass«. Aussagen können auch Variablen beinhalten. In diesem Fall hängt der Wahrheitswert der Aussage vom Wert der Variablen ab, wie z. B. bei dieser Aussage: . Ein anderer Weg, eindeutige Wahrheitswerte für eine Aussage mit Variablen zu erhalten, besteht darin, eine Menge vorzugeben, aus der die Variablen kommen können. Nun können mit Hilfe von die so genannte All-Aussage »Für alle ist wahr« sowie die Existenzaussage »Es existiert ein , so dass wahr ist« gebildet werden. In Formeln ausgedrückt lauten diese Aussagen:

Dabei heißt der Allquantor, und

heißt Existenzquantor.

Die Aussage

ist falsch, denn für

ist

.

Hingegen ist die Aussage

wahr, denn für

erhält man die Primzahl 43.

Ebenso ist aber auch

wahr, wegen des schon erwähnten Beispiels

.

Für die Negation von All- bzw. Existenzaussagen gelten die folgenden Regeln:

Das Gleichheitszeichen bedeutet in diesem Fall, dass die Aussagen auf der linken und rechten Seite des Gleichheitszeichens für alle den gleichen Wahrheitswert annehmen. Die Aussage

ist die Negation von

Beweistechniken In der Aussagenlogik und allgemein in der Mathematik strebt man danach, die Wahrheit einer Aussage nach genau festgelegten Regeln zu beweisen, indem man von einer bereits bewiesenen Aussage oder einer als wahr angenommen Aussage (einem Axiom) ausgeht.

Implikation und direkter Beweis Ist eine Aussage immer dann wahr, wenn auch wahr ist, sagt man, folgt aus oder auch impliziert , in Zeichen . Beachten Sie, dass damit nichts über einen kausalen Zusammenhang zwischen und ausgesagt wird. Es geht vielmehr um eine Beziehung, die zwischen den Wahrheitswerten von und bestehen sollte, damit der Schluss eine wahre Aussage ist. und seien zwei Aussagen. Die Wahrheitswerte der Implikation werden durch folgende Wahrheitstabelle festgelegt:

1

1

1

1

0

0

0

1

1

0

0

1

Die linke Aussage in der Implikation heißt Voraussetzung oder Prämisse, die rechte Aussage wird auch Schluss oder Conclusio genannt. Auf den ersten Blick erscheint es etwas merkwürdig, dass die Aussage wahr sein soll, auch wenn die Voraussetzung falsch ist. Das liegt daran, dass man umgangssprachlich hinter einer Implikation immer einen kausalen Zusammenhang vermutet. Eine Aussage wie »Wenn das Gras rot ist, dann können Hunde fliegen« ist in der Umgangssprache sinnlos. Hier geht es aber darum, die Wahrheitswerte von als eigenständige Aussage unabhängig vom Inhalt der Aussagen und festzulegen. sei die Aussage »Es regnet.« und die Aussage »Die Straße ist nass.« Dann ist die Implikation sicher wahr. Wenn wir nun aus dem Fenster schauen und feststellen, dass es regnet, können wir mit Hilfe der Implikation schließen, dass die Straße nass sein muss. Die Argumentation aus dem Beispiel liefert uns eine einfache Schablone dafür, wie man die Wahrheit einer Aussage mathematisch korrekt beweisen kann, nämlich indem man von einer als wahr angenommenen Voraussetzung ausgeht und dann mit Hilfe einer wahren Implikation auf die Wahrheit von schließt. Echte mathematische

Beweise sind natürlich komplizierter, denn sie bestehen häufig aus langen Implikationsketten, an deren Ende die zu beweisende Aussage steht. Grundlage dieser Verkettung von Implikationen ist die Wahrheit dieser Aussage: Beweist man eine Aussage nach diesem Muster, nämlich indem man von einer (als wahr angenommenen) Voraussetzung ausgeht und dann über eine Kette von Implikationen wahre Zwischenaussagen herleitet, bis man schließlich bei ankommt, spricht man auch von einem direkten Beweis. Das funktioniert auch dann, wenn die zu beweisende Aussage selbst die Form hat. Wir beweisen die Aussage durch eine Kette von Implikationen: ist durch 4 teilbar Viele mathematische Sätze haben die Form bzw. ist äquivalent zu . Die Aussage ist äquivalent zu der Aussage , wenn gilt . Der Beweis einer Äquivalenzaussage besteht deshalb meist aus zwei Teilen, in denen man zunächst die Wahrheit von und danach die von nachweist. Man kann zeigen, dass äquivalente Aussagen immer den gleichen Wahrheitswert haben. Es gilt Wahrheitswert annehmen:

1

1

1

0

1

1

0

0

0

0

0

1

1

1

1

0

0

1

1

1

, da beide Aussagen immer den gleichen

Kontraposition Manchmal ist es einfacher, statt der ursprünglichen Aussage ihre so genannte Kontraposition zu beweisen. Dies ist zulässig wegen In Kapitel 1 haben wir zunächst das Pumping Lemma für reguläre Sprachen angegeben, dann aber auch die Kontraposition des Pumping Lemma formuliert, da es hauptsächlich in dieser Form zum Nachweis der Nicht-Regularität einer Sprache eingesetzt wird.

Indirekter Beweis Wie beweist man, dass es etwas nicht gibt? In den Naturwissenschaften ist ein solcher Nachweis so gut wie unmöglich, und auch in der Mathematik ist ein solcher Beweis nicht immer einfach, wie Sie an der Diskussion des P-NP-Problems in den Kapiteln 10 und 11 gesehen haben: Könnte man beweisen, dass es keinen polynomialen Algorithmus etwa zur Lösung des Travelling-Salesman-Problems gibt, wäre das P-NP-Problem gelöst, aber leider ist dies trotz intensiver langjähriger Forschung noch nicht gelungen. Allerdings stellt die Aussagenlogik zum Beweis solcher »Nicht-Aussagen« ein spezielles Verfahren bereit, den indirekten Beweis: Möchte man beweisen, geht man zunächst vom Gegenteil aus und versucht dann, über eine Kette gültiger Implikationen zu einem Widerspruch, d. h. einer offensichtlich falschen Aussage, zu gelangen. Insgesamt hat man damit die Gültigkeit der Aussage bewiesen. Nach Definition der Implikation kann diese Aussage aber nur wahr sein, wenn die Prämisse falsch ist. Das Paradebeispiel eines indirekten Beweises ist Euklids wunderbarer, über 2000 Jahre alter Beweis dieser Aussage:

Zum Beweis gehen wir vom Gegenteil von

aus:

Wenn es nur endlich viele Primzahlen gibt, dann können wir sie zählen (sagen wir, es gibt Primzahlen ) und eine vollständige, der Größe nach geordnete Liste aller Primzahlen anlegen: . Damit können wir eine Zahl bilden durch

Dann läßt aber bei der Division durch jede der den Rest 1. Also ist durch keine der teilbar. Also muß selbst eine Primzahl sein. Weil aber ist, taucht nicht in der vollständigen Liste aller Primzahlen auf: Widerspruch!

Vollständige Induktion Unsere letzte spezielle Beweistechnik bezieht sich auf Aussagen , die natürliche Zahlen beinhalten, und deren Gültigkeit man für alle natürlichen Zahlen ab einem bestimmten Startwert beweisen möchte. Eine wichtige Eigenschaft der natürlichen Zahlen besteht darin, dass jede natürliche Zahl einen eindeutig definierten Nachfolger besitzt. Wenn es uns gelingt, die Aussage für den Startwert (sehr oft ist ) und außerdem die Wahrheit der Implikation nachzuweisen, können wir, beginnend bei , die Aussagen und schließlich für alle

beweisen:

Diese Beweistechnik nennt man vollständige Induktion. Der Beweis der Aussage heißt auch der Induktionsanfang, die Aussage Induktionsschritt. Die Prämisse des Induktionsschritts wird manchmal auch als Induktionsvoraussetzung bezeichnet. Summenformeln für natürliche Zahlen sind ein typisches Anwendungsfeld für die vollständige Induktion (ein anderes sind Aussagen über die Eigenschaften von Graphen und Bäumen, s. Kapitel 14). Als einfaches Beispiel betrachten wir hier die Gaußsche Formel für die Summe der ersten natürlichen Zahlen:

.

Induktionsanfang: Wir machen den Anfang bei Hier lautet die Summenformel

.

ist also wahr.

Induktionsvoraussetzung: Es gelte

Induktionsschluss: Wenn die Induktionsvoraussetzung wir zeigen, dass auch wahr ist, also dass gilt:

Es ist liefert

wahr ist, müssen

. Einsetzen der Induktionsvoraussetzung

Aufgaben zur Logik Als kleine Hilfe, so zur Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wiley-vch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige

Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. 1. Beweisen Sie die Gültigkeit der De Morganschen Regeln über Wahrheitstabellen. 2. Unter dem Modus Ponens versteht am die Gültigkeit der folgenden Aussage: Beweisen Sie die Gültigkeit des Modus Ponens, ohne Wahrheitstabellen zu benutzen. 3. Beweisen Sie mittels vollständiger Induktion die Aussage

Kapitel 13

Mengen und Relationen IN DIESEM KAPITEL behandeln wir zwei mathematische Konzepte, die nicht nur für die theoretische Informatik, sondern für die gesamte Mathematik absolut fundamental sind: Mengen und Relationen

Grundbegriffe Die folgende Definition einer Menge stammt vom Begründer der Mengenlehre, Georg Cantor. Mit ihr beginnt das mathematische Teilgebiet der Mengenlehre. Auf dieser einen Definition lassen sich tiefer gehende Konzepte bis hin zum Vektorraum aufbauen. Eine Menge ist eine Zusammenfassung verschiedener, wohlunterscheidbarer Objekte unserer Anschauung oder unseres Denkens. Ist ein Objekt in einer Menge enthalten, schreiben wir . Dann heißt Element von . Wenngleich diese Definition nur offensichtliche Dinge festzuschreiben scheint, enthält sie doch eine wichtige Idee: Die Elemente einer Menge müssen voneinander verschieden sein. Es ist nicht erlaubt, dass sich zwei exakt gleiche Objekte in einer Menge aufhalten. Hier einige Beispiele für endliche und unendliche Mengen: ist die Menge der Kleinbuchstaben im griechischen Alphabet. Die drei Punkte deuten an, dass die Aufzählung nicht vollständig ist, aber nach einem Muster erfolgt, das sich aus den ersten Elementen der Mengen ergibt. ist die Menge der natürlichen Zahlen. ist die Menge der natürlichen Zahlen einschließlich der Null. ist die Menge der geraden natürlichen Zahlen. ist die Menge der ganzen Zahlen. Die leere Menge

ist die Menge, die keine Elemente enthält.

Sehr häufig wird, anstatt die Elemente einer Menge explizit aufzuzählen, eine andere Schreibweise benutzt, die eine definierende Eigenschaft der Menge angibt. So kann man die Menge der natürlichen geraden Zahlen aus dem Beispiel oben auch so schreiben:

Der senkrechte Strich ist dabei als «mit der Eigenschaft« zu lesen. ist also die Menge der natürlichen Zahlen mit der Eigenschaft, dass sich in der Form darstellen läßt.

und

seien zwei Mengen.

und heißen gleich, d. h., es gilt gleichen Elemente enthalten. heißt Teilmenge von , in Zeichen auch Element von ist: Die Menge

, wenn

und

exakt die

, falls jedes Element von

heißt Potenzmenge von

.

Die Potenzmenge der Zustandsmenge spielte eine wichtige Rolle bei der Konstruktion eines zu einem gegebenen NFA äquivalenten DFA in Kapitel 1. Die Mengen eine Teilmenge von

und . Die Potenzmenge von

sind gleich. ist

ist

Die obige Definition der Gleichheit von zwei Mengen bedeutet unter anderem, dass es auf die Reihenfolge der Elemente in einer Menge nicht ankommt. Der folgende Satz gibt uns ein Kriterium an die Hand, wie wir die Gleichheit von zwei Mengen beweisen können.

Gleichheit von Mengen und

seien Mengen. Dann gilt:

sei eine endliche Menge. Die Anzahl der Elemente von heißt die Mächtigkeit von . Sie wird mit bezeichnet. Zwei endliche Mengen und heißen

.

gleich mächtig, falls

Mengenoperationen In diesem Abschnitt verknüpfen wir nun zwei (oder auch mehr) Mengen miteinander, um neue Mengen zu erhalten. Für zwei Mengen

und

definieren wir die folgenden Operationen:

Der Durchschnitt oder die Schnittmenge die gleichzeitig zu und zu gehören:

Die Vereinigungsmenge gehören:

ist die Menge aller Elemente,

ist die Menge der Elemente, die zu

Die Differenzmenge (gesprochen minus Elemente von , die nicht zu gehören:

Ist

, so ist das Komplement

Die Produktmenge geordneten Paare

Sei

Für

von

oder zu

) ist die Menge der

die Menge

.

(gesprochen Kreuz ) ist die Menge der , wobei und :

und

. Dann gilt:

ist

.

Die Mengenoperationen werden auch gerne mit Hilfe so genannter Venn-Diagramme visualisiert.

Abbildung 13.1: Illustration der Mengenoperationen

und

Relationen Wie der Name schon sagt, werden durch Relationen Beziehungen zwischen zwei Mengen und hergestellt. Aus formaler Sicht stellen Relationen Teilmengen der Produktmenge von und dar: und seien zwei Mengen. Eine Relation Teilmenge der Produktmenge von und : Sei

eine Teilmenge von

Äquivalenzrelationen

zwischen .

und

Dann ist

, also eine Relation zwischen

und

.

ist eine

Äquivalenzrelationen bilden einen besonders interessanten und wichtigen Typ von Relation. Dazu fordern wir von der Relation einige Struktur-Eigenschaften:

sei eine Menge. Eine Teilmenge von

heißt Relation in

.

Eine Relation

in

heißt reflexiv, wenn für alle

Eine Relation

in

heißt symmetrisch, wenn für alle

Eine Relation

in

heißt transitiv, wenn für alle

Eine reflexive, symmetrische und transitive Relation in Äquivalenzrelation in . Sei

gilt: gilt:

gilt:

heißt

Dann ist

reflexiv und symmetrisch, aber nicht transitiv, da und , aber . Also handelt es sich bei nicht um eine Äquivalenzrelation in . Auf der anderen Seite ist

eine Äquivalenzrelation in Sei

.

die Menge aller Geraden der Ebene. Dann ist

eine Äquivalenzrelation in sei eine Menge, heißt die Menge

. und

sei eine Äquivalenzrelation in

die Äquivalenzklassse von . Die Menge aller Äquivalenzklassen von auch mit bezeichnet.

. Dann

wird

In einer Äquivalenzklasse finden sich also alle Elemente wieder, die zu einem bestimmten Element in Relation stehen. Für die Relation aus dem Beispiel oben gilt z.B: . Damit sind alle Elemente von in einer der Äquivalenzklassen. Auf der anderen Seite haben die Äquivalenzklassen kein Element gemeinsam, d. h., ihr Schnitt ist leer. Das gilt allgemein:

Die Äquivalenzklassen einer Äquivalenzrelation in bilden eine Partition von . Ist

eine Äquivalenzrelation in einer Menge Jedes

, dann gilt:

ist in einer der Äquivalenzklassen enthalten, und

verschiedene Äquivalenzklassen haben eine leere Schnittmenge:

für

.

Die Äquivalenzklassen teilen also eine größere Menge in kleinere, übersichtlichere Teile auf. Wir haben von dieser Eigenschaft beispielsweise in Kapitel 1 Gebrauch gemacht, als wir den Satz von Myhill-Nerode mit Hilfe von Äquivalenzklassen formuliert und bewiesen haben. Auch bei der Konstruktion von Minimalautomaten spielten Äquivalenzklassen äquivalenter Zustände einer wichtige Rolle.

Ordnungsrelationen Ein weiterer wichtiger Typ Relation sind die Ordnungsrelationen. Mit Ordnungsrelationen lassen sich die Elemente in einer gewissen Weise anordnen. Hier die Eigenschaften, die zu einer Ordnungsrelation gehören:

sei eine Menge. Eine Relation

in

Eine Halbordnung Relation in . Eine Halbordnung gilt:

heißt antisymmetrisch, falls gilt:

in in

ist eine reflexive, antisymmetrische und transitive heißt lineare Ordnung, wenn für alle

Beachten Sie, dass eine Relation gleichzeitig sowohl symmetrisch als auch antisymmetrisch sein kann (überlegen Sie sich ein Beispiel!). In Kapitel 10 haben wir die

Halbordnungen und für formale Sprachen kennengelernt und ausgiebig Gebrauch von der Transitivitätseigenschaft gemacht. Über den natürlichen Zahlen bildet das Paradebeispiel einer linearen Halbordnung.

Funktionen Eine Funktion und aufgefasst werden:

kann als spezielle Relationen zwischen zwei Mengen

seien zwei Mengen. Eine Relation zwischen falls gilt:

und

heißt Funktion,

und zu jedem

existiert ein

, so dass

.

Die Menge wird dabei als Definitionsbereich und die Menge als Zielbereich der Funktion bezeichnet. Wir schreiben in diesem Fall auch . Gilt für eine Funktion , so schreiben wir dafür auch Diese Definition legt fest, dass zu jedem (sogenanntes Urbild) genau ein Bild existieren muss, so dass . Schwächt man diese Eigenschaft ab, sodass nicht jedem ein Bild zugeordnet ist, erhält man eine partielle Funktion. Partielle Funktionen sind manchmal als Übergangsfunktionen für Automaten angenehmer zu handhaben, da nicht für jede denkbare Situation eine Reaktion des Automaten definiert werden muss. Wir haben partielle Funktionen in Kapitel 4 kennen gelernt, als wir die von einer Turing-Maschine berechnete Funktion betrachtet haben: Da evtl. nicht für jedes Inputwort anhält, kann evtl. auch nicht jedem ein Funktionswert zugeordnet werden. Die Übergangsfunktionen unserer Automaten aus Teil I hingegen sind keine partiellen Funktionen. Die Übergangsfunktion eines DFAs aus Kapitel 1 ist eine Funktion , während für die Übergangsfunktion eines NFAs aus Kapitel 2 gilt: . Die Übergangsfunktion

einer DTM aus Kapitel 4 ist eine Funktion ,wobei das Bandalphabet der TM

ist. In den Kapiteln 4 und 10 haben wir Funktionen der Form

betrachtet, wobei ein Alphabet aus endlich vielen Symbolen ist. Die Funktionen heißen Turing-berechenbar, falls es eine Turing-Maschine gibt, die für den Funktionswert in endlicher Zeit berechnen kann. Hier noch einige weitere wichtige Eigenschaften von Funktionen, die ich hier der Vollständigkeit halber angebe:

seien zwei Mengen und heißt surjektiv, falls es zu jedem . heißt injektiv, falls gilt:

eine Funktion. ein Urbild

gibt mit .

heißt bijektiv, falls sowohl surjektiv als auch injektiv ist. Bei einer bijektiven Funktion existiert zu jedem ein eindeutiges Urbild, so dass sich eine neue Funktion definieren läßt, die jedem Bild sein Urbild zuordnet: seien zwei Mengen und Funktion, die jedem Bild ihr Urbild Umkehrfunktion .

eine bijektive Funktion. Die zuordnet, heißt

Mit Hilfe von bijektiven Funktionen lässt sich die Mächtigkeit von endlichen und unendlichen Mengen vergleichen, ohne die Elemente der Mengen zählen zu müssen: Zwei Mengen heißen gleich mächtig, in Zeichen dann, wenn es eine bijektive Funktion gibt.

, genau

Im Falle einer endlichen Menge haben wir die Mächtigkeit bereits über die Anzahl der Elemente von definiert. Die neue Definition des Begriffes »gleich mächtig« mit Hilfe bijektiver Funktionen hat den Vorteil, dass sie auch für unendliche Mengen funktioniert: Anstatt die Elemente der Mengen einzeln zählen zu müssen, kann man über die Existenz einer bijektiven Abbildung nachweisen, dass zwei Mengen die gleiche Anzahl von Elementen besitzen. Natürlich sind die beiden Definitionen für endliche Mengen gleichwertig:

Bijektive Funktionen bilden Mengen mit gleich

vielen Elementen aufeinander ab. und

seien endliche Mengen. Dann gilt:

Mit Hilfe bijektiver Funktionen konnte Cantor, der Begründer der Mengenlehre beispielsweise zeigen:

indem er einerseits eine bijektive Funktion zwischen den natürlichen Zahlen und den rationalen Zahlen angab und andererseits zeigte, dass es keine bijektive Funktion zwischen den reellen und den natürlichen Zahlen geben kann (sogenanntes Cantorsches Diagonalargument). Mit einer Variante seines Diagonalarguments konnten wir in Kapitel 4 die Unentscheidbarkeit des Halteproblems beweisen. Die Mächtigkeit der natürlichen Zahlen wird auch mit dem hebräischen Symbol (sprich: Aleph-Null) bezeichnet, die der reellen Zahlen mit .

Aufgaben zu Mengen und Relationen Als kleine Hilfe, so zur Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wiley-vch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. 1. Die Menge habe Elemente enthält.

Elemente. Zeigen Sie, dass die Potenzmenge

genau

2. Die Menge habe Elemente und die Menge habe Elemente. Zeigen Sie: Die Produktmenge enthält genau Elemente. 3. Was ist falsch an der folgenden Argumentation: sei eine symmetrische und transitive Relation in einer Menge . Dann gilt:

also folgt die Reflexivität einer Relation automatisch aus ihrer Symmetrie und Transitivität.

Kapitel 14

Graphen und Bäume IN DIESEM KAPITEL befassen wir uns mit zwei interessanten endlichen Strukturen, die sich ganz leicht über die Konzepte aus der Mengenlehre erklären lassen: Graphen und Bäume erläutere ich wie Graphen im Computer dargestellt werden führe ich Sie in Tourenprobleme ein erkläre ich Ihnen was Sie zu gewichteten Graphen wissen sollten

Graphen und Bäume bieten nicht nur das Szenario für eine Fülle von interessanten Problemen wie etwa dem Travelling-Salesman-Problem, sondern bilden auch ein wichtiges Hilfsmittel für theoretische Überlegungen in der gesamten Informatik. Viele wichtige Anwendungsprobleme lassen sich in Form von Graphen modellieren, wenn es nur auf die Beziehungen zwischen Objekten ankommt, nicht aber auf ihre Position.

Graphen und ihre Eigenschaften Hat man eine bestimmte Menge an Objekten, so kodieren Graphen die Information darüber, welche Objekte miteinander verbunden sind. Die Art der Objekte und wo genau sich diese vielleicht in der Realität aufhalten, spielt für einen Graphen keine Rolle. Ein schematischer Busfahrplan, der anzeigt, welche Haltestellen es gibt und durch welche Buslinien sie verbunden sind, bildet ein typisches Beispiele für eine Situation, die sich gut durch Graphen modellieren läßt. Ein Graph

besteht aus einem Paar zweier Mengen

und

.

ist dabei die Knotenmenge (Vertex Set) und die Kantenmenge (Edges). Formal ist , und für gilt entweder oder

Im ersteren Fall heißt ungerichtet, im letzteren gerichtet (in diesem Fall spielt die Reihenfolge der Knoten eine Rolle, d. h., die Kanten können nur in einer

Richtung genutzt werden). Von dieser Definition nicht abgedeckt werden die sogenannten Multigraphen, bei denen es zwischen zwei Knoten mehr als eine Kante geben kann, und die Hypergraphen, bei denen eine Kante mehr als zwei Knoten verbinden kann. Solche Graphen werden wir im Rahmen dieses Buchs nicht betrachten. 1.

Der Graph

mit

und ist ungerichtet:

Abbildung 14.1: Ein ungerichteter Graph

2. Der Graph

mit

und ist gerichtet:

Abbildung 14.2: Ein gerichteter Graph

Wie man sieht, müssen die Kanten nicht unbedingt verschiedene Knoten miteinander verbinden. Eine Kante der Form bzw. wird auch als Schlinge bezeichnet. Graphen, die keine Schlingen enthalten, heißen schlingenfrei oder auch einfach. Hier einige weitere wichtige Bezeichnungen im Zusammenhang mit Graphen:

sei ein Graph. Zwei Knoten, die zu einer Kante gehören, heißen benachbart. Ist ungerichtet, heißt die Anzahl der Kanten, die einen Knoten enthalten, Grad . Ist gerichtet, so heißt die Anzahl der Kanten, die von einem Knoten ausgehen, Ausgangsgrad . Die Anzahl der Kanten, die in enden, heißt Eingangsgrad . heißt vollständig, falls jedes Paar eine Kante verbunden ist.

verschiedener Knoten

durch

Der folgende ungerichtete Graph mit vier Knoten ist vollständig. Jeder seiner Knoten hat Grad .

Abbildung 14.3: Ein vollständiger Graph mit vier Knoten

Es gibt eine einfache Beziehung zwischen der Anzahl und den Graden seiner Knoten:

der Kanten in einem Graphen

Zusammenhang zwischen Knotengraden und Anzahl der Kanten in einem Graphen sei ein Graph mit

Kanten und der Knotenmenge

. Dann gilt: , falls

ungerichtet ist und schlingenfrei.

, falls

ungerichtet ist und Schlingen enthält. , falls

gerichtet ist.

Die Summe der Knotengrade in einem einfachen ungerichteten Graphen ist also immer eine gerade Zahl. Hat nun ein Knoten den Grad , so benötigt einen Partnerknoten , der ebenfalls einen ungeraden Grad besitzt. Anderenfalls könnte die Summe der Knotengrade keine gerade Zahl sein. Die Knoten mit ungeradem Grad treten also immer paarweise auf: Ihre Anzahl ist selbst eine gerade Zahl.

Zusammenhängende Graphen In einem zusammenhängenden Graphen ist jeder Knoten von jedem anderen Knoten aus

erreichbar. Um diese intuitive Vorstellung präzisieren zu können, benötigen wir zunächst den Begriff eines Wegs: Ein Weg ist eine Folge von Kanten, die nacheinander durchlaufen werden:

sei ein ungerichteter Graph. Eine Folge von Kanten , falls alle Kanten

Elemente der Kantenmenge

Die Länge des Wegs ist definiert als die Anzahl besteht.

heißt Weg in sind.

der Kanten, aus denen er

Die Länge des kürzesten Wegs, der einen Knoten mit einem Knoten verbindet, heißt Abstand von und . Die Menge

heißt Nachbarschaft von

.

Ein Weg, der denselben Start- und Endknoten hat, heißt Kreis. Graphen, die keine Kreise enthalten, heißen kreisfrei. Für gerichtete Graphen gelten die obigen Definitionen analog. Man muss nur die ungerichteten Kanten durch gerichtete Kanten ersetzen. Anstelle von Kreisen spricht man bei gerichteten Graphen auch von Zyklen. Mit dem Begriff des Wegs können wir nun den Begriff eines zusammenhängenden Graphen exakt fassen.

sei ein Graph. Ist

ungerichtet, so heißt zusammenhängend, falls für jedes Knotenpaar ein Weg existiert, der mit verbindet.

Ist gerichtet, so heißt schwach zusammenhängend, falls die ungerichtete Version von mit ungerichteten statt gerichteten Kanten zusammenhängend ist. Ist ungerichtet, so heißt Knotenpaar

stark zusammenhängend, falls für jedes ein Weg existiert, der mit verbindet.

Gerichteten Graphen sieht man oft nicht auf den ersten Blick an, ob sie zusammenhängend sind oder nicht, während ungerichtete Graphen, die nicht zusammenhängend sind, in zusammenhängende Teile zerfallen, wie Abbildung 14.4(d) zeigt.

Abbildung 14.4: Beispiele für zusammenhängende und nicht zusammenhängende Graphen

Die zusammenhängenden Teile eines nicht zusammenhängenden, ungerichteten Graphen werden auch als Zusammenhangskomponenten bezeichnet. Man kann sie als Äquivalenzklassen einer Äquivalenzrelation in der Knotenmenge auffassen. Für ungerichtete Graphen

bildet die Relation

eine Äquivalenzrelation in . Ihre Äquivalenzklassen bilden die Zusammenhangskomponenten von .

Darstellung von Graphen im Computer

In den Kapiteln 10 und 11 haben wir des Öfteren darüber gesprochen, ob und wie schnell eine Turing-Maschine Probleme im Zusammenhang mit Graphen lösen kann, deshalb widmen wir uns in diesem Abschnitt kurz der Frage, wie sich Graphen eigentlich in binärer Form auf dem Eingabeband einer TM repräsentieren lassen. Die gesamte Information über den Graphen steckt in der Anzahl seiner Knoten sowie in der Information darüber, welcher Knoten mit welchem verbunden ist. Diese Informationen lassen sich in einer binären Matrix zusammenfassen, die als Adjazenzmatrix bezeichnet wird:

sei ein Graph, wobei

Die

-Matrix

.

mit

heißt Adjazenzmatrix von

.

Hier ein Beispiel: Der Graph

mit

und besitzt die Adjazenzmatrix

Alle Eigenschaften eines Graphen spiegeln sich auf irgendeine Weise in der Adjazenzmatrix wider. So ist der Graph in obigem Beispiel ungerichtet, da seine Adjazenzmatrix symmetrisch ist (d. h., es gilt ), und ist schlingenfrei, da in der Diagonalen von lauter Nullen stehen. Wie steht es mit der Frage, ob zusammenhängend ist oder nicht? Auch diese Frage läßt sich mit Hilfe der Adjazenzmatrix beantworten, denn sie besitzt eine sehr interessante Eigenschaft:

Adjazenzmatrix und Weglängen in einem Graphen sei ein Graph mit der Adjazenzmatrix Das Element

an der Stelle

der Matrix

. Dann gilt für entspricht

:

der Anzahl der Wege der Länge zwischen den Knoten

und

.

Diese auf den ersten Blick überraschende Eigenschaft, die wir bereits in Kapitel 2 im Zusammenhang mit stochastischen Automaten benutzt haben, läßt sich leicht mit Hilfe vollständiger Induktion beweisen. Für

ist die Behauptung offenbar wahr. Nun gehen wir davon aus, sie gilt für ein . Dann müssen wir zeigen, dass die Behauptung des Satzes auch für die Potenz gilt. Die Elemente der Matrix sollten also die Anzahl der Wege der Länge zwischen den Knoten von angeben.

Berechnen wir also die Elemente von

Da die Zahl

:

nach Induktionsvoraussetzung die Anzahl der Wege der Länge

von nach angibt, steht das Produkt für die Anzahl der Wege der Länge von nach , die über den Knoten führen (s. Abbildung 14.5). Summiert man also über alle , erhält man die Anzahl aller Wege der Länge , die von nach führen.

Abbildung 14.5: Die Anzahl der Wege der Länge

von

nach

ist durch

gegeben.

Diese Eigenschaft kann man benutzen, um zu überprüfen, ob ein Graph mit Knoten zusammenhängend bzw. stark zusammenhängend ist: Ein Weg in , der einen Knoten mit einem anderen Knoten verbindet, kann höchstens die Länge haben. Ist also für alle , so gibt es keinen Weg von nach . Betrachten wir die Potenzen der obigen Adjazenzmatrix

:

Tatsächlich ist für kein Paar

das Element

für alle

gleich

null, der Graph muss also zusammenhängend sein. Das kann man auch erkennen, wenn man die Summe

betrachtet. Abbildung 14.6 zeigt den zu

gehörigen Graphen.

Abbildung 14.6: Der Graph mit der Adjazenzmatrix

Da die Berechnung der Potenzen von möglich ist, haben wir auch gezeigt:

-Matrizen mit polynomialem Aufwand

Zusammenhängende Graphen können mit polynomialem Aufwand erkannt werden Sei

. Die Sprache

ist in der Klasse P.

Bäume Der Graph aus Abbildung 14.6 ist sowohl zusammenhängend als auch kreisfrei. Gerade die Eigenschaft »zusammenhängend« ist in vielen Anwendungsszenarien besonders wünschenswert. In einem Busfahrplan bedeutet sie beispielsweise, dass jede Haltestelle von jeder anderen aus erreichbar ist. Auf der anderen Seite bedeutet »kreisfrei« in einem gewissen Sinne, dass keine redundanten Kanten vorhanden sind. Für das Vorhandenein der ersten Eigenschaft sind eher viele Kanten günstig, für die zweite eher weniger Kanten. Bäume sind gleichzeitig zusammenhängend und kreisfrei und bilden gewissermaßen das Gleichgewicht zwischen diesen beiden Anforderungen. Aufgrund ihrer besonders einfachen Struktur spielen sie in zahlreichen Anwendungen in der Informatik eine zentrale Rolle. In diesem Buch sind sie uns das erste Mal in Kapitel 2 in Form von Verarbeitungsbäumen für ein Inputwort begegnet. Ein ungerichteter Graph kreisfrei ist.

heißt Baum, falls er zusammenhängend und

Die einfache Struktur von Bäumen äußert sich unter anderen in dem simplen Zusammenhang zwischen der Anzahl ihrer Knoten und Kanten:

Struktur von Bäumen Ein Baum mit

Knoten besitzt genau

Kanten.

Zwei Knoten eines Baums sind immer durch genau einen Weg miteinander verbunden.

Der Beweis erfolgt wieder durch vollständige Induktion: Ein Baum mit Knoten kann nur 0 Kanten enthalten. Hat man einem Baum mit Knoten, der nach Induktionsannahme Kanten enthält, und fügt einen weiteren Knoten hinzu, so kann dieser mit dem anderen Knoten nur durch genau eine Kante verbunden werden: Eine Kante weniger, und der Baum ist nicht mehr zusammenhängend, eine mehr, und es entsteht ein Kreis. Gäbe es in einem Baum mehr als einen Weg zwischen zwei Knoten, entstünde durch Verbinden des ersten Wegs mit dem zweiten in umgekehrter Richtung ein Kreis. Weniger als ein Weg zwischen zwei Knoten ist aber auch unmöglich, da dann der Baum nicht mehr zusammenhängt.

Aus einem zusammenhängenden, aber nicht kreisfreien ungerichteten Graphen kann man so lange Kanten entfernen, bis der verbleibende Restgraph zwar noch zusammenhängend ist (und immer noch dieselbe Knotenmenge hat), aber keine Kreise mehr enthält. Dieser zusammenhängende und kreisfreie Restgraph bildet gewissermaßen das minimale Gerüst von Kanten, das bei gegebener Knotenmenge nötig ist, um einen zusammenhängenden Graphen zu bekommen. Man nennt ihn einen Spannbaum von . Je nachdem, welche Kanten man zuerst aus entfernt, können sich unterschiedliche Spannbäume für denselben Graphen ergeben (s. Abbildung 14.7).

Abbildung 14.7: Ein Graph

und zwei mögliche Spannbäume

Man kann zeigen, dass jeder zusammenhängende Graph mindestens einen Spannbaum besitzt. Man kann ihn konstruieren, indem man zunächst nur die Knoten des Graphen zeichnet und dann so lange Kanten aus der Kantenmenge hinzufügt, bis das nicht mehr möglich ist, ohne dabei einen Kreis zu erzeugen. Oft ist es sinnvoll, einen bestimmten Knoten des Baums als Wurzelknoten auszuzeichnen. Alle Nachbarknoten des Wurzelknotens werden eine Ebene tiefer gezeichnet, alle noch nicht gezeichneten Nachbarn dieser Knoten wiederum eine Ebene tiefer, bis zu den Blättern, die keine Nachbarn in einer tieferen Ebene besitzen. Auf diese Weise entsteht ein Baum in geordneter Darstellung mit einer genau definierten Höhe wie in Abbildung 14.8.

Abbildung 14.8: Ein Baum in ungeordneter und in geordneter Darstellung



sei ein Baum in geordneter Darstellung. Die Nachbarn eines Knotens in einer tieferen Ebene heißen die Kindknoten von . Entsprechend heißt der Elternknoten dieser Kindknoten. Knoten, die keine Kinder haben, heißen Blätter. Der Abstand eines Knotens zum Wurzelknoten heißt die Ebene von . Der größte vorkommende Abstand eines Knotens vom Wurzelknoten heißt Höhe des Baums. Ein Baum in geordneter Darstellung, bei dem jeder Knoten höchstens 2 Kindknoten hat, heißt Binärbaum.

Tourenprobleme Ein Tourenproblem besteht in der Frage, ob ein Graph einen Kreis oder einen Weg mit einer bestimmten Eigenschaft enthält. Wie wir sehen werden, können unterschiedliche Tourenprobleme in völlig unterschiedlichen Komplexitätsklassen liegen.



sei ein zusammenhängender Graph.

Ein Kreis in , der jede Kante genau einmal enthält, heißt Euler-Kreis. Ein Graph, der solch einen Kreis enthält, heißt eulersch. Abbildung 14.9 zeigt Beispiele für eulersche bzw. nicht-eulersche Graphen.

Abbildung 14.9: Beispiele für eulersche und nicht-eulersche Graphen. Der Graph auf der rechten Seite enthält vier Knoten mit ungeradem Grad.

Im Jahr 1735 konnte Leonhard Euler ein notwendiges und hinreichendes Kriterium angeben, mit dem sich auf einfache Weise prüfen lässt, ob in einem Graphen ein Kreis existiert, der jede Kante des Graphen genau einmal enthält.

Satz von Euler (1735) sei ein zusammenhängender Graph. Dann gilt: Ist

ungerichtet, so gilt:

Ist

gerichtet, so gilt:

Wie zu der damaligen Zeit üblich, gab Euler keinen formalen Beweis für sein Kriterium an. Der deutsche Mathematiker Carl Hierholzer formulierte aber viel später einen Algorithmus, mit dem sich ein Eulerkreis in einem eulerschen Graphen konkret konstruieren lässt. Der Hierholzer-Algorithmus wurde 1873 nach seinem Tod veröffentlicht und beruht im Wesentlichen auf der Idee, zunächst einen beliebigen Kreis in durchlaufen und dann aus zu entfernen. Der verbleibende Restgraph ist immer noch eulersch, da durch das Entfernen eines Kreises die Knoten, aus denen der Kreis besteht, jeweils eine gerade Anzahl von Kanten verlieren. Das Verfahren kann dann so lange fortgesetzt werden, bis der Restgraph leer ist. Danach werden die Kreise an gemeinsamen Knoten miteinander verbunden, so dass sich am Ende ein Eulerkreis ergibt. Das Kriterium aus dem Satz von Euler läßt sich leicht mit Hilfe der Adjazenzmatrix von in linearer Zeit überprüfen. Damit ist klar:

Eulersche Graphen können mit polynomialem Aufwand erkannt werden Sei

. Die Sprache

ist in der Klasse P.

Wir haben uns bereits in Kapitel 11 mit Hamilton-Kreisen, also Kreisen, die jeden Knoten eines Graphen genau einmal enthalten, beschäftigt, und dort gezeigt, dass das Problem, zu entscheiden, ob einen Hamilton-Kreis enthält, NP-vollständig ist. Trotz der großen formalen Ähnlichkeit mit Eulerkreisen ist dieses Problem also im Allgemeinen viel schwieriger zu lösen. Ich möchte an dieser Stelle nur zwei hinreichende Kriterien dafür, dass ein Graph einen Hamilton-Kreis enthält, angeben:

Vollständige Graphen enthalten Hamilton-Kreise sei ein ungerichteter, vollständiger Graph mit

Knoten. Dann besitzt

genau

Hamiltonkreise.

Ausgehend von einem Startknoten, hat man Möglichkeiten, weiterzulaufen. Hat man den nächsten Knoten erreicht, gibt es noch Möglichkeiten usw., bis schließlich der Startknoten als letzte Möglichkeit übrig bleibt und der Hamilton-Kreis vollständig ist. Insgesamt ergeben sich also Möglichkeiten, die aber noch durch

2 dividiert werden müssen, da jeder der konstruierten Hamilton-Kreise in zwei Richtungen durchlaufen werden kann. Die einfache Tatsache, dass ein vollständiger Graph mit Knoten Hamiltonkreise besitzt, zeigt, dass der Versuch, das Travelling-Salesman-Problem über das Durchprobieren aller Möglichkeiten zu finden, mit exponentiellem Aufwand verbunden ist. Das zweite hinreichende Kriterium, das ich hier ohne Beweis angeben möchte, stammt aus dem 20. Jahrhundert:

Satz von Ore sei ein einfacher (d. h. ungerichtet, schlingenfrei und ohne Mehrfachkanten) Graph mit Knoten. Gilt für jedes nicht benachbarte Knotenpaar in die Bedingung

so enthält

einen Hamiltonkreis.

Gewichtete Graphen Man erhält einen gewichteten Graphen

, indem man jeder Kante

eine positive ganze Zahl , das sogenannte Gewicht zuordnet (s. Abbildung 14.10 (a)). Dadurch lassen sich viele wichtige Probleme aus den Anwendungen modellieren, z. B. das Finden der kürzesten Verbindung von nach in einem UBahn-Netz, indem man den einzelnen Kanten die Fahrtzeiten als Gewichte zuordnet. Ein gewichteter Graph läßt sich im Computer darstellen, indem man in seiner Adjazenzmatrix an der Stelle statt einer 1 das Gewicht der Kante einträgt. Man spricht dann auch von der Gewichtsmatrix des Graphen. Aus den Entscheidungsproblemen, die wir im letzten Abschnitt betrachtet haben (»gibt es einen Kreis mit der Eigenschaft ?«) werden bei gewichteten Graphen Optimierungsprobleme (»finde den kürzesten Kreis mit der Eigenschaft «). Bei der Formulierung der Optimierungsprobleme muss durch geeignete Einschränkungen sicher gestellt sein, dass die betreffenden Probleme mindestens eine Lösung besitzen. Das vielleicht einfachste aller Optimierungsprobleme ist die Suche nach dem minimalen Spannbaum für einen zusammenhängenden, gewichteten Graphen . Der minimale Spannbaum ist derjenige unter allen Spannbäumen von mit dem kleinsten Gesamtgewicht. Man findet ihn, indem man, ausgehend von den Knoten von , immer

die Kante mit dem kleinsten Gewicht hinzufügt, die man hinzufügen kann, ohne dass ein Kreis entsteht (siehe Abbildung 14.10).

Abbildung 14.10: Konstruktion des minimalen Spannbaums zum gewichteten Graphen

Die Optimierungsvarianten der Entscheidungsprobleme für Euler- und Hamilton-Kreise heißen Chinese-Postman-Problem (CPP) bzw. Travelling-Salesman-Problem (TSP). Das TSP in der Entscheidungsvariante haben wir bereits in Kapitel 11 kennengelernt. Vor dem Chinese-Postman-Problem steht ein Postbote, der die Straßen in seinem Zustellbezirk mit dem kleinsten Gesamtaufwand ablaufen will, um dann zu seinem Ausgangspunkt zurückzukehren. sei ein gewichteter, zusammenhängender Graph. Das Problem, den Kreis in mit dem kleinsten Gesamtgewicht zu finden, der jede Kante mindestens einmal benutzt, heißt Chinese-Postman-Problem (CPP). Die Einschränkung besteht hier darin, dass nach Kreisen gesucht wird, die jede Kante mindestens einmal benutzen. So wird die Problemstellung auch für nicht-eulersche Graphen lösbar. Ist eulersch, ist der Euler-Kreis automatisch die Lösung des ChinesePostman-Problems. Im Allgemeinen ist das CPP mit einem Algorithmus der Komplexität lösbar, es liegt also in P. sei ein gewichteter, vollständiger Graph mit mehr als zwei Knoten. Das Problem, den Kreis in mit dem kleinsten Gesamtgewicht zu finden, der jeden Knoten mindestens einmal besucht, heißt Travelling-Salesman-Problem (TSP). Hier wird dadurch, dass nur vollständige Graphen betrachtet werden, sichergestellt, dass das TSP überhaupt lösbar ist. Ein vollständiges Aufzählen aller möglichen HamiltonKreise hätte exponentiellen Aufwand. Natürlich sind schnellere Algorithmen zum Lösen des TSP bekannt, aber keiner mit polynomialem Aufwand. Wie sein Gegenstück, das Entscheidungsproblem, ob ein Graph einen Hamiltonkreis enthält, ist die Entscheidungsvariante des TSP NP-vollständig, wie in Kapitel 11 bewiesen.

Näherungsweise Lösung des TSP Zur näherungsweisen Lösung des TSP existieren viele sogenannte Heuristiken, das sind einfache Algorithmen mit polynomialer Laufzeit, die in den meisten Fällen Lösungen liefern, die nahe am Optimum liegen. Die einfachste dieser Heuristiken ist die sogenannte Nearest-Neighbour-Heuristik. Dabei startet man die Tour in einem beliebigen Knoten und besucht immer denjenigen noch nicht besuchten Knoten als nächsten, der dem aktuellen Knoten am nächsten liegt. In der Praxis liefern die Insertion-Strategien bessere Resultate: Hierbei beginnt man mit einer kurzen Tour durch eine kleine Teilmenge der Knoten und fügt dann immer denjenigen Knoten in die Tour ein, der allen Knoten der Tour gleichzeitig am nächsten liegt (Nearest Insertion) oder am weitesten von ihnen entfernt ist (Farthest Insertion). Auch Random Insertion Strategien sind möglich. Bei allen Insertion-Strategien wird der nächste Knoten jeweils so eingefügt, dass der Aufwand minimal bleibt. Die Heuristik mit der kleinsten garantierten Abweichung vom Optimum ist der Christofides-Algorithmus. In ihm kommen viele der bereits besprochenen Algorithmen zusammen, deswegen möchte ich ihn zum Abschluss etwas detaillierter besprechen. Um die Fehlerabschätzung für den Christofides-Algorithmus beweisen zu können, müssen wir zunächst zwei Annahmen über die Gewichtsmatrix des Graphen treffen: sollte symmetrisch sein, also

Für die Gewichte sollte die Dreiecksungleichung gelten, also

Beide Annahmen sind in den üblichen Anwendungsszenarien für das TSP, bei denen die Gewichte in irgendeiner Form Weglängen zwischen den Knoten entsprechen, erfüllt: Der Weg von nach ist normalerweise genauso lang wie der von nach , und der direkte Weg von nach ist immer kürzer oder mindestens gleich lang wie der Umweg über .

Christofides-Algorithmus sei ein vollständiger gewichteter Graph mit symmetrischer Gewichtsmatrix , die auch die Dreiecksungleichung erfüllt. Der folgende Algorithmus liefert einen Hamiltonkreis für , der um einen Faktor von höchstens 1.5 länger ist als die Lösung des TSP für : Bestimme den minimalen Spannbaum (MST) von mit ungeradem Grad. Bestimme das optimale Matching für die Knoten in

und die Menge .

der Knoten im MST

Verbinde die Knoten in gemäß dem optimalen Matching durch Kanten. Der so aus dem MST entstandene Graph ist eulersch. Finde einen Eulerkreis

in

.

Überspringe die doppelt vorkommenden Knoten im Eulerkreis. Dadurch ergibt sich ein Hamiltonkreis als Output des Algorithmus.

Bei einem Matching werden je zwei Knoten einer Menge zu Paaren zusammengefasst, und zwar so, dass jeder Knoten in genau einem Paar vorkommt. Dazu muss die Anzahl der Knoten natürlich gerade sein - das ist aber bei den Knoten mit ungeradem Grad in jedem Graphen der Fall, wie wir am Anfang dieses Kapitels gesehen haben. Das optimale Matching ist unter allen möglichen Matchings dasjenige mit dem kleinsten Gesamtgewicht. Bei einer kleinen Anzahl von Knoten läßt sich das optimale Matching noch durch Ausprobieren finden, für größere gibt es dafür einen Algorithmus, der zwar aufwendig, aber zum Glück noch polynomial ist (genauer gesagt, liegt die Laufzeit in ). Der Euler-Kreis , der im Rahmen des Christofides-Algorithmus konstruiert wird, besteht aus den Kanten des MST sowie den Kanten des optimalen Matchings. Also gilt

Das Gewicht des MST ist kleiner als das Gewicht der TSP-Lösung, denn die TSP-Lösung ist ein Kreis, enthält also auf jeden Fall eine Kante mehr als der MST. Entfernt man eine Kante aus der TSP-Lösung, erhält man (irgendeinen) Spannbaum für , während der MST den kleinstmöglichen Spannbaum für darstellt. Also gilt:

Die Kanten, aus denen die TSP-Lösung zusammengesetzt ist, sind nach Definition nicht anderes als Paare von Knoten:

Betrachte man nun jede zweite Kante dieser Folge, erhält man je ein Matching der Knoten von :

Die Lösung des TSP kann also als eine Kombination irgendwelcher zweier Matchings der Knoten in aufgefasst werden. Deswegen gilt

und insgesamt

Überspringt man schließlich die doppelt besuchten Knoten in , um einen Hamiltonkreis zu bekommen, so kann sich das Gewicht von dadurch wegen der Dreiecksungleichung nicht vergrößern, und es gilt:

Wir betrachten einen vollständigen gewichteten Graphen mit 6 Knoten und bestimmen für einen kurzen Hamiltonkreis nach dem ChristofidesAlgorithmus:

Abbildung 14.11: Beispielgraph für den Christofides-Algorithmus

Wir bestimmen zunächst den minimalen Spannbaum von Gesamtgewicht 43 (s. Abbildung 14.12).

. Er hat das

Abbildung 14.12: Minimaler Spannbaum von

Alle Knoten im MST haben ungeraden Grad, so dass wir für alle sechs Knoten ein optimales Matching finden müssen. Mit ein wenig Probieren findet man heraus, dass bei einem Gesamtgewicht von 40 das optimale Matching darstellt. Wir tragen deshalb die entsprechenden Kanten zusätzlich in den MST ein und erhalten den eulerschen Graphen in Abbildung 14.13 (a), wobei die Gewichte der Übersichtlichkeit halber weggelassen sind.

Abbildung 14.13: Euler-Graphen für den Christofides-Algorithmus

Um einen Euler-Kreis für zu finden, durchlaufen wir zunächst einen zufälligen Kreis in , z. B.

Der Restgraph , den man erhält, wenn man so aus wie in Abbildung 14.13 (b). Wir laufen in

aus

entfernt, sieht dann

erneut einen Kreis, z. B.

Entfernt man auch aus dem Graphen, bleibt nur der leere Graph übrig, so dass wir und zu einem Eulerkreis für zusammensetzen können:

ist noch kein Hamiltonkreis für , da die Knoten und in ihm doppelt vorkommen. Weil vollständig ist, können wir diese Knoten, wenn sie ein zweites Mal vorkommen, einfach überspringen. Wir erhalten schließlich den Hamiltonkreis

mit dem Gesamtgewicht 80 als Output des Christofides-Algorithmus. Die Lösung des TSP für ist der Kreis mit dem Gesamtgewicht 76. In diesem Beispiel weichen also die ChristofidesLösung und die optimale Lösung um 5 % voneinander ab.

Aufgaben zu Graphen und Bäumen Als kleine Hilfe, so zur Sicherheit für Sie, stelle ich Ihnen einige der Lösungen unter http://wiley-vch.de/ISBN978-3-527-71431-5 zur Verfügung, aber nicht alle. Einige Lösungen müssen Sie selbst ausknobeln, so bleiben sie auch besser im Gedächtnis haften. 1. Zeichnen Sie alle Bäume mit weniger als fünf Knoten. Zeichnen Sie nur Bäume, die nicht isomorph sind, d. h., die Nummerierung der Knoten soll keine Rolle spielen. 2. Zeichnen Sie alle einfachen Graphen mit genau vier Knoten, die nicht zueinander isomorph sind. Welche davon sind eulersch? 3. Wie kann man der Adjazenzmatrix ansehen, ob ein gerichteter Graph kreisfrei ist? 4. Betrachten Sie den Graphen aus Abbildung 14.11 und bestimmen Sie Näherungslösungen des TSP mittels der Heuristiken Nearest-Neighbour, NearestNeighbour-Insertion und Farthest-Neighbour-Insertion.

Teil V

Top-Ten-Teil

Besuchen Sie uns auf www.facebook.de/fuerdummies

IN DIESEM TEIL… schauen wir uns die Lebenswege der (aus meiner Sicht) zehn größten theoretischen Informatiker aller Zeiten an. Die Informatik wurde von Menschen gemacht, aber die menschliche Komponente verschwindet nur allzu leicht hinter der glatten, formalen Fassade der theoretischen Resultate. In diesem Abschlussteil möchte ich deshalb Ihren Blick kurz auf diese menschliche Seite richten. Die beschriebenen Lebenswege entsprechen manchmal den klassischen Werdegängen erfolgreicher Akademiker, manchmal sind sie aber auch regelrecht dramatisch oder sogar tragisch, und sie zeigen uns, dass intellektuelle Brillianz, Anerkennung und Erfolg nicht immer auch ein glückliches Leben garantieren.

Kapitel 15

Top-Ten-Theoretiker IN DIESEM KAPITEL erhalten Sie einen grob chonologischen Einblick in die Leben der großen theoretischen Informatiker

In diesem Kapitel möchten ich Ihnen die menschliche Seite der theoretischen Informatik näherbringen, indem ich Ihnen die 10 größten theoretischen Informatiker kurz vorstelle. Die Auswahl ist selbstverständlich rein subjektiv, und es gibt natürlich viele andere, die die Aufnahme in diese kleine Hall of Fame ebenso verdient hätten. Ich habe mich bemüht, vorwiegend solche Wissenschaftler aufzuführen, die mit wichtigen Resultaten in diesem Buch in Verbindung stehen. Die Anordnung ist grob chronologisch und beinhaltet keine Wertung – wenn Sie genau lesen, werden Sie aber merken, wen ich persönlich für den GoaT, den »Greatest of all Times« halte…

Charles Babbage (1791–1871) Charles Babbage war von klein auf an Maschinen, die menschliche Aufgaben übernehmen konnten, interessiert und studierte in Cambridge Mathematik und Chemie. Zu seinen Lebzeiten war die genaue Positionsbestimmung auf See eines der wichtigsten technischen Probleme. Dazu war man auf möglichst zuverlässige Logarithmentafeln, also Tabellenwerke, aus denen sich die Funktionswerte des natürlichen Logarithmus, des Sinus und Cosinus und anderer elementarer Funktionen ablesen ließen, angewiesen. Diese Tabellen mussten mühselig von Hand erstellt werden, und die Werte waren dementsprechend fehlerbehaftet – mit potenziell fatalen Konsequenzen für die Schifffahrt. Als sich Babbage daher 1822 mit einem Modell seiner Difference Engine, die die entsprechenden Funktionswerte automatisiert ausrechnen können sollte, an die britische Regierung wandte, war diese sehr angetan und finanzierte über zehn Jahre hinweg die weitere Entwicklung. Zwar hatte es in der Vergangenheit bereits mechanische Rechenmaschinen gegeben, die addieren und subtrahieren konnten, und G. W. Leibniz war nur knapp daran gescheitert, eine funktionierende Rechenmaschine zu bauen, die alle Grundrechenarten beherrschte, aber Babbages Entwurf ging weiter: Seine Difference Engine sollte die Funktionswerte beliebiger Polynome berechnen können, über die sich dann wiederum die Funktionswerte von Sinus, Cosinus usw. approximieren ließen. Die Grundidee bestand darin, die

Berechnung der Polynomwerte durch die sukzessive Bildung von Differenzen aufeinanderfolgender Funktionswerte auf einfache Rechenoperationen herunterzubrechen (deshalb der Name Difference Engine). Bedauerlicherweise für die britische Regierung wurde die Difference Engine nie fertiggestellt, weil sich Babbage ca. ab 1834 einem noch ehrgeizigeren Projekt zuwandte, der Analytical Engine. Die Analytical Engine sollte eine universelle Rechenmaschine sein, die nicht nur Polynome, sondern beliebige Funktionen berechnen konnte. Zu diesem Zweck musste sie programmierbar sein und die nötigen Instruktionen über Lochkarten erhalten, eine Idee, die Babbage von den damals verwendeten mechanischen Webstühlen übernommen hatte. Leider konnte Babbage für diese Maschine, die seiner Zeit ungefähr 100 Jahre voraus war, keinerlei öffentlichen Gelder mehr einwerben, und sie kam nie über das Entwurfsstadium hinaus. Im Science Museum in London kann man aber heute funktionsfähige Nachbauten der Difference und Analytical Engine bewundern.

Ada Lovelace (1815–1852) Ada Byron, später Countess Lovelace, war die Tochter des Dichters Lord Byron, wandte sich aber, auch unter dem Einfluss ihrer Mutter, schon früh der Mathematik zu, um sich bewusst von ihrem exzentrischen und übersensiblen Vater abzugrenzen. Als eine von ganz wenigen Zeitgenossen erkannte sie das wahre Potenzial von Babbages Analytical Engine und arbeitete ab ca. 1841 mit ihm zusammen. Der Höhepunkt dieser Zusammenarbeit kam im Jahr 1843, als Ada Lovelace ein Manuskript des italienischen Ingenieurs Luigi Menabrea, in dem dieser die Analytical Engine detailliert beschrieben hatte, ins Englische übersetzte. Sie beließ es aber nicht beim bloßen Übersetzen, sondern fügte eigene »Notes of the Translator« hinzu, die am Ende doppelt so lang waren wie Menabreas ursprüngliches Manuskript. Die »Notes« begründeten ihren späteren Weltruhm: Sie machte den konzeptuellen Unterschied zwischen der Differential und der Analytical Engine deutlich (das Zitat zu Beginn von Kapitel 1 stammt aus den Notes), beschrieb moderne Programmierkonzepte wie Subroutinen und rekursive Funktionsaufrufe und beschrieb schließlich detailliert die Instruktionen, die nötig waren, damit die Analytical Engine eine komplizierte Aufgabe aus der Zahlentheorie (die Berechnung so genannter Bernoulli-Zahlen) bearbeiten konnte. Diese Instruktionen werden heute als das erste Computerprogramm überhaupt angesehen, und Ada Lovelace als der Welt erste Programmiererin. Anders als Babbage sah Lovelace die Analytical Engine nicht nur als reine Rechenmaschine, sondern sie erkannte auch ihr Potenzial, beliebige Daten verarbeiten zu können, solange sich die Daten symbolisch darstellen ließen. Leider endete mit den Notes die Zusammenarbeit mit Babbage, wohl wegen der sehr unterschiedlichen Temperamente der beiden. Der Versuch einer geschäftlichen Partnerschaft scheiterte, und Ada Lovelace geriet in einen Sog aus Spiel- und Opiumsucht. Sie starb 1852 mit nur 37 Jahren.

Alonzo Church (1903–1995) Alonzo Church verbrachte fast seine gesamte akademische Laufbahn an der Princeton University, wo er studierte, promovierte und 1929 zum Assistant Professor ernannt wurde. Die 30er-Jahre des letzten Jahrhunderts waren eine extrem spannende Zeit für die mathematische Logik, und Princeton war der Platz, wo sich die besten Köpfe aus diesem Bereich trafen. Neben Church war dort z. B. auch der Österreicher Kurt Gödel vom Institute for Advanced Study tätig, der 1931 mit seinem Unvollständigkeitstheorem berühmt geworden war, das besagt, dass es mathematische Sätze gibt, die weder bewiesen noch widerlegt werden können. 1936 kam Alan Turing kam dazu, um bei Church als Doktorvater zu promovieren. Im gleichen Jahr formulierte Church die nach ihm und Alan Turing benannte These, dass die Klasse der Turing-berechenbaren Funktionen der Klasse der intuitiv berechenbaren Funktionen entspricht (vgl. Kapitel 4). Zuvor hatte er als Erster (noch vor Turing) gezeigt, dass das so genannte Entscheidungsproblem unlösbar ist, d. h., es gibt keine Möglichkeit, zu entscheiden, ob eine mathematische Aussage beweisbar ist oder nicht. Aus dem 30ern stammt auch sein so genanntes -Kalkül, eine formale Sprache zur Beschreibung von Funktionen und heute unverzichtbares Hilfsmittel für die Untersuchung von Programmiersprachen. Church blieb bis 1967 an der Universität Princeton und weiterhin bildete hervorragende Logiker aus (z. B. Michael Rabin und Dana Scott, s. unten), bevor er an die University of California nach Los Angeles wechselte und dort weitere 23 Jahre unterrichtete.

Alan Turing (1912–1954) Alan Turing wurde 1912 als Sohn eines englischen Kolonialbeamten geboren, der sich die meiste Zeit in Indien aufhielt. Seine Kindheit verbrachte er bei Pflegeeltern in England, bevor er mit 13 Jahren nach Sherborne in ein Internat wechselte. Zeit seines Lebens pflegte Turing einen Hang zur Einsamkeit, was sich unter anderem in einer Vorliebe für den Langstreckenlauf äußerte (1948 hinderte ihn nur eine Verletzung daran, in die engere Auswahl für die britische Oympia-Mannschaft zu kommen). In seinem letzten Jahr in Sherborne konnte sich Turing ein Stipendium für das King's College in Cambridge sichern, um dort Mathematik zu studieren. Ab dem Jahr 1935 etwa begann er, das Konzept einer abstrakten »Logical Computing Machine« zu entwickeln, mit der sich mathematische Operationen mechanisieren ließen. 1936 konnte er die Universalität seiner Maschine zeigen und mit ihrer Hilfe die Unlösbarkeit des Entscheidungsproblems demonstrieren, ohne von dem etwas früheren Beweis von Alonzo Church zu wissen. Turings Lehrer in Cambridge, der Logiker Max Newman, schickte ihn daraufhin nach Princeton, um mit Church zusammenzuarbeiten. Church wurde Turings Doktorvater, prägte den heute gebräuchlichen Begriff der TuringMaschine und tat auch sonst viel für die Verbreitung von Turings Ideen.

Wie viele seiner Fachkollegen, arbeitete Turing während des zweiten Weltkriegs daran, feindliche Codes zu knacken. Aufbauend auf den theoretischen Vorarbeiten polnischer Kryptologen gelang es ihm ab den 40er-Jahren zusammen mit seinem Team in Bletchley Park, mit der deutschen Verschlüsselungsmaschine Enigma verschlüsselte Funksprüche noch am selben Tag zu knacken. Wichtigstes Hilfsmittel hierbei waren die so genannten »Bomben«, elektromechanische Nachbauten der Enigma, mit deren Hilfe viele Schlüssel in kurzer Zeit ausprobiert werden konnten. Die Bomben und ihr Nachfolger Colossus waren zwar noch keine frei programmierbaren Computer, aber sie lieferten Turing wichtige Erfahrung mit dem Bau und dem Betrieb elektromechanischer und elektronischer Hardware. Diese Erfahrungen nutzte Turing, um sich nach dem Krieg der praktischen Realisierung seiner abstrakten Maschine zu widmen, zunächst am National Physical Laboratory, danach ab 1948 am Computing Laboratory der University of Manchester, wo er maßgeblich am Bau des ersten britischen Computers, dem MARK-1, beteiligt war. In dieser Zeit entstanden weitere bahnbrechende Publikationen, die für die weitere Entwicklung der Künstlichen Intelligenz richtungsweisend sein würde: 1947 ein Forschungsbericht für das NPL, in dem er neuronale Netze einführte, um seine Ansicht zu untermauern, dass auch Maschinen zu lernendem Verhalten fähig sind, und 1950 der Artikel Computing Machinery and Intelligence für die philosophische Zeitschrift Mind, in dem er die Unterschiede zwischen Maschinenintelligenz und menschlicher Intelligenz diskutierte (seiner Ansicht nach gab es keinen Grund, warum nicht auch eine Maschine »intelligent« sein sollte). Hier formulierte er auch den später nach im benannten »TuringTest«, in dem er eine Arbeitsdefinition von Intelligenz gab: Wenn ein Computer aufgrund seiner schriftlichen Antworten nicht von einem menschlichen Fragen-Beantworter unterschieden werden kann, dann muss er als »intelligent« bezeichnet werden. Turing hatte seine Homosexualität immer mehr oder weniger offen ausgelebt. Dies wurde ihm im England der 50er-Jahre, wo Homosexualität als Straftat galt, zum Verhängnis. Am 31. März 1952 kam er nach einem sexuellen Kontakt mit einem jungen Mann aus Manchester in Haft und wurde schuldig gesprochen. Anstatt für längere Zeit ins Gefängnis zu gehen, entschied er sich stattdessen für Hormon-Injektionen als Strafe. Am 8. Juni 1954 wurde er tot in seinem Bett aufgefunden, neben ihm ein halb gegessener, in Zyanid getränkter Apfel. Erst 2009 wurde Turing vom britischen Premierminister Gordon Brown mit den Worten »He truly was one of those individuals we can point to whose unique contribution helped to turn the tide of war. « rehabilitiert. Der nach ihm benannte Turing-Award gilt als der Nobelpreis für Informatiker. Er wird seit 1966 von der ACM (Association of Computing Machinery) vergeben, »to recognize contributions of lasting and major technical importance to the computing field «, und ist mit einer Million Dollar (mit finanzieller Unterstützung durch

Google) deutlich besser dotiert als der eigentliche Nobelpreis.

Claude Shannon (1916–2001) Claude Shannon wuchs im ländlichen Michigan auf, wo er als Junge die Radios seines Heimatdorfs reparierte und Modellflugzeuge baute. Nach dem Bachelor-Studium in Elektrotechnik und Mathematik an der University of Michigan in Ann Arbor wechselte er für sein Master-Studium an das renommierte MIT nach Boston. Ein Ferienjob bei den Bell Labs, der Forschungseinrichtung des Telekommunikationsriesen AT & T (damals in New York), inspirierte ihn zu seiner bahnbrechenden Master-Thesis: »A Symbolic Analysis of Relay and Switiching Circuits«, in der er als Erster zeigte, dass sich die Gesetze der booleschen Algebra aus Kapitel 12 auf elektrische Schaltkreise anwenden lassen. Das Design dieser Schaltkreise, das bislang auf Erfahrung und Trial-and-Error beruhte, war damit auf eine solide mathematische Grundlage gestellt. Auf lange Sicht vielleicht noch wichtiger war die Einsicht, dass sich mit einem Schaltkreis komplexe logische und damit letztlich mathematische Operationen durchführen lassen - eine der Grundlagen unserer Computer und nicht zuletzt des Satzes von Cook aus Kapitel 11. Shannon war sein Leben lang sehr vielseitig interessiert und ließ sich nur selten von einem einzigen Fachgebiet vereinnahmen. Seine Doktorarbeit trug den Titel »An Algebra for Theoretical Genetics«, während des Zweiten Weltkriegs befasste er sich mit Verschlüsselungstechnik (in diesem Zusammenhang traf er 1942 Alan Turing), und 1948, wieder an den Bell Labs. folgte sein Opus Magnum »A Mathematical Theory of Communication«, mit dem er die moderne Informationstheorie begründete. Ab 1957 kehrte er als Professor ans MIT zurück und hatte in der Folge wieder mehr Zeit für seine Hobbys, z. B. dem Bau von Einrädern, dem Jonglieren, und dem jonglierend auf einem Einrad fahren. Natürlich blieb es nicht bei der Praxis. So fand er z. B. das Juggling Theorem wobei die Anzahl der beteiligten Hände, die Zeit, die ein Ball in der Luft ist, die Zeit, die ein Ball in der Hand gehalten wird, die Anzahl der Bälle und die Zeit, in der eine Hand leer ist, bedeuten. Die linke Seite der Gleichung entspricht der Zeit, die aus Sicht eines jonglierten Balls verstreicht, und die rechte Seite entspricht dem gleichen Zeitraum aus Sicht des Jongleurs. 1983 baute er einen Roboter, der drei Bälle jonglieren konnte (er selbst schaffte vier).

Richard Feynman (1918–1988) Richard Feynman startete seine akademische Karriere 1935 mit einem Bachelor-Studium der Mathematik am MIT in Boston. Obwohl es ihm leichtfiel, den Vorlesungen zu folgen,

widerstrebten ihm der hohe Abstraktionsgrad und die Anwendungsferne, mit denen Mathematik damals am MIT gelehrt wurde. So wechselte er nach vier Jahren erst zur Elektrotechnik und kurze Zeit später zur Physik. Für sein PhD-Studium ging er nach Princeton und entwickelte dort mit John Archibald Wheeler einen völlig neuen Zugang zur Quantenmechanik, der auf dem aus der klassischen Mechanik bekannten »Prinzip der kleinsten Wirkung« beruhte. Während des Zweiten Weltkriegs war er als junger Physiker am Manhattan-Projekt, das die Entwicklung der ersten Atombombe zum Ziel hatte, beteiligt. 1950 wurde er als Professor ans California Institute of Technology (Caltech) berufen, wo er bis zu seinem Lebensende blieb. Hier entwickelte er die Grundlagen der Quantenelektrodynamik, also der Quantentheorie des Elektromagentismus, wofür er 1965 den Nobelpreis erhielt. Gegen Ende seines Lebens, Anfang der 80er-Jahre, fragten sich Feynman und andere Physiker, ob es möglich ist, quantenmechanische Prozesse in polynomialer Zeit durch klassische Computer zu simulieren. Feynman glaubte, dass dies nicht möglich ist, weil solch eine Simulation exponentiell viele Ressourcen auf dem klassischen Computer verbrauchen würde. Aber dann war es vielleicht möglich, ein spezielles quantenmechanisches System so zu bauen, dass es die gleichen Aufgaben wie klassische Computer durchführen kann, nur exponentiell schneller - die Idee des Quantencomputers war geboren. Für seine Zeitgenossen war Feynman ein Phänomen, »mystifyingly brilliant at calculating, strangely ignorant of the literature, passionate«. Für ihn war Mathematik ein Instrument, das er virtuos beherrschte, um Naturgesetze zu beschreiben, aber niemals Selbstzweck. Aufgrund seiner für Außenstehende manchmal schwer nachzuvollziehenden Brillianz bei der Lösung physikalischer Probleme wurde ihm augenzwinkernd auch der Feynman-Algorithmus zugeschrieben: Write down the problem. Think really hard about it. Write down the solution.

Noam Chomsky (geboren 1928) Noam Chomsky studierte Linguistik an der University of Pennsylvania. 1955 erhielt er den Doktortitel für seine Dissertation mit dem Titel »Transformational Analysis«. Hier entwickelte er seine Idee einer Transformationsgrammatik, nach der unendlich viele syntaktische Strukturen mit einem endlichen Regelsatz aus einem rudimentären Satz erzeugt werden können. Nach Chomsky gehorcht jeder verständliche Satz nicht nur den spezifischen Grammatik-Regeln der Spache, zu der er gehört, sondern auch den so genannten »Tiefenstrukturen«, einer universellen Grammatik, die allen Sprachen gemein

und im Sprachzentrum des Gehirns abgelegt ist. Mit dieser Theorie gab er nicht nur der Linguistik eine ganz neue Richtung, sondern beeinflusste, wie in Kapitel 5 gesehen, maßgeblich auch die theoretische Informatik und weitere verwandte Gebiete wie die Mathematik, die Kognitionswissenschaft und die Psychologie. Von 1955 bis 2017 lehrte er als Professor für Linguistik am MIT in Boston, bevor er als emeritierter Professor an die University of Arizona wechselte. Neben seiner wissenschaftlichen Arbeit ist Chomsky, der sich selbst als Anarchist oder libertärer Sozialist bezeichnet, einer breiteren Öffentlichkeit vor allem als streitbarer und meinungsstarker Kritiker des globalen Kapitalismus und der amerikanischen Außenpolitik bekannt. Bis heute hat er über 100 Bücher veröffentlicht, unter anderem das kontroverse Buch 9-11, in dem er die Ursachen des Anschlags auf das World Trade Center auf die Handlungen und die globale Vormachtstellung der Vereinigten Staaten zurückführt. Dieses Buch und andere Veröffentlichungen haben ihm einen Eintrag in der International Encyclopedia of Revolution and Protest eingebracht.

Michael Rabin (geboren 1931) und Dana Scott (geboren 1932) Michael Rabin wurde 1931 als Sohn eines Rabbi im damals deutschen Breslau geboren und emigrierte 1935 mit seinen Eltern nach Palästina, wo er Mathematik in Jerusalem studierte, nachdem er als 16-Jähriger in der israelischen Armee für die Unabhängigkeit des jungen Staats Israel gekämpft hatte. Rabin und der 1932 in Berkeley, Kalifornien, geborene Dana Scott waren Mitglieder der Logik-Forschungsgruppe an der Universität Princeton (beide hatten Alonzo Church als Doktorvater), als sie 1959 gemeinsam den Nichtdeterminismus in die theoretische Informatik einführten (vgl. den Satz von Rabin/Scott in Kapitel 2). Dafür wurden sie 1976 mit dem Turing-Award ausgezeichnet. Spätere Stationen führten Dana Scott nach Oxford und an die Carnegie-Mellon University, Pittsburgh. Er blieb sein Leben lang der mathematischen Logik und der Komplexitätstheorie treu, während sich Michael Rabin in späteren Jahren der Kryptografie zuwandte und auch dort wichtige Beiträge lieferte (z. B. den Miller-Rabin-Primzahltest). Seine weiteren beruflichen Stationen waren die Universität von Jerusalem und die Harvard University.

Stephen Cook (geboren 1939) Stephen Cook begann im Jahr 1957, Ingenieurwesen an der University of Michigan zu studieren, wandte sich aber schon bald der Mathematik zu und wechselte nach seinem Bachelor-Abschluss 1961 nach Harvard. 1966 erhielt er dort den PhD mit einer Dissertation über die intrinsische Komplexität der Multiplikation, ein Problem, mit dem

wir uns zumindest ansatzweise auch in Kapitel 9 beschäftigt haben. Nach einer Zwischenstation an der University of California in Berkeley ging er 1970 als Associate Professor nach Toronto. Ein Jahr später präsentierte er seine bahnbrechende Arbeit »The complexity of theorem proving procedures « beim dritten ACM Symposium on the Theory of Computing. Diese Arbeit markierte die Einführung des Begriffs der NPVollständigkeit in die theoretische Informatik, wo er seitdem eine zentrale Rolle einnimmt. 1979 erschien das Buch Computers and Intractability: A Guide to the Theory of NP-Completeness von Michael Garey und David Johnson, in denen sie über dreihundert Probleme vorstellen, die bis dahin als NP-vollständig erkannt worden waren. Bis zum heutigen Tag könnten es sogar Tausende von Problemen sein. Das Konzept der NPVollständigkeit als wichtiges Werkzeug zum Verständnis der Schwierigkeit von Problemen hat bis heute große Auswirkungen auf die gesamte Informatik. 1982 erhielt Stephen Cook den wohlverdienten Turing-Award »for his advancement of our understanding of the complexity of computation in a significant and profound way«.

Peter W. Shor (geboren 1959) Peter W. Shor zeichnete sich schon in seiner Jugend durch Medaillen bei MathematikOlympiaden aus. Er studierte Mathematik am California Institute of Technology und am MIT in Boston und ging danach zu den Bell Labs, der Forschungseinrichtung des amerikanischen Telefonkonzerns AT & T. Die Bell Labs waren damals, wie schon zu Shannons Zeiten, dafür bekannt, ihren herausragenden Mitarbeitern maximalen Freiraum zur Forschung zu gewähren, und Shor nutzte ihn, indem er 1994 den nach ihm benannten polynomialen Algorithmus zur Faktorisierung (s. Kapitel 11) mit Hilfe von Quantencomputern entwickelte. Seit 2003 ist er Professor für Angewandte Mathematik am MIT.

Kapitel 16

Die Top-Ten-Bücher zum Weiterlesen IN DIESEM KAPITEL möchte ich Ihnen eine weitere komplett subjektive Top-Ten-Liste vorstellen, nämlich die zehn aus meiner Sicht besten Bücher zum Weiterlesen oder auch anders lesen, geordnet nach den fünf Teilen dieses Buchs.

Teil I: Endliche Automaten J. E. Hopcroft und J. D. Ullman: Einführung in die Automatentheorie, Formale Sprachen und Komplexitätstheorie, Pearson Studium 2011: Ein Klassiker im englischen Sprachraum, dessen erste Auflage bereits 1979 erschienen ist. Mathematisch rigorose, trotzdem gut verständliche und umfassende Darstellung. Wie Sie dem Namen des Buchs entnehmen können auch für die Teile II und III sehr gut als zusätzliche Lektüre geeignet. D. W. Hoffmann: Theoretische Informatik, Hanser-Verlag 2018: Ausführliche Einführung in die wichtigsten Themen der theoretischen Informatik mit vielen Abbildungen und Hintergrundinformationen.

Teil II: Formale Sprachen U. Schöning: Theoretische Informatik kurzgefasst, Spektrum-Verlag 2008: Ein deutschsprachiger Klassiker. Kompakte, übersichtliche Darstellung der wichtigsten Themen auf Universitäts-Niveau. L. König, F. Pfeiffer-Bohnen und H. Schmeck: Theoretische Informatik - Ganz Praktisch, De Gruyter Studium 2016: Anschauliche und ausführliche Darstellung des klassischen Stoffs in etwas anderer Reihenfolge als hier. Enthält einen kompletten, formallogischen Beweis des Satzes von Cook.

Teil III: Harte Probleme

A. Maruoka: Concise Guide to Computation Theory, Springer-Verlag 2011: Meine Top-Empfehlung, wenn Sie kein Problem mit englischsprachigen Lehrbüchern haben. Maruoka arbeitet mit sehr vielen bildlichen Erklärungen und bemüht sich, jeden Zwischenschritt zu erklären. C. Moore und S. Mertens: The Nature of Computation, Oxford University Press 2016: Komplexitätstheorie aus der Sicht zweier Physiker: massiv, ungewöhnlich und inspirierend. Für alle, die noch mehr wissen wollen.

Teil IV: Mathematische Grundlagen Es gibt eine große Menge an Büchern mit dem Titel »Mathematik für Informatiker« auf dem Markt, die den hier behandelten Stoff und natürlich noch viel mehr abdecken. Ich habe hauptsächlich die folgenden beiden genutzt: G. Teschl und S. Teschl: Mathematik für Informatiker, Band 1: Diskrete Mathematik und Lineare Algebra, Springer-Verlag 2013: Moderne, gut verständliche Darstellung der Mathematik, die Informatiker an Universitäten und Fachhochschulen brauchen. W. J. Cook: In Pursuit of the Travelling Salesman: Mathematics at the Limits of Computation, Princeton University Press 2014: Kurzweilige, nicht-technische Einführung in das Travelling-Salesman-Problem von einem echten Experten, die sich besonders auf Algorithmen zur näherungsweisen Lösung des TSP konzentriert.

Teil V: Top-Ten-Teil Zu jeder der hier vorgestellten Persönlichkeiten gibt es neben dem obligatorischen Wikipedia-Eintrag mittlerweile hervorragende Biografien, die sich durch eine entsprechende Suchanfrage beim Online- oder auch Offline-Buchhändler Ihres Vertrauens leicht finden lassen. Zwei Bücher aus der großen Auswahl möchte ich Ihnen aber besonders ans Herz legen: A. Hodges: Alan Turing. The Enigma, Vintage Books 2012. Die beste der vielen Turing-Biografien, aktuell leider nur auf Englisch erhältlich. Einfühlsame, aber niemals in Heldenverehrung abgleitende Darstellung von Turings Leben, die auch seine wissenschaftlichen Erfolge in allgemein verständlicher Sprache gut erklärt. W. Isaacson: The Innovators, Simon & Schuster 2014. (2018 auch auf Deutsch erschienen bei Bertelsmann)

Zusammenfassende, gut lesbare Darstellung der Geschichte des Computers und des Internets, in der auch Kurzbiografien der wichtigsten Protagonisten enthalten sind, darunter Ada Lovelace, Charles Babbage, Claude Shannon und Alan Turing.

Symbolverzeichnis Symbol

Bedeutung

siehe Kapitel

Kelleralphabet

3

Menge aller Wörter, die aus gebildet werden können

3

Übergangsfunktion

1,2,4

erweiterte Übergangsfunktion

1,2

leeres Wort

1

Ausgabefunktion bei Moore- und Mealy-Automaten

1

Alphabet

1,2,4

Menge aller Wörter, die aus gebildet werden können

1,2,4

Länge des Wortes

1

Äquivalenzklasse von

13

charakteristische Funktion der Sprache

4

leere Menge

13

Größenordnung von

9

Potenzmenge

2,13

für alle

12

es existiert ein

12

kann aus

mit einer Regel der Grammatik

abgeleitet werden

5

Blank-Symbol: Leere Zelle auf dem Eingabeband einer Turing-Maschine 4 Letztes Kellerzeichen

3

Fehler- bzw. Ablehnzustand

1,4

Stichwortverzeichnis A Ableitung 127 Abschlusseigenschaften kontextfreier Sprachen 156 Abschlusseigenschaften regulärer Sprachen 67 Adjazenzmatrix 77, 177, 213, 214, 253, 259 Akkumulator 110 Akzeptanz durch Endzustände 87 Akzeptanz durch leeren Keller 86 Akzeptor 50 Alphabet 27, 125 Analytical Engine 270 Äquivalenzklassen 45, 175, 243, 252 Äquivalenzklassen-Automat 49 Äquivalenzrelation 45, 242, 252 arithmetischer Ausdruck 141 Ausgabealphabet 51 Automatentheorie 18

B Babbage, Charles 269 Backus-Naur-Form (BNF) 142 Bandalphabet 94 Baum 59, 60, 256 Beobachtungsfunktion 80 Binärbaum 34, 146, 258 binäre Kodierung 103 Blank-Symbol 94 boolesche Algebra 233

boolesche Formel 185, 188, 208, 209, 231 boolesche Funktion 185–187, 190 boolesche Variablen 185–187, 201, 231, 232 boolescher Schaltkreis 200–202, 206, 209 BQP 225–227

C Cantor, Georg 239 charakteristische Funktion 104 Chinese-Postman-Problem (CPP) 261 Chomsky, Noam 131, 274 Chomsky-Hierarchie 131, 133, 141, 181 Chomsky-Normalform 144, 147, 155, 179 Christofides-Algorithmus 262 Church, Alonzo 270 Church-Turing-These 105, 115, 223, 271 CIRCUIT-SAT-Problem 201, 207, 208 CLIQUE-Problem 221 Cook, Satz von 199 Cook, Stephen 275 CYK - Algorithmus 154, 155, 179, 188

D De Morgansche Regeln 191, 233 deterministisch kontextfreie Sprachen 153 Deterministische Kellerautomaten (DPDA) 89 deterministische Turing-Maschine (DTM) 200 Deterministischer Endlicher Automat (DFA) 24–29, 31, 38, 48, 54, 55 DFA - Übergangsdiagramm 29 DFA - Übergangsfunktion 28 DFA - akzeptierte Sprache 31

DFA - Eingabealphabet 28 DFA - Endzustände 28 DFA - Startzustand 25, 28 DFA - Zustandsübergang 28 Difference Engine 269 Diskreter-Logarithmus-Problem (DLP) 225 DPDA - Übergangsfunktion 89

E -Regel 129 -Übergang 64 entscheidbare Sprachen 98, 196 Entscheidungsproblem 177 erfüllbarkeitsäquivalent 191, 208 erweiterte Übergangsfunktion eines DFA 30 erweiterte Übergangsfunktion eines NFA 60 erweiterte Backus-Naur-Form (EBNF) 142 Euler, Leonhard 258 Euler, Satz von 259 Euler-Kreis 179, 258, 261, 265 eulerscher Graph 177, 258, 261

F Faktorisierungsproblem 184, 225, 226 Feynman, Richard 273 Flip-Flop 51 formale Sprache 27

G gerichteter Graph 249 gewichteter Graph 260

Grammatik 19, 125, 141 Graph 249 Graph-Isomorphismus-Problem 227 Graphentheorie 19, 177

H Halteproblem 116, 164 Halteproblem auf leerem Band 119, 120 Hamilton-Kreis 178, 179, 182, 220, 259, 261 Hamilton-Kreis-Problem (HC) 213, 217 Hidden Markov Model 80 Hierholzer, Carl 259

I Index einer formalen Sprache 45 indirekter Beweis 117, 236

K Kelleralphabet 84 Kellerspeicher 83 KNF-SAT-Problem 190 Komplexität 168, 169, 176 Komplexitätsklasse 177 Komplexitätstheorie 19, 120, 168 konjunktive Normalform (KNF) 186, 190, 193, 194 kontextfreie Grammatik 132, 141, 152 kontextfreie Sprache 91, 141, 178 kontextsensitive Grammatik 132, 159 kontextsensitive Sprache 159, 179 Kontraposition 36, 149, 192, 236 Kreis 252

L Laufzeit eines Algorithmus 171 LBA-Problem 113 leeres Wort 27 linear beschränkte deterministische Turing-Maschine (LBDTM) 165 linear beschränkte nichtdeterministische Turing-Maschine (LBNTM) 165 linear beschränkte Turing-Maschinen (LBTM) 112 Lovelace, Ada 23, 270

M Mächtigkeit 240, 246 Markov-Kette 78 Mealy-Automat 51 Mehrband-Turing-Maschinen 105, 107 Mengenoperationen 241 Minimalautomat 38, 41, 43, 64, 244 minimaler Spannbaum 260 Moore-Automat 51 Myhill-Nerode, Satz von 46, 55, 244

N NFA - akzeptierte Sprache 60 NFA - Übergangsdiagramm 58 NFA - Übergangsfunktion 60 Nichtdeterminismus 57, 115 nichtdeterministische Turing-Maschine (NTM) 110, 182, 200, 206 nichtdeterministischer endlicher Automat (NFA) 59, 60, 62 nichtdeterministischer Kellerautomat (NPDA) 83, 84, 100, 150 NP 182–184, 199 NP-hart 199

NP-vollständig 199, 208, 210, 221, 227 NPDA - akzeptierte Sprache 86 NPDA - Konfiguration 86 NPDA - Übergangsdiagramm 85 NPDA - Übergangsfunktion 84 NTM - Berechnungsbaum 111 NTM - Übergangsfunktion 110

O -Notation 154, 175, 176 Optimierungsproblem 177 Orakel 182 Ordnungsrelation 244

P P 181, 182 P-NP Problem 223 Palindrom 88, 99, 143 partielle Funktion 118, 245 Partition 46, 244 Phasen-Struktur-Grammatik 131 Potenzmenge 60, 240 Produktion 128, 144 Pumping Lemma 35, 47, 48 Pumping Lemma für kontextfreie Sprachen 148 Pushdown Automaton (PDA) 83

Q Quantencomputer 223, 224, 273 Qubits 224

R Rabin, Michael 274 Rabin-Scott, Satz von 62, 65, 66 Random Access Machines (RAM) 109 Reduktion 120, 188 Registermaschinen 109 reguläre Ausdrücke 70 reguläre Grammatik 132 reguläre Sprache 31, 136, 138, 141 rekursiver Algorithmus 174 Relation 242 Rice, Satz von 118, 119 RSA 184, 225

S SAT-Problem 185, 187, 188, 190, 199 Schubfachprinzip 35 Scott, Dana 274 semi-entscheidbare Sprache 97, 116, 161 sequenzieller Addierer 52 Shannon, Claude 272 Shor, Peter 226, 275 Spannbaum 257 Stack 83 Startvariable 126, 128 stochastische Automaten 75 stochastische Matrix 76 String 27 SUBSET-SUM-Problem 210 Syntaxbaum 127, 146, 147

T Terminalalphabet 128 Terminalsymbol 145, 152 3-Färbbarkeit 188 3-SAT-Problem 190, 199, 208 TLS 225 TM - Übergangsdiagramm 95 TM - Übergangsfunktion 95 TM - Ablehnzustand 95 TM - akzeptierte Sprache 97 TM - Berechnungsschritt 98 TM - Konfiguration 98 Transduktor 50 Travelling-Salesman-Problem (TSP) 200, 219, 220, 261 Turing, Alan 17, 94, 271 Turing-Award 272 Turing-Berechenbarkeit 102, 118, 245 Turing-Maschine (TM) 19, 94, 95, 100, 162, 173, 181 Türme von Hanoi 172 Typ-0-Grammatik 131, 133, 162 Typ-0-Sprache 161 Typ-1-Grammatik 132, 160, 164 Typ-1-Sprache 160, 164, 165 Typ-2-Grammatik 132, 141 Typ-2-Sprache 141, 142 Typ-3-Grammatik 132, 136, 137, 153 Typ-3-Sprache 135, 138, 142

U unäre Kodierung 103

unendlich, überabzählbar 133 unendlich, abzählbar 27, 133 unentscheidbare Sprachen 118, 196 Unentscheidbarkeit des Halteproblems 117, 118 ungerichteter Graph 249 Universelle Turing-Maschine (UTM) 113, 114

V Variable 126, 145 Venn-Diagramme 241 vollständige Induktion 142, 174, 237, 254, 256 vollständiger Graph 250

W Wort 27 Wortproblem 131, 154, 161, 177, 179, 181, 188, 200

Z Zertifikat 182, 183, 200 Zustandsmenge eines DFA 28, 240

WILEY END USER LICENSE AGREEMENT Besuchen Sie www.wiley.com/go/eula, um Wiley's E-Book-EULA einzusehen.