212 75 14MB
German Pages 351 [352] Year 2001
o
Theoretische Informatik Eine anwendungsorientierte Einführung von Prof. Dr. Norbert Blum Rheinische Friedrich-Wilhelms-Universität Bonn 2., überarbeitete Auflage
Oldenbourg Verlag München Wien
Die Deutsche Bibliothek - CIP-Einheitsaufnahme Blum, Norbert: Theoretische Informatik : eine anwendungsorientierte Einfuhrung / von Norbert Blum. - 2., überarb. Aufl.. München ; Wien : Oldenbourg 2001 ISBN 3-486-25776-5
© 2001 Oldenbourg Wissenschaftsverlag GmbH Rosenheimer Straße 145, D-81671 München Telefon: (089) 45051-0 www.oldenbourg-verlag.de Das Werk einschließlich aller Abbildungen ist urheberrechtlich geschützt. Jede Verwertung außerhalb der Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Das gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Bearbeitung in elektronischen Systemen. Lektorat: Irmela Wedler Herstellung: Rainer Hartl Umschlagkonzeption: Kraxenberger Kommunikationshaus, München Gedruckt auf säure- und chlorfreiem Papier Druck: R. Oldenbourg Graphische Betriebe Druckerei GmbH
ν
Inhaltsverzeichnis Vorwort Vorwort zur 2. Auflage I
Die Berechenbarkeit von Funktionen
IX XII 1
1 1.1 1.2 1.3 1.4 1.5 1.6
Theoretische Berechenbarkeit Der Begriff des Algorithmus Die μ-rekursiven Funktionen Turingmaschinen Entscheidbarkeit Ergänzende Übungsaufgaben Literaturhinweise
3 3 4 10 23 26 27
2 2.1 2.2 2.3 2.4 2.4.1 2.4.2 2.5 2.6
Praktische Berechenbarkeit Die Random Access Maschine Die Sprachklassen Ρ und NP NP-vollständige Probleme Kryptographie Public-Key Kryptosysteme Zero-Knowledge Beweise Ergänzende Übungsaufgaben Literaturhinweise
28 28 34 39 55 55 59 65 66
Π 3 3.1 3.1.1 3.1.2 3.2 3.2.1
Grundlegendes zum Lösen von Problemen Datenstrukturen zur Lösung von Mengenverwaltungsproblemen Einfache Datenstrukturen Keller und Schlangen Listen Bäume Beliebige Suchbäume
69 71 72 73 74 76 79
VI
INHALTSVERZEICHNIS
3.2.2 3.2.3 3.2.4 3.3 3.3.1 3.3.2 3.3.3 3.4 3.5 3.5.1 3.5.2 3.6 3.7
AVL-Bäume B-Bäume Tries Hashing Kollisionsbehandlung mittels verketteter Listen Kollisionsbehandlung mittels offener Adressierung Universelles Hashing Datenstrukturen für disjunkte Mengen Priority Queues d-Heaps Linksheaps Ergänzende Übungsaufgaben Literaturhinweise
82 87 93 95 95 100 101 104 105 106 109 110 112
4
Durchmusterung von Graphen
113
4.1 4.2 4.3 4.4
Graphentheoretische Grundlagen Graphdurchmusterungsmethoden Ergänzende Übungsaufgaben Literaturhinweise
113 116 119 120
5
Über den Entwurf von Algorithmen
121
5.1 5.2 5.3 5.4 5.5 5.6 5.6.1 5.6.2 5.7 5.8
Divide-and-conquer Dynamische Programmierung Aufzählungsmethoden Greedyalgorithmen Approximationsalgorithmen Probabilistische Algorithmen Ein Las Vegas-Algorithmus Ein Monte-Carlo-Algorithmus Ergänzende Übungsaufgaben Literaturhinweise
122 124 125 132 136 137 138 141 145 146
III
Die Lösung elementarer Probleme
147
6
Automatentheorie und Formale Sprachen
149
6.1 6.1.1 6.1.2 6.1.3 6.2 6.2.1 6.2.2
Die lexikalische Analyse Reguläre Mengen, reguläre Ausdrücke und endliche Automaten . . . . Minimierung endlicher Automaten Zur Realisierung der lexikalischen Analyse Die Syntaxanalyse Kontextfreie Grammatiken Kellerautomaten
149 150 159 167 168 169 175
INHALTSVERZEICHNIS
ΥΠ
6.2.3 6.3 6.3.1 6.3.2 6.4 6.5
Normalformen für kontextfreie Grammatiken Eigenschaften von kontextfreien Sprachen Das Pumping-Lemma Abschlußeigenschaften Ergänzende Übungsaufgaben Literaturhinweise
184 192 192 195 196 198
7 7.1 7.1.1 7.1.2 7.2 7.3 7.3.1 7.3.2 7.3.3 7.4 7.4.1 7.4.2 7.5 7.6 7.7 7.8
Algorithmen auf Graphen Bipartites Matching Der ungewichtete Fall Der gewichtete Fall Starke Zusammenhangskomponenten Kürzeste-Weg-Probleme Dijkstras Algorithmus Der Bellman-Ford Algorithmus Das alle-Paare-kürzeste-Weg-Problem Minimale überspannende Bäume Der Algorithmus von Kruskal Der Algorithmus von Prim Netzwerkflußprobleme Das Graphenisomorphieproblem Ergänzende Übungsaufgaben Literaturhinweise
200 200 201 205 212 215 220 222 224 228 230 231 232 241 248 250
8 8.1 8.2 8.3 8.4
Algorithmen auf Strings Stringmatching Approximatives Stringmatching Ergänzende Übungsaufgaben Literaturhinweise
252 252 255 261 262
9 9.1 9.2 9.3 9.4
Online-Algorithmen Das Listenverwaltungsproblem Paging Ergänzende Übungsaufgaben Literaturhinweise
263 263 269 275 275
10 10.1 10.2 10.3
Schnelle Fouriertransformationen Wahl der Stützstellen Ergänzende Übungsaufgaben Literaturhinweise
276 277 281 281
11 11.1
Lineare Programmierung Grundlagen
282 284
vra
INHALTSVERZEICHNIS
11.2 11.3 11.4 11.5
Die Simplexmethode Dualität Ganzzahlige lineare Programmierung Ergänzende Übungsaufgaben
291 302 312 320
11.6
Literaturhinweise
322
Literaturverzeichnis
325
Index
333
IX
Vorwort Was ist Theoretische Informatik? Insbesondere, was sollten die Inhalte einer Einführung in die Theoretische Informatik sein? Diese Fragen stellten sich mir im Sommer 1995, als ich die Vorlesungen Informatik ΠΙ und Informatik IV im Grundstudium des Diplomstudienganges Informatik an der Universität Bonn, die ich im WS 1995/96 bzw. im SS 1996 gehalten habe, konzipierte. Die Antwort, die sich ergab, war zunächst von methodischer Natur. Im theoretischen Teil des Grundstudiums sollten die Studierenden lernen, Probleme fundiert und präzise zu bearbeiten. Wenn dies anhand von Inhalten geschieht, die Relevanz für die Anwendungen haben, um so besser. Üblicherweise werden in der einführenden Theorieveranstaltung die Gebiete Automatentheorie und Formale Sprachen sowie Berechenbarkeits- und Komplexitätstheorie gelesen. Dies ist dann Inhalt von einer der oben bezeichneten Vorlesungen. Inhalt der anderen Vorlesung ist meistens eine Einführung in die Algorithmik. Ich habe mich aus didaktischen Gründen dafür entschieden, diese übliche strikte Trennung der Inhalte aufzuheben und beide Bereiche zusammen zweisemestrig zu konzipieren. Dies wurde dadurch bestärkt, daß das Gebiet Algorithmik als Teilgebiet der Theoretischen Informatik angesehen wird. Die konkrete Stoffauswahl wurde von der Idee beeinflußt, daß die gewählten Inhalte möglichst auch für die Praxis von Relevanz sein sollten. So sind z.B. schnelle Fouriertransformationen für die Praxis viel wichtiger als das Postsche Korrespondenzproblem. Teil I des Buches behandelt zunächst die Berechenbarkeit von Funktionen. Dabei wird zwischen theoretischer und praktischer Berechenbarkeit unterschieden. Theoretisch berechenbar ist eine Funktion / , wenn es ein effektives Rechenverfahren gibt, das für eine beliebige Eingabe χ aus dem Definitionsbereich den Funktionswert f(x) berechnet. In Kapitel 1 wird dieser intuitive Berechenbarkeitsbegriff formalisiert. Dies führt zur Einführung der μ-rekursiven Funktionen, der turingberechenbaren Funktionen und dem Beweis der Äquivalenz dieser beiden Formalisierungen. Beim Beweis der Äquivalenz kommt die grundlegende Beweistechnik der Simulation zur Anwendung. Mittels Diagonalisierung, einer weiteren grundlegenden Beweistechnik, wird gezeigt, daß es nichtberechenbare Funktionen gibt. Kapitel 1 ist das einzige Kapitel, das keinen unmittelbaren Anwendungsbezug hat. Dennoch meine ich, daß ein Informatiker sich einmal mit der Frage, was im Prinzip berechenbar ist, auseinandergesetzt haben sollte, und habe dies auch bewußt an den Anfang des Buches gestellt. Eine Funktion ist auch dann theoretisch berechenbar, wenn jedes effektive Rechen-
χ
Vorwort
verfahren mindestens eintausend Jahre benötigt, um den Funktionswert f(x) zu berechnen. Eine derartige Funktion ist ganz gewiß nicht praktisch berechenbar. Diese Beobachtung führt zum Begriff der praktischen Berechenbarkeit, die in Kapitel 2 des Buches behandelt wird. Als praktisch berechenbar wird eine Funktion / angesehen, wenn es ein Computerprogramm gibt, das für ein beliebiges χ aus dem Definitionsbereich den Funktionswert f(x) auf einem Rechner in Polynomzeit berechnet. Für viele Funktionen, die in der Praxis auftreten, kennt man zwar kein derartiges Computerprogramm, jedoch kann man bei gegebenem χ und gegebener Herleitung für f(x) in polynomieller Zeit überprüfen, ob die Herleitung korrekt ist. Dies führt zur Begriffsbildung der NP-vollständigen Probleme, die in gewissem Sinn „schwierigste" derartige Probleme sind. In der Tat sind auch viele Funktionen der Praxis NP-vollständig und verlangen eine andere Behandlung als Probleme, für die bekannt ist, daß sie praktisch berechenbar sind. In Teil II des Buches werden grundlegende Werkzeuge, die häufig bei der Entwicklung von Algorithmen benötigt werden, vorgestellt. Immer müssen Algorithmen auch Mengenverwaltungsprobleme lösen. Darum ist Kapitel 3 der Entwicklung von Datenstrukturen zur Lösung von Mengenverwaltungsproblemen gewidmet. Neben einfachen Datenstrukturen - wie Feldern und Listen - werden Bäume, insbesondere balancierte Bäume, Hashing, Priority Queues und Datenstrukturen zur Organisation von disjunkten Mengen behandelt. Viele Probleme lassen sich als ein Problem auf Graphen formalisieren, zu deren Lösung dann ein geordnetes Betrachten des Graphen notwendig ist. Daher beschäftigt sich Kapitel 4 mit Durchmusterungsmethoden für Graphen. In der Praxis erhält ein Informatiker häufig in der Sprache des Anwendungsbereiches eine Problemstellung mit der Aufgabe, ein Computerprogramm zu entwickeln, welches das Problem löst. Üblicherweise wird zunächst mittels Abstraktion aus dem Anwendungsproblem eine mathematische Formulierung erstellt. Zur Lösung des formalen Problems entwickelt man einen Algorithmus, der dann in einer geeigneten Programmiersprache auf dem Rechner implementiert wird. Für die Entwicklung von Algorithmen gibt es allgemeine algorithmische Paradigmen, deren Anwendbarkeit jeweils von gewissen Eigenschaften abhängt. Kapitel 5 ist derartigen Paradigmen gewidmet. Diese umfassen Divide-and-conquer, dynamische Programmierung, Backtracking, Branch-and-bound, Greedyalgorithmen und Approximationsalgorithmen. In Teil ΠΙ des Buches werden Lösungen für elementare Probleme entwickelt, die häufig selbst als Teilprobleme bei der Lösung von Problemen auftreten. Dabei kommen die in Teil II des Buches vorgestellten Werkzeuge zum Tragen. Einer der wichtigsten Anwendungsbereiche von Automatentheorie und formalen Sprachen ist der Übersetzerbau. Daher werden im Kapitel 6 die Automatentheorie und formalen Sprachen mit diesem konkreten Anwendungsbereich im Hintergrund behandelt. Dies führt dazu, daß sich die Inhalte aus der lexikalischen Analyse und der Syntaxanalyse eines Compilers motivieren. Bei der Entwicklung von Algorithmen, die für die Scanner- und die Parsergenerierung benötigt werden, wird großer Wert auf deren Effizienz bzw. auf die der
Vorwort
XI
generierten Werkzeuge gelegt. Dies schlägt sich z.B. bei der Minimierung von endlichen Automaten oder bei der Konstruktion von ¿¿(λ)-Parsern nieder. Algorithmen für grundlegende Probleme auf Graphen, wie z.B. Wege- oder auch Netzwerkflußprobleme, und für Probleme auf Strings, wie z.B. Stringmatching, werden in den Kapiteln 7 und 8 behandelt. In Kapitel 10 werden der Nutzen von Fouriertransformationen anhand der Polynommultiplikation aufgezeigt und dann Algorithmen für schnelle Fouriertransformationen entwickelt. Viele in der Praxis auftretende Probleme lassen sich als lineares bzw. als ganzzahliges lineares Programm formulieren. Kapitel 10 bietet daher eine Einführung in die lineare und ganzzahlige lineare Programmierung. Das Buch ist an Personen gerichtet, die über grundlegende Kenntnisse der Analysis und der linearen Algebra, wie sie im 1. Semester in den Vorlesungen Analysis I bzw. Lineare Algebra I vermittelt werden, verfügen. Insofern wurde auf einen Anhang „Mathematische Grundlagen" verzichtet. Die im Buch benötigten graphentheoretischen Grundlagen stehen zu Beginn des 4. Kapitels. Beweise werden, mit Ausnahme der Beweise von Behauptungen und Lemmata, die selbst Teil eines Beweises sind, mit • abgeschlossen. Deren Ende wird mit • angezeigt. Beispiele, die noch fortgeführt werden, sind mit 0 abgeschlossen. Ansonsten ist das Ende eines Beispiels mit • markiert. Das Buch enthält Übungsaufgaben, die zum Teil dort im Text stehen, wo sie bearbeitet werden sollen. Weitere Übungsaufgaben stehen jeweils am Kapitelende. Schwere Übungsaufgabe sind mit * und sehr schwere Übungsaufgaben mit ** markiert. Um die Vertiefung in den bearbeiteten Teilbereichen zu vereinfachen, werden ausführliche Literaturhinweise gegeben. Bei der Vielzahl von ausgezeichneter Literatur habe ich sicherlich das eine oder andere gute Buch übersehen. Dies bitte ich zu entschuldigen. Der Inhalt des Buches ist zu umfangreich, um in den oben genannten zwei Vorlesungen behandelt zu werden. Meine Empfehlung ist Teil I, Teil II und aus Teil III die Kapitel 6.1 - 6.3, 7, 8 und 9 zu behandeln. Gegebenenfalls würde ich die Kapitel 7 und 8 kürzen. Meine Absicht ist, das Buch sukzessive zu verbessern. Daher bin ich für Anregungen und Hinweise jeglicher Art dankbar und habe hierfür die Email-Adresse „[email protected]" einrichten lassen. Mein Dank gilt den Kollegen Herrn Michael Clausen und Herrn Martin Dietzfelbinger, die Teile des Buches gelesen haben, sowie meinen Mitarbeitern Frau Maria Nikolaidou und Herrn Claus Rick, die das Buch insgesamt gelesen haben. Deren wertvolle Hinweise haben zur Verbesserung des Buches in vielerlei Hinsicht beigetragen. Desweiteren danke ich Herrn Harald Schwarz für die Erstellung der Druckvorlage. Dem Oldenbourg Verlag und insbesondere der Lektorin, Frau Margarete Metzger gilt mein Dank für die gute Zusammenarbeit. Norbert Blum
χπ
Vorwort zur zweiten Auflage Nach dem Erscheinen des Buches habe ich im WS 1998/99 bzw. im SS 1999 wieder die Vorlesungen Informatik ΠΙ und Informatik IV gehalten und dabei das Buch gründlich überarbeitet. So konnte die zweite Auflage in mehrerer Hinsicht verbessert werden. Neben der üblichen Beseitigung von Druckfehlern und kleineren Modifikationen wurden im wesentlichen folgende Änderungen vorgenommen: Die Kapitel 6.4.1 und 6.4.2 sind aus dem Buch herausgenommen worden. Diese behandeln die LL- und die Li?-Analyse und sind eher für Spezialvorlesungen, wie etwa „Übersetzerbau" oder auch „Formale Sprachen" geeignet. Über meine Homepage (http://theory.cs.uni-bonn.de/blum) stehen diese Kapitel nach wie vor zur Verfügung. Hinzu sind stattdessen jeweils ein Kapitel über das RSA-Kryptosystem und Zero-Knowledge Beweissysteme, über probabilistische Algorithmen, über das Graphenisomorphieproblem und über Online-Algorithmen gekommen. Möglicherweise wird ein Kapitel über Sortierverfahren vermißt. Ich habe mich stattdessen dafür entschieden, Sortierverfahren als Anwendungsbeispiele für allgemeine Programmierparadigmen oder Datenstrukturen zu verwenden. So wird „divide-and-conquer" anhand von Mergesort eingeführt, Las Vegas-Algorithmen werden am Beispiel von randomisiertem Quicksort erläutert und nach Einführung der Datenstruktur Heap für Priority Queues ist die Entwicklung von Heapsort eine Übungsaufgabe. Das Buch enthält mehr Stoff, als in zwei vierstündigen Vorlesungen präsentiert werden kann. Zwar habe ich mich aus didaktischen Gründen dafür entschieden, die übliche strikte Trennung der Vorlesungsinhalte „Datenstrukturen und effiziente Algorithmen" und „Komplexitäts-, Automatentheorie und formale Sprachen" aufzuheben und beide Bereiche zweisemestrig zu konzipieren, dennoch ist es sehr gut möglich, das Buch bei Beibehaltung der Trennung der Lehrinhalte zu verwenden. So könnte in einer Vorlesung,.Datenstrukturen und effiziente Algorithmen" Teil II und eine Auswahl aus den Kapiteln 7 bis 11 behandelt werden. Gegenstand einer Vorlesung „Komplexitäts-, Automatentheorie und formale Sprachen" könnten dann Teil I und das Kapitel 6 des Buches sein. Ich danke den Studierenden der Vorlesungen Informatik ΠΙ und IV im WS 98/99 bzw. SS 99, die mich auf Fehler im Buch hingewiesen haben, sowie meinem Mitarbeiter Herrn Martin Löhnertz, der die neuen Kapitel des Buches gelesen hat. Norbert Blum
TEIL I DIE BERECHENBARKEIT VON FUNKTIONEN
3
1 1.1
Theoretische Berechenbarkeit Der Begriff des Algorithmus
Stellt uns jemand die Frage, ob die Funktion / : N3 —>· Ν mit / ( x , y,z) = (x + y) • ζ berechenbar ist, dann würden wir diese Frage ohne zu zögern mit ,ja" beantworten. Wir haben bereits in der Schule gelernt, wie wir den Wert f(x,y, z) berechnen können. Auch bei vielen komplizierten Funktionen würden wir ohne zu zögern mit ,ja" antworten. Im Grunde genommen haben wir eine Intuition, was wir berechnen können. Intuitiv berechenbar ist eine Funktion / , falls es einen Algorithmus gibt, der für ein beliebiges χ aus dem Definitionsbereich von / , der Eingabe des Algorithmus, den Funktionswert f(x) berechnet. Unter einem Algorithmus verstehen wir ein Rechenverfahren, das folgende Eigenschaften hat: 1. Die Rechenvorschrift besteht aus einem endlichen Text. 2. Der Ablauf einer Berechnung geschieht schrittweise als Folge von elementaren Rechenschritten. 3. In jedem Stadium einer Rechnung ist eindeutig bestimmt, welcher Rechenschritt als nächster durchgeführt wird. 4. Der nächste Rechenschritt hängt nur von der Eingabe und den bisher berechneten Zwischenergebnissen ab. Als erstes drängt sich die Frage nach der Existenz von nichtberechenbaren Funktionen auf. Die Antwort hierauf gibt nachfolgender Satz: Satz 1.1 Es existiert eine nichtberechenbare Funktion / : Ν —>• {0,1}. Beweis: Sei Σ ein endlicher Zeichenvorrat, so daß jeder Algorithmus durch eine endliche Zeichenkette über Σ beschrieben werden kann. Da somit jeder Algorithmus als String aus Σ* darstellbar ist, gibt es höchstens abzählbar viele berechenbare Funktionen. Also existiert eine suqektive Abbildung s : Ν — { / | / : Ν —> {0,1} ist berechenbar }. Bezeichne /, die i-te berechenbare Funktion, d.h., /¿ = s(i). Ziel ist nun die Konstruktion einer Funktion g : Ν —> {0,1}, die zu allen Funktionen
4
1 Theoretische Berechenbarkeit
fi, i G Ν verschieden ist. Sei g wie folgt definiert: m
Í1 \θ
falls fi (î) = 0 falls fi(i) = 1.
Dann hat g die gewünschte Eigenschaft. Wäre nämlich g = f j für ein j € Ν, dann wäre g(j) = f j ( j ) . Nach Definition ist aber g(j) φ f j ( j ) . Also ist g nicht berechenbar.
•
Die zur Konstraktion von g angewandte Methode heißt Diagonalverfahren oder Diagonalisierung. Sie ist eine grandlegende Methode der Theoretischen Informatik und wird uns noch des öfteren begegnen. Obige Charakterisierung eines Algorithmus ist informell und läßt daher auch viele denkbare Formalisierungen zu. Als nächstes werden wir uns mit der Frage nach einer einfachen Formalisierang, die eine exakte Charakterisierung der Klasse der im intuitiven Sinn berechenbaren Funktionen zuläßt, beschäftigen. Einer der ersten Ansätze führte zur Definition der //-rekursiven Funktionen. Übung 1.1: a) Zeigen Sie, daß jedes Alphabet Σ mit |Σ| > 2 die Eigenschañ hat, daß jeder Algorithmus als eine endliche Zeichenkette über Σ dargestellt werden kann. Gilt dies auch, falls |Σ| = 1 ? b) Geben Sie eine Abzählung von Σ* an.
1.2
Die /i-rekursiven Funktionen
Folgende Idee führte zur Definition der sogenannten primitiv rekursiven Funktionen: 1. Definiere einige einfache Grundfunktionen, die im intuitiven Sinn berechenbar sind. 2. Definiere einfache Rechenregeln, mittels denen man aus berechenbaren Funktionen neue gewinnt. Die in diesem Sinn berechenbaren Funktionen sind dann diejenigen, die man durch endlich viele Anwendungen der Rechenregeln aus den Grundfunktionen gewinnen kann. Die Klasse der primitiv rekursiven Funktionen ist die kleinste Klasse Ρ von Funktionen, die 1. V r, s e No die konstante Funktion crs : 1% —N 0 mit crs(x) = s, 2. die Nachfolgerfunktion Ν : N0 ->· N0 mit N(x) = χ + 1 und
1.2 Die μ-rekursiven Funktionen 3. V r € Ν,
V1 < i < r die Projektion p¡ : NQ -)· N0 mit p¡{xi,...,
5 aP) =
enthält und unter den nachfolgend definierten Operationen Substitution und primitive Rekursion abgeschlossen ist. Eine Funktion h : Ν™ —>· No entsteht durch Substitution der Funktionen NO entsteht durch primitive Rekursion aus g : NQ —¥ NO und / : N Q + 2 N 0 falls Va; e NQ, η G N 0 Λ(0, χ) = g(x) und h(n + 1, ar) = / ( n , h(n, a;), x). Falls h(n + 1, x) nicht von allen drei Komponenten n, h(n, x) und χ abhängt, dann läßt man bei der Definition der Funktion häufig diejenigen Komponenten weg, von denen die Funktion nicht abhängt. Übung 1.2: a) Zeigen Sie, daß die Tatsache, daß h aus g und f durch primitive Rekursion entsteht, h eindeutig festlegt. b) Zeigen Sie, daß jede im intuitiven Sinn berechenbare Funktion f als eine Funktion F : NQ NQ, Γ, S E Ν interpretiert werden kann. Ist dies auch für r = s = 1 möglich? Aus obiger Definition folgt direkt folgendes Lemma: Lemma 1.1 Eine Funktion f ist genau dann primitiv rekursiv, wenn es eine endliche Folge Λ,Λ,...,/, von Funktionen gibt, für die gilt: 1 .
f
=
U
2. Für alle i < s gilt: (a) fi ist eine der oben definierten Grundfunktionen oder (b) fi entsteht direkt aus einigen f j , j < i durch Substitution oder durch primitive Rekursion. hi hi · · -ι fs heißt Ableitung von / . Beispiel 1.1 Die Funktion / : NQ No, mit f(x,y) = χ + y ist primitiv rekursiv, da / i , / 2 , / 3 mit /i(x) = f2(x) = N(x) und / 3 (0,y) = /i(y), f3(x + 1, y) = f2{fz{x, y)) eine Ableitung von / ist. Also kann die Addition mittels primitiver Rekursion aus der Projektion und der Nachfolgerfunktion gebildet werden.
6
1 Theoretische
Die Vorgängerfunktion V : N0 „ . fo Vix) - < Iχ - 1 T
Berechenbarkeit
N0 mit
falls ζ = 0 sonst
ist primitiv rekursiv, da sie mittels primitiver Rekursion aus der konstanten Nullfunktion und der Projektion gebildet werden kann. Es gilt nämlich F ( 0 ) = 0 = c¿(0) und V(x + l ) = p i ( ® ) . Die modifizierte Differenz x-y, wobei
(
χ—y
falls χ — y > 0
0
sonst
ist primitiv rekursiv, da a:-0 = p}(a;) u n d a : - ( y + 1) =
V(x-y).
Übung 1.3: Zeigen Sie, daß folgende Funktionen primitiv rekursiv sind: a) x-y, xy. ,. , , Í1 b) sg(x) = \ I0 c) χ div y,
failsx>0 sonst.
χ mod y.
d) s(x) = max{i | i < χ, 1/2i(i + 1) < a;}. Eine einfache Methode zur Beschreibung von Eigenschaften ist die Verwendung von Prädikaten. Ein r-stelliges Prädikat Ρ über No ist eine Teilmenge von NQ. Üblicherweise schreibt man P(xι, X2, • • - , xr) anstatt (zi, x2,..., xr) G P. Die charakteristische Funktion eines r-stelligen Prädikates Ρ ist die Funktion cp : NQ
N0 , wobei
jl cp(x i,®2,--.,®r) = S 10
falls P(xu
x2i ··
.,sr)
sonst.
Ein Prädikat heißt primitiv rekursiv, falls seine charakteristische Funktion primitiv rekursiv ist. Seien Ρ und Q r-stellige Prädikate. Dann bezeichne Ρ Λ Q die Menge Ρ Π Q, Ρ V Q die Menge Ρ U Q und ->P die Menge N£ \ P. Lemma 1.2 Seien Ρ und Q primitiv rekursive r-stellige Prädikate. Dann sind auch die Prädikate Ρ AQ , Ρ V Q und ->P primitiv rekursiv.
1.2 Die μ-rekursiven Funktionen
7
Beweis: Es gilt cpAQ(xi,---,xr) CPVQ{X
C-,p(x
= cp(x i,...,av)
· cq(xi,
..
1 , . . . , XR)
=
sg(cp(®i,...,
xr)
+ CQ(XI,
U...,XR)
=
1 - Sg(cp(x1,
..
.,xr)).
.,xr), ...,
®r)) und
Da die jeweils verwendeten Funktionen primitiv rekursiv sind, sind auch cpAQ, cpVQ und c-,ρ primitiv rekursiv.
Übung 1.4: Zeigen Sie, daß die zweistelligen Prädikate =, < und < prímitiv rekursiv sind. Prädikate kann man zur Definition von Funktionen mittels Fallunterscheidung verwenden. Der nächste Satz zeigt, daß bei der Verwendung von primitiv rekursiven Prädikaten und primitiv rekursiven Funktionen die neu definierte Funktion auch primitiv rekursiv ist. Satz 1.2 Seien P\,..., Pjt paarweise disjunkte r-stellige primitiv rekursive Prädikate und seien /i,..., Λ : Nq —> No primitiv rekursive Funktionen. Dann ist die Funktion g: ->• N0 mit 'fi(xi,..., f2(x g(x χ, ...,xr)
xr) falls Fi(xi,..., xr) xr) falls P2{x i , . . . , a v )
= fk(x i,...,£r) 0
falls Pk(x sonst
i,...,xr)
primitiv rekursiv. Beweis: Es gilt k
g(xi,...,xr)
= ^^cp^xi,.. ¿=1
.,xr) ·/¿(xi,..
.,xr).
Da Summation und Produktbildung primitiv rekursive Funktionen sind, ist auch g primitiv rekursiv.
8
1 Theoretische Berechenbarkeit
Abbildungen, die Funktionen in Funktionen abbilden, heißen Operatoren. Für eine Funktion / : NQ + 1 —>• N 0 sei die Abbildung ßbf : NQ + 1 —>• No definiert durch ßbf{n,xi,..
.,xr)
=
min{m | m < τι Λ f(m, xi,...,xr) < 0
= 0}
falls solches m 6 No existiert sonst.
μι, heißt beschränkter μ-Operator. Satz 1.3 Sei f : NQ + 1 —> No primitiv rekursiv. Dann ist auch /¿¡,/ : NQ + 1 —¥ No primitiv rekursiv. Beweis: Es gilt μ6/(0,ι) = 0
μ6/(η + l,x) =
Va; G NQ und
Pbf{n, x) η+ 1 0
falls falls
f(n, χ) φ 0 χ) = 0 Λ /(Ο, χ) φ 0 Λ / ( η + 1,ζ) = 0 sonst.
Da die Nachfolgerfunktion primitiv rekursiv und die Klasse der primitiv rekursiven Funktionen unter primitiver Rekursion abgeschlossen sind, folgt die Behauptung unmittelbar aus Satz 1.2. Als nächstes zeigen wir, daß es intuitiv berechenbare Funktionen gibt, die nicht primitiv rekursiv sind. Dies bedeutet insbesondere, daß die Klasse der primitiv rekursiven Funktionen nicht zur Formalisierung der Klasse der im intuitiven Sinn berechenbaren Funktionen ausreicht. Satz 1.4 Es gibt eine intuitiv berechenbare Funktion, die nicht primitiv rekursiv ist. Beweis: Wir beweisen den Satz mittels Diagonalisierung. D.h., wir werden eine intuitiv berechenbare Funktion h : No —>· No mittels Diagonalisierung über die primitiv rekursiven Funktionen definieren. Zunächst überlegen wir uns, daß jede Ableitung einer primitiv rekursiven Funktion als String über einem festen Alphabet Σ dargestellt werden kann. Sei Σ das Alphabet bestehend aus •
c, ΛΓ, p, f,=,{,),+,
0,1,χ,η,
1.2 Die μ-rekursiven Funktionen • •
9
hochgestellten und tiefgestellten Ziffern 0, 1, . . . , 9 zum Indizieren von Funktionssymbolen c, p, f und Variablen x, "und
•
Zwischenraum
Es ist klar, daß jede Ableitung als String über Σ dargestellt werden kann. Darüberhinaus gilt: 1. Für ein gegebenes w € Σ + kann durch ein mechanisches Rechenverfahren entschieden werden, ob w die Ableitung einer primitiv rekursiven Funktion / : N0 N0 kodiert. 2. Man kann alle Strings in Σ + aufzählen, indem man alle Strings der Länge 1, dann alle Strings der Länge 2 usw. geordnet generiert. 3. Für gegebenes i kann die ¿-te Ableitung Gu die aufgezählt wird, durch folgendes Verfahren effektiv berechnet werden: (a) Zähle Σ+ auf und entscheide für jeden aufgezählten String w, ob dieser eine Ableitung einer primitiv rekursiven Funktion kodiert. (b) Sobald die i-te Ableitung gefunden ist, halte mit dieser an. Bezeichne No definiert durch h(i) = gi(i) + 1. Die Funktion h hat folgende Eigenschaften: 1. h ist im intuitiven Sinn berechenbar. (Berechne G¿, gi(i) und addiere 1.) 2. h ist nicht primitiv rekursiv. ( Wäre h primitiv rekursiv, dann würde eine Ableitung H von h existieren und ein j £ Ν mit Η = Gj. Dann wäre g3(j) = h(j) = s¿0') + i · )
Übung 1.5: Entwickeln Sie einen Algorithmus, der für ein gegebenes w e Σ* entscheidet, ob w die Ableitung einer prímitiv rekursiven Funktion f : No —> No kodiert. Da über alle primitiv rekursiven Funktionen diagonalisiert wurde, ist obige Beweisführung nicht konstruktiv. ACKERMANN [Ack28] hat explizit eine intuitiv berechenbare Funktion konstruiert, die nicht primitiv rekursiv ist (siehe [Her78]). Beim Beweis des obigen Satzes haben wir lediglich zwei Eigenschaften der primitiv rekursiven Funktionen verwendet:
10
1 Theoretische Berechenbarkeit
1. Alle „Programme" (Ableitungen) primitiv rekursiver Funktionen können effektiv generiert und auf einheitliche Art und Weise ausgewertet werden. 2. Da alle primitiv rekursiven Funktionen total sind, konnte die Diagonalisierung durchgeführt werden. Also kann die Klasse aller totalen berechenbaren Funktionen nicht konstruktiv charakterisiert werden. D.h., man kann die Programme aller totalen berechenbaren Funktionen nicht effektiv aufzählen und auf einheitliche Art und Weise auswerten. Wir werden sehen, daß die Klasse aller berechenbaren Funktionen (d.h. inklusive der berechenbaren partiellen Funktionen) konstruktiv charakterisierbar ist. Hierzu werden wir zunächst eine Operation, die auch partielle Funktionen erzeugt, definieren. Sei / : NQ+1 ->• N 0 eine Funktion. Dann ist die Funktion μ / : NQ —NO definiert durch falls solches η e No existiert sonst. μ heißt μ-Operator. Die Klasse der μ-rekursiven Funktionen ist die kleinste Klasse R von Funktionen, für die gilt: 1. Alle konstanten Funktionen, die Nachfolgerfunktion sowie alle Projektionen sind in R. 2. R ist abgeschlossen unter Substitution, primitiver Rekursion und der Anwendung des μ-Operators. Wir werden sehen, daß die Klasse der μ-rekursiven Funktionen eine Charakterisierung der im intuitiven Sinn berechenbaren Funktionen darstellt. Zunächst betrachten wir eine weitere Charkterisierung der intuitiv berechenbaren Funktionen.
1.3
Turingmaschinen
Turingmaschinen stellen einen scheinbar völlig anderen Ansatz zur Charakterisierung der intuitiv berechenbaren Funktionen dar. Eine k-Band-Turìngmaschine besteht aus einer endlichen Steuereinheit, der endlichen Kontrolle und k einseitig unendlichen Bändern. Jedes Band ist in Bandquadrate, die jeweils ein Zeichen des endlichen Bandalphabets speichern können, aufgeteilt. Die Bandquadrate eines Bandes sind von links mit 0 beginnend durchnumeriert. Das Bandquadrat 0 enthält jeweils das Sonderzeichen $. Die endliche Kontrolle besitzt für jedes Band einen Lese/SchreibKopf (L/S-Kopf), mittels dessen zu einem Zeitpunkt ein Bandquadrat gelesen bzw.
11
1.3 Turingmaschinen
überschrieben werden kann. Die endliche Kontrolle befindet sich zu jedem Zeitpunkt in einem von endlich vielen möglichen Zuständen. Formal definieren wir: Eine (deterministische) k-Band Tunngmaschine (DTM) M ist ein 5-Tupel M (Q, Σ, δ, q0, F), wobei
=
1. Q eine endliche Menge von Zuständen, 2. Σ ein endliches Bandalphabet mit Q Π Σ = 0 und {0,1, #,
$} Ç Σ,
3. δ : Q χ Σ* -¥ Q χ Σ* χ { - 1 , 0 , die Übergangsfunktion ( - 1 , 1 , 0 stehen hier für die Kopfbewegungen ein Bandquadrat nach links, nach rechts, keine Bewegung), 4. q0 der Startzustand und 5. F = {qe I S(qe, α) ist für kein α € Σ* definiert} die Menge der Endzustände sind.
endliche Kontrolle 1
\ \>
k Bänder
J Abbildung 1.1: fc-Band Tunngmaschine.
ö(q, αχ, a 2 , . . . , ük) = (qc\, c 2 , . . . , Ck, tiert:
. . . , s*) wird folgendermaßen interpre-
Liest M im Zustand q für 1 < i < k auf dem i-ten Band α, 6 Σ, dann überschreibt M für jedes i auf dem ¿-ten Band das gelesene a¿ mit c¿, führt die durch s¿ spezifizierte Kopfbewegung durch und geht in den Zustand q' über. Zu jedem Zeitpunkt ist die
12
1 Theoretische Berechenbarkeit
Turingmaschine eindeutig durch •
den aktuellen Zustand der endlichen Kontrolle,
•
den Bandinhalt der Bänder und
•
die Positionen der L/S-Köpfe auf den Bändern
spezifiziert. Eine derartige Spezifikation heißt Konfiguration der Turingmaschine. Zu Beginn befindet sich die Turingmaschine M in folgender Startkonfiguration: 1. q0 ist der Zustand der endlichen Kontrolle. 2. Die Eingabe der Länge η steht auf den Bandquadraten 1,2,...,ra des ersten Bandes. 3. Alle übrigen Bandquadrate der k -Bänder, bis auf das Bandquadrat 0, das $ enthält, sind mit dem Sonderzeichen (in Worten „Blank" ) beschrieben. 4. Alle L/S-Köpfe stehen auf dem ersten Bandquadrat des zugehörigen Bandes. Ein L/S-Kopf darf sich niemals über das linke Bandende hinaus bewegen. Der Inhalt des Bandquadrates 0 darf niemals überschrieben werden. Links von einem L/S-Kopf darf n i e m a l s d i e Inschrift eines Bandquadrates sein. Γ C Σ mit der Eigenschaft, daß Γ die kleinste Teilmenge von Σ ist, so daß für alle Eingaben w von M w Ç. Γ*, heißt Eingabealphabet von M. Eine Konfiguration Κ mit der Eigenschaft, daß der aktuelle Zustand q ein Endzustand ist, heißt Endkonfiguration. Seien Κ und K' Konfigurationen der Turingmaschine M. Wir schreiben Κ I~M K', falls Κ mittels einmaliger Anwendung von δ nach K' übergeht. K' heißt dann auch Nachfolgekonfiguration von K. Y-*M bezeichnet die reflexive, transitive Hülle der Übergangsfunktion \~M- Eine endliche Folge Ko, Κι,..., Kt heißt endliche Rechnung von M auf der Eingabe w, falls 1. Ko die Startkonfiguration von M bei der Eingabe w, 2. K{ \~M Ki+i für 0 < i < t und 3. Kt eine Endkonfiguration sind. Falls es eine endliche Rechnung von M auf der Eingabe w gibt, dann sagen wir, daß M bei der Eingabe w anhält. Eine Turingmaschine heißt regulär, falls am Ende jeder endlichen Rechnung alle L/S-Köpfe auf dem Bandquadrat 1 des zugehörigen Bandes stehen. Wir werden nun die durch eine Turingmaschine M berechnete Funktion spezifizieren. Sei η £ N0. Dann bezeichnet bin (ra) die Binärdarstellung vonraohne führende Nullen.
13
1.3 Turìngmaschinen Das heißt, •
bin : No —{0,1} + ist eine injektive Funktion und
•
bin - 1 : {0,1}+ -* N0 mit bin -1 (wiw2 · · -w s ) = Σ ϊ = ι = Umkehrfunktion von bin.
ist die
Jede Turingmaschine M mit Bandalphabet Σ definiert die eventuell partielle Funktion / μ : Σ* —> Σ*, wobei ÍM{w) die Inschrift des ersten Bandes am Ende der Rechnung von M bei der Eingabe w ist. M definiert für jedes r e Ν die Funktion f ^ : Nq N0, wobei b i n - 1 (y)
falls M bei Eingabe
bin(*i)#bin(s2)#...#bin(zr) mit der Inschrift y 6 {0,1} + •/Xf (»1,32.·· •,»«·) = < auf Band 1 anhält. Undefiniert sonst. Eine Funktion / : Σ* — Σ * ( / : Nq N0) heißt turingberechenbar, falls eine Turingmaschine M mit / = /M ( / = /m) existiert. Unser Ziel ist nun, die Äquivalenz der Klasse der //-rekursiven Funktionen und der Klasse der turingberechenbaren Funktionen zu beweisen. Zunächst zeigen wir, daß jede μ-rekursive Funktion auch turingberechenbar ist. Satz 1.5 Jede μ-rekursive Funktion ist turingberechenbar. Beweis: Wir werden zunächst zeigen, daß die Grundfunktionen durch reguläre Einband-Turingmaschinen berechnet werden können und uns dann überlegen, wie wir die Operationen Substitution, primitive Rekursion und Anwendung des μ-Operators mittels regulärer Turìngmaschinen realisieren. Lemma 1.3 Die Nachfolgerfunktion, die konstanten Funktionen und die Projektionen können durch reguläre Einband-Turingmaschinen berechnet werden. Beweis: Durch explizite Angabe der Turingmaschine. Dies wird den Lesern als Übung überlassen.
• Lemma 1.4 Seien f : Nq -4· N0 und gi : N™ N0, 1 < i < r Funktionen, die durch reguläre k-Band-Turingmaschinen F, G ι, G 2 , . . . , G> berechnet werden. Sei h diejenige Funktion, die durch Substitution der gi in f entsteht. Dann gibt es eine reguläre (k + 2)-Band Turingmaschine M, die h berechnet.
14
1 Theoretische Berechenbarkeit
Beweis: Die endliche Kontrolle von H enthält die endlichen Kontrollen der Turingmaschinen F, Gi, G2, ·.., GT. Dies ist möglich, da die Anzahl dieser Turingmaschinen endlich ist. H läßt nun nacheinander Gi, 1 < i < r auf seiner Eingabe laufen und speichert die berechneten Ergebnisse. Anschließend läßt H die Turingmaschine F mit den zwischengespeicherten Ergebnissen als Eingabe laufen. Zur Durchführung dieser Idee konstruieren wir zunächst eine reguläre (k + 2)-Band Turingmaschine G[, 1 < i < r, die sich folgendermaßen verhält: (1) G\ kopiert den Inhalt von Band 1 auf Band 3. (Abgekürzt schreiben wir hierfür Band 3 := Band 1.) (2) G\ läßt die fc-Band-Turingmaschine G i auf den Bändern 3,4, . ,.,k + 2 laufen. (3) Der Inhalt von Band 2 wird wie folgt modifiziert: „ ,Λ ÍBand 3 falls i = 1 Band 2 := < [ Band 2#Band 3 falls i > 1. (4) Die Bänder 3 , 4 , . . . , / : + 2 werden gelöscht, d.h., die Inhalte der Bandquadrate > 0 werden mitüberschrieben. Η läßt nun nacheinander G[, G'2,...,
G'r laufen. Dabei gilt
i Startkonfiguration von Η Startkonfiguration ((?•) = { I Endkonfiguration von Gt_l
falls i = 1 falls i > 1.
Danach läßt Η nun F auf den Bändern 2 , 3 , . . . , k + 1 laufen, wobei die Startkonfiguration von F sich aus der Endkonfiguration von G'r ergibt. Zum Schluß löscht H Band 1, kopiert Band 2 auf Band 1 und fährt die L/S-Köpfe auf das Bandquadrat 1 der korrespondierenden Bänder. Aus der Konstruktion folgt unmittelbar, daß H bei der Eingabe b i n ( z i ) # bin(x 2 ) # .. . # bin(a: m ) die Funktion f ( g i ( x i , x m ) , . . . , g{x 1 , . . . , x m )) berechnet.
•
Übung 1.6: a) Beweisen Sie Lemma 1.3. b) Konstruieren Sie explizit reguläre Tutingmaschinen für die im Beweis von Lemma 1.4 verwandten grundlegenden Operationen • • •
kopiere den Inhalt von Band i auf Band j, lösche Band i und hänge den Inhalt von Band i an den Inhalt von Band j.
c) Führen Sie die Konstruktion im Beweis des Lemmas 1.4 unter Verwendung von b) explizit durch.
15
1.3 Turingmaschinen
Lemma 1.5 Seien g : N[¡ -> No und f : Nq+2 -» No Funktionen, die von regulären k-Band-Turingmaschinen G und F berechnet werden. Werde die Funktion h durch primitive Rekursion aus g und f definiert. Dann gibt es eine reguläre (k + A)-BandTuringmaschine H, die h berechnet. Beweis: Die endliche Kontrolle der Turingmaschine H enthält die endlichen Kontrollen der Turingmaschinen G und F. Die Bänder 1 und 4 dienen als Zähler. Band 1 enthält die Anzahl der noch durchzuführenden Berechnungen der Turingmaschine F, während Band 4 die Anzahl der bereits durchgeführten Berechnungen von F enthält. Der Inhalt von Band 2 ist immer bin(a:i)# bin(z2)# .. bin(z r ). Band 3 dient zur Speicherung der Binärdarstellung bin(/i(«, χχ, x 2 , . . . , x r )) des zuletzt berechneten Funktionswertes h(i, x\, X2, • • - ,xr)· Wird nun H mit der Eingabe b i n ( n ) # bin(xi)# . . . #bin(av) gestartet, dann steht nach dem ¿-ten Durchlauf der while-Schleife bin(n - i) auf Band 1, b i n ( x i ) # .. . # bin(a;r) auf Band 2, b i n ( / i ( i , x i , . . . , x r ) ) auf Band 3 und bin(i) auf Band 4. Η verhält sich folgendermaßen: (1) Kopiere den hinter dem ersten # stehenden Inhalt von Band 1 auf Band 2; (2) Lösche Band 1 ab dem ersten #; (3) Band 3 := Band 2; (4) Η läßt G auf den Bändern 3,4,
+ 2 laufen;
(5) Band 4 := 0; (6) Lösche Bänder 5 , 6 , . . . , k + 2; (7) while Band 1 ^ 0 do Band 5 := Band 4; Band 5 := Band 5 # Band 3; Band 5 := Band 5 # Band 2; Laß F auf den Bändern 5 , 6 , . . . , k + 4 laufen; Band 3 := Band 5; Lösche die Bänder 5 , 6 , . . . , k + 4; Band 1 :=Band 1 - 1; Band 4 := Band 4 + 1; od; (8) Band 1 := Band 3. Aus der Konstruktion folgt unmittelbar, daß H die primitive Rekursion korrekt durchführt.
• Im obigen Beweis haben wir im Grunde genommen eine for-Schleife mittels einer while-Schleife realisiert. Dies bedeuted, daß primitive Rekursion der Durchführung einer for-Schleife entspricht.
16
1 Theoretische Berechenbarkeit
Übung 1.7: a) Fähren Sie die Konstruktion im Beweis des Lemmas 1.5 explizit durch. b) Beweisen Sie formal die Korrektheit der Konstruktion. c) Wandeln Sie die while-Schleife in eine for-Schleife um. Lemma 1.6 Sei f : NQ+1 —>• No eine Funktion, die durch eine reguläre kBand-Turingmaschine F berechnet wird. Dann gibt es eine reguläre (k + 3)-BandTuringmaschine M, die μ f berechnet. Beweis: Die endliche Kontrolle von M enthält die endliche Kontrolle von F. M führt derart eine while-Schleife durch, daß folgende Invariante stets erfüllt ist: Wird M mit der Eingabe bin(a;i)# .. . # b i n ( z r ) gestartet, dann steht nach dem iten Durchlauf der while-Schleife bin(/(¿ - 1, x\, X2, · · ·, av)) auf Band 1, bin(xi) # . . . # bin (xr) auf Band 2 und bin (i) auf Band 3. M verhält sich folgendermaßen: (1) Band 2:= Band 1; (2) Band 1 := 1; (3) Band 3 := 0; (4) while Band 1 φ 0 do Band 4 := Band 3; Band 4 := Band 4 # Band 2; M läßt F auf den Bändern 4 , 5 , . . . , k + 3 laufen. Band 1 := Band 4; Lösche die Bänder 4, 5 , . . . , k + 3; Band 3 := Band 3 + 1 od; (5) Band 1 := Band 3 - 1. Aus der Konstruktion folgt unmittelbar die Korrektheit von M.
• Obiger Beweis ergibt, daß die Anwendung des μ-Operators der Durchführung einer while-Schleife entspricht. Da jede //-rekursive Funktion durch endlich viele Anwendungen von Substitution, primitiver Rekursion und des //-Operators aus endlich vielen Grundfunktionen berechenbar ist, kann jede /¿-rekursive Funktion mittels der Hintereinanderausführung von endlich vielen Turingprogrammen vom obigen Typ berechnet werden. Also folgt unmittelbar aus den Lemmata 1.3 - 1.6 die Behauptung des Satzes 1.5.
17
1.3 Turìngmaschinen Als nächstes werden wir beweisen, daß jede turingberechenbare Funktion / : Νζ No auch μ-rekursiv ist. Das folgende Lemma vereinfacht uns die Arbeit:
Lemma 1.7 Jede turingberechenbare Funktion kann von einer regulären EinbandTuringmaschine berechnet werden. Beweis: Gegeben eine beliebige fc-Band-Turingmaschine M, konstruieren wir eine reguläre Einband-Turingmaschine M', die M simuliert. Das Band von M ' enthält 2k Spuren, von denen zwei jeweils ein Band der Turingmaschine M simulieren. Eine dieser Spuren enthält den Bandinhalt, die andere die Position des L/S-Kopfes. Abbildung 1.2 beschreibt die Struktur des Bandes der Turingmaschine M'. Um Kopf 1 Band 1 Kopf 2 Band 2
$ $
a 4 b
a
b
1 c
b
a
c
1. Spur 2. Spur 3. Spur 4. Spur
b
; Kopf k Band k
$ c
a
b
b
4 a
2k. Spur
Abbildung 1.2: Band von M ' .
einen Rechenschritt von M zu simulieren, besucht M' alle Bandquadrate, in denen eine L/S-Kopfmarkierung steht und speichert das zugehörige Bandsymbol in der endlichen Kontrolle. Nachdem M ' alle notwendigen Informationen gesammelt hat, wird der nächste Rechenschritt entschieden und durchgeführt. D.h., M ' besucht alle markierten Zellen und ändert deren Inhalte gemäß des durchgeführten Rechenschrittes ab. Ebenso werden gemäß des Rechenschrittes die L/S-Kopfmarkierungen modifiziert. Nach Beendigung der Simulation ersetzt M ' für jedes Bandquadrat seinen Inhalt durch den Inhalt seiner zweiten Spur (siehe Abbildung 1.3).
c —
c a c Abbildung 1 3 : Konstruktion des Funktionswertes.
18
1 Theoretische Berechenbarkeit
Nach Beendigung der Berechnung enthält das Band von M ' somit den korrekten Funktionswert. Zum Schluß fährt M ' seinen L/S-Kopf auf das Bandquadrat 1.
• Die Konfiguration Κ einer Einband-Turingmaschine kann eindeutig dargestellt werden, indem der Bandinhalt als String geschrieben und der Zustand im String direkt vor dem Inhalt desjenigen Bandquadrates, auf dem der L/S-Kopf steht, piaziert wird. D.h., wir schreiben Κ — $αχα2 ... a^-iqak ... at, wobei •
$αια 2 . . . at der aktuelle Bandinhalt,
•
q der aktuelle Zustand und
•
das k-te Bandquadrat die Position des L/S-Kopfes
sind. Satz 1.6 Sei f : NQ —» No turingberechenbar. Dann ist f auch μ-rekursiv. Beweis: Da / turingberechenbar ist, existiert eine reguläre Einband-Turingmaschine M = (Q, Σ , δ, qo, F), die / berechnet. Wir werden μ-rekursive Funktionen definieren, die die Arbeitsweise von M simulieren. Folgende Schwierigkeit tritt dabei auf: Turingmaschinen operieren auf Zeichenreihen, während μ-rekursive Funktionen auf Zahlen operieren. Das bedeutet, daß es sinnvoll ist, zunächst Zeichenreihen durch Zahlen zu kodieren. D.h., wir definieren eine injektive Abbildung φ : (Q U Σ)* ->· N 0 . Die Kodierung wird dergestalt sein, daß einfache Operationen auf Zeichenreihen (andere benötigen wir nicht) durch einfache primitiv rekursive Funktionen simuliert werden können. Bezeichne Κ eine Konfiguration von M. D.h., wir schreiben Κ = uqv, für u, ν G Σ*, q £ Q. Bezeichne Δ (Κ) die eindeutige Nachfolgerkonfiguration von Κ. Zentral für den Beweis des Satzes ist die Konstruktion einer primitiv rekursiven Funktion, die, angewandt auf die Kodierung einer beliebigen Konfiguration, die Kodierung der eindeutig bestimmten Nachfolgerkonfiguration konstruiert. Des weiteren benötigen wir eine primitiv rekursive Funktion, die für eine beliebige gegebene natürliche Zahl feststellt, ob sie die Kodierung einer Endkonfiguration ist. Beides liefert das folgende Lemma: Lemma 1.8 Es gibt primitiv rekursive Funktionen Δ : No No, so daß für alle Konfigurationen Κ von M α) Α(ψ(Κ))
= φ(Α(Κ))
b) E N D ( φ ( Κ ) ) =
und Endkonfiguration
No und END : No —>
1.3 Turìngmaschiaen
19
Bevor wir φ genauer spezifizieren und Lemma 1.8 beweisen, skizzieren wir den Beweis des Satzes zu Ende. Ausgehend von der Kodierung φ(Κ) einer Konfiguration Κ konstruiert die Funktion Δ die Kodierung der eindeutig bestimmten Nachfolgerkonfiguration, also derjenigen Konfiguration von M, die aus Κ nach genau einem Rechenschritt von M entsteht. Wir benötigen auch für beliebige η > 0 die Kodierung derjenigen Konfiguration K', die aus Κ nach genau η Schritten von M entsteht. Hierzu konstruieren wir mittels einmaliger Anwendung von primitiver Rekursion auf Δ folgende primitiv rekursive Funktion D: D : Nq
No, wobei D{0, χ) = χ und D(n + 1, s) = Ä(D(n, x)) für η > 0.
Mittels Induktion über η kann leicht bewiesen werden, daß D(n, φ (Κ) ) die gewünschte Kodierung liefert. Des weiteren benötigen wir die Anzahl der Rechenschritte, die M, gestartet in der Konfiguration Κ, durchführt. Diese erhalten wir mittels folgender μ-rekursiven Funktion A : N0 -»· N0: A{x) =
' min{¿ I D(i, x) ist Kodierung falls solches i existiert einer Endkonfiguration } Undefiniert sonst.
A ist μ-rekursiv, da Α = μρ für g : Nq
No mit g(i, x) = END{D(i, x)).
Demnach ist Α(φ(Κ)), falls der Wert definiert ist, die Anzahl der Rechenschritte, die M, gestartet in der Konfiguration K, durchführt. Ist der Wert Α(φ(Κ)) Undefiniert, dann gelangt M in keine Endkonfiguration. Ό(Α(φ(Κ)),φ(Κ)) ist im Fall, daß Α(φ(Κ)) definiert ist, die Kodierung deqenigen Endkonfiguration, in die M, gestartet in der Konfiguration K, gelangt. Wir benötigen noch primitiv rekursive Funktionen, die für ein gegebenes Element des Definitionsbereiches die Kodierung der korrespondierenden Startkonfiguration, bzw. aus der Kodierung einer Endkonfiguration den korrespondierenden Funktionswert berechnen. Die Existenz solcher Funktionen zeigt das folgende Lemma: Lemma 1.9 Es gibt primitiv rekursive Funktionen E : so daß für alle χ, χ i G No, 1 < i < r und für alle q € Q a) E(xi,x2,...ixr)
= Φ(ςobin(zx)#bin(£2)#---#bin(2:r))
—> No und F : No —> No,
und
b) F(i/>(qbm(x))) = χ. Wegen f(xi,x2,...,xr) = F(D(A(E(xh x2,..., x r )), E(xu x2,..., x r ))) folgt dann aus Lemma 1.9 die Behauptung des Satzes. Zum Beweis des Satzes verbleiben
20
1 Theoretische Berechenbarkeit
also noch •
die Definition von φ,
•
der Beweis von Lemma 1.8 und
•
der Beweis von Lemma 1.9.
Zur Definition von φ sei \Q U Σ| = p. Wir interpretieren einen String über Q U Σ als eine (ρ -f l)-näre Zahl y und bilden diese auf die korrespondierende Zahl in No ab. Sei Q U Σ = {aj, a2)..., ap}. D.h., wir numerieren die Zeichen von Q U Σ in irgendeiner Reihenfolge mit 1 beginnend durch. Dann definieren wir die Kodierung φ : {Q U Σ)* ->· N0 durch φ(ε) = 0 φ(αι) - i
ai e Q U Σ s
φ(ν íV2 ...Vs) - Υ^φ(υ^)(ρ+
1)
Vj e Q U Σ.
Übung 1.8: Beweisen Sie, daß die Abbildung φ injektiv ist. Bevor wir nun die Lemmata 1.8 und 1.9 beweisen, simulieren wir einige einfache Operationen auf (Q U Σ)* wie Konkatenation, Längenbestimmung eines Strings, Präfixbildung usw. durch primitiv rekursive Funktionen. Lemma 1.10 Es gibt primitiv rekursive Funktionen L, CONCAT, PREFIX, SUFFIX, FIRST, LAST, SELECT, ío daß V 6, c G {Q U Σ)* und i e [0..|6|] gilt: a) L (φ(ό)) |6|. b) CONCAT (φ(ό),φ(ε)) φ(όή. φ (bib 2·· M) falls i > 0 c) PREFIX(V>(6), i) φ (ε) falls i = 0. d)
SUFFIX(V>(ô),î)
e)
FIRST(V>(&))
f)
LAST(V(6))
8)
-0(ί>ΐ... 616|) φ (ε)
falls i > 0 falls i = 0.
Φ{Η\)· falls i > 0 falls i = 0.
21
1.3 Turíngmaschinen Beweis: Wir geben einfach diese Funktionen an. a) b)
L(z) CONCAT(a;, y)
c)
PREFIX (χ, i)
= =
min{ra | m < χ Λ x(p+l)LM+y. 'x/(p+
(p + l ) m > a;}.
1) L (*H
0
falls i = 0. L
d)
SUFFIX(x, i)
e) f)
FIRST (a;) LAST (a)
g)
SELECT^,»)
= =
falls i > 0
' χ mod (ρ + l) (*H+i
falls i > 0
0 PREFIX (χ, 1). SUFFIX(x,L(z)). ÍFIRST(SUFFIX(a;,i)) jo
falls i = 0.
falls i > 0 falls ¿ = 0.
Es ist leicht zu zeigen, daß obige Funktionen primitiv rekursiv sind.
• Übung 1.9: Zeigen Sie, daß die im Beweis des Lemmas 1.10 deñnieñen Funktionen prímitiv rekursiv sind. Unter Verwendung der soeben definierten primitiv rekursiven Funktionen können die Lemmata 1.8 und 1.9 leicht bewiesen werden. Beweis des Lemmas 1.8: Sei i>{Q) = {Ψ((Q)}. Falls χ eine Konfiguration der Turingmaschine ist, dann bezeichnet q(x) gerade die Position des L/S-Kopfes auf dem Band. D.h., für χ = 4>(uqv), u, ve Σ*, q € Q gilt q(x) = |«| + 1. Seien u(x) = PREFIX(x, q(x) —2), v(x) = SUFFIX(a;, q(x) + 2) und w
(x) = [ ^ ( ^ ΐ ΐ ) , ^ » , ^ ^ ) ] ·
Die Funktionen q,u, υ und w sind alle primitiv rekursiv. Des weiteren gilt für χ — φ(ubqav) mit u 6 Σ*, b G Σ U {ε}, b φ ε falls u φ ε, q e Q, α € Σ und ν e Σ*: u(x) = φ{ν), = φ{ν) und w(x) = φ^α). Als nächstes definieren wir eine primitiv rekursive Funktion ό : No —> No, die der Übergangsfunktion S entspricht. Sei y = φ^α) mit b 6 Σ U {ε}, q £ Q und a G Σ .
1 Theoretische Berechenbarkeit
22 Wir definieren:
Î
i>{bcq') falls S(q, α) = (q', c, +1) φ(bq'c) falls S(q, α) = (q1, c, 0) ifi(q'bc) falls 5(q, α) = (g', c, - 1 ) .
In allen anderen Fällen definieren wir S(y) — 0. Da S(y) nur für endlich viele y von 0 verschieden ist, folgt wiederum unmittelbar aus Satz 1.2, daß δ primitiv rekursiv ist. Nun können wir die Funktionen Δ und END definieren. Seien für i g N 0 Δ(ζ) = [tí(a;), á(w(a;)), END(z)=í° |l
und
fi^ «(,(.))€ W e ) I e € F } sonst.
Aus der Konstruktion folgt direkt, daß Δ und END primitiv rekursiv sind.
•
Beweis des Lemmas 1.9: a) Gesucht ist eine primitiv rekursive Funktion E : NQ ->• N0 mit E(xi,...,xr) = il)(qobm(xi)#.. .#bin(a; r )). Wir konstruieren zunächst eine primitiv rekursive Funktion B, die, gegeben i, χ G No, das ¿.-letzte Bit in der Binärdarstellung von χ berechnet. Betrachte hierzu die primitiv rekursive Funktion Β : Ng -»· N0 mit B(i,x) = (χ mod 2i)/2i~1. Sei P(n,x) = Σ"=χ Ψ{Β(ί, x)) • (Ρ + Ι)'" 1 . Dann gilt P{L(x),x) = V»(bin(®)). Wegen P{n + 1, χ) = φ(Β(η + 1, ζ)) · {ρ + l)^1"1
+ P{n, χ)
erhalten wir Ρ aus Β mittels primitiver Rekursion. Also ist Ρ auch primitiv rekursiv. Wir erhalten nun die Funktion E mit Hilfe der Funktion Ρ durch endlich viele Anwendungen von CONCAT. Es gilt: E(xu ..., xr) = [φ(ςο),P(L(Xl),
Xl),
φ{#),..φ{#),
P{L(xr), arr)].
Aus der primitiven Rekursivität von P, L und CONCAT folgt dann die primitive Rekursitivität von E. b) Gesucht ist eine primitiv rekursive Funktion F : No —> No mit F(^(q bin(a:))) = χ. Sei G : N0 -> N0 definiert durch G(x) = SUFFIX(z, q(x) + 1). Dann gilt G(x) — V>(bin(y)) für χ — V>(çrbin(y)). Sei H : No —» No eine primitiv rekursive Funktion mit iî(^(bin(y))) = y. Dann gilt F(x) = H{G(x)). Wir benötigen also nur noch solch eine primitiv rekursive Funktion H. O.B.d.A. sei φ{0) = 1 und φ{ 1) = 2. Dann ist die gesuchte Funktion Η definiert durch
1.4 Entscheidbarkeit
23
L{x)
Η (χ) = £ ( ( * mod ( ρ + ΐ γ / ( ρ + Ι)* - 1 ) - 1) · 2·""1. í=i
Übung 1.10: Beweisen Sie die Korrektheit der Dekodierungsfunktion Η. Insgesamt haben wir bewiesen, daß eine Funktion / genau dann μ-rekursiv ist, wenn / turingberechenbar ist. Aus der Turingmaschine, die / berechnet, gewinnt man gemäß dem Beweis von Satz 1.6 eine Ableitung der Funktion / , in der der /¿-Operator nur einmal, nämlich bei der Definition der Funktion A, verwendet wird. Also erhalten wir das folgende Korollar: KoroIIar 1.1 (Kleenesche Normalform) Falls / : f% —>• N 0 μ-rekursiv ist, dann gibt es primitiv rekursive Funktionen ρ : NQ+1 —• No und q : NQ+1 —> No, so daß f(x) = ς(μρ(χ),χ). Die Klasse der μ-rekursiven Funktionen und die Klasse der turingberechenbaren Funktionen wurden auf ganz verschiedene Art und Weise definiert. Trotzdem sind beide Klassen identisch. Seit den 30er Jahren sind zahlreiche weitere Versuche unternommen worden, die Klasse der im intuitiven Sinn berechenbaren Funktionen formal zu charakterisieren. Ähnlich wie oben konnte man für all diese Charakterisierungen beweisen, daß exakt die Klasse der μ-rekursiven Funktionen definiert wurden. Schon 1936 stellte Church die folgende, inzwischen allgemein akzeptierte These auf: Churchsche These: Die Klasse der im intuitiven Sinn berechenbaren Funktionen ist gleich der Klasse der μ-rekursiven Funktionen. Diese These kann nicht bewiesen werden.
1.4
Entscheidbarkeit
Bisher haben wir uns mit der Berechnung von Funktionen beschäftigt. In diesem Kapitel werden wir uns mit der Entscheidbarkeit von Prädikaten beschäftigen. Ein derartiges Problem kann als Wortproblem bezüglich einer Sprache definiert werden. Das Wortproblem besteht dann darin, für eine gegebene Eingabe zu entscheiden, ob sie Element der zugrundeliegende Sprache ist oder nicht. Sei Σ ein endliches Alphabet. Eine Sprache L C Σ* heißt rekursiv oder auch entscheidbar, wenn ihre charakteristische Funktion CL : Σ* —> {0,1} mit
24
1 Theoretische Berechenbarkeit
. . 1 falls χ e L CL(Z) = S v ' [0 sonst turingberechenbar ist. L heißt rekursiv aufzählbar, wenn die partielle Funktion c*L mit „. . il falls χ e L cL(x) - < I Undefiniert sonst turingberechenbar ist. Berechnet eine Turingmaschine M für eine Sprache L die Funktion c¿ oder c*L, dann schreiben wir L(M) — L. Wir sagen, M akzeptiert χ genau dann, wenn χ e L(M). Gegeben eine beliebige Turingmaschine M und eine Eingabe χ für M möchten wir entscheiden, ob die Turingmaschine M mit der Eingabe χ anhält oder nicht. Diese informelle Problemstellung heißt Halteproblem für Turingmaschinen. Zunächst werden wir das Halteproblem für Turingmaschinen als Sprache über einem endlichen Alphabet Γ = {0,1, # } formulieren. Ziel ist nun, eine beliebige Turingmaschine M = (Q, Σ, S, ç 0 , F) als einen String über Γ auszudrücken. Seien die Elemente von QUE mit 0 beginnend derart durchnumeriert, daß •
die ersten \Q\= ρ Zahlen die Zustände bezeichnen (d.h., Q = {g0, Çi, • • •, qP-i}), wobei q0 der Startzustand und F = {qp-\F\ > · · · >