Grenzen der Berechenbarkeit Klaus Becker 2007 2 Algorithmen „Die mathematische Präzisierung des Algorithmusbegriffs und die Erkenntnis der Grenzen der Algorithmisierbarkeit gehören zu den größten intellektuellen Leistungen des zwanzigsten Jahrhunderts.“ (Kirchler) Zielsetzung: Grenzen der Berechenbarkeit kennen Methoden zum Nachweis der Grenzen verstehen 3 Teil 1 Das Halteproblem 4 Frustrierende Erlebnisse Jeder hat schon einmal die Erfahrung gemacht, dass der Rechner aus irgendwelchen Gründen nicht mehr reagiert. Soll man noch warten, oder ... Mein Rechner hat sich schon wieder aufgehängt! 5 Aufgabe Testen Sie die folgenden Primzahlprogramme (siehe "primzahlen.py"). Geben Sie jeweils die Startzahl ... (sollte groß gewählt werden) vor. Programm 1 - Primzahlsuche Eingabe: Startzahl n Ausgabe: nächst größere Primzahl Programm 2 - Primzahlzwillinge Eingabe: Startzahl n Ausgabe: nächst größeres Primzahlzwillingspaar Programm 3 – Primzahl nicht neben 6er-Zahl Eingabe: Startzahl n Ausgabe: nächste Primzahl, die nicht neben einer 6er-Zahl liegt 6 Beobachtung Bei groß gewählter Startzahl halten die Programme vorerst nicht. Programm 1 - Primzahlsuche Eingabe: Startzahl n Ausgabe: nächst größere Primzahl Programm 2 - Primzahlzwillinge Eingabe: Startzahl n Ausgabe: nächst größeres Primzahlzwillingspaar Programm 3 – Primzahl nicht neben 6er-Zahl Eingabe: Startzahl n Ausgabe: nächste Primzahl, die nicht neben einer 6er-Zahl liegt 7 Lohnt es sich zu warten? Programm 1 - Primzahlsuche Eingabe: Startzahl n Ausgabe: nächst größere Primzahl Bei Eingabe von großen n hält das Programm (vorerst?) nicht. Hält immer (kann aber sehr lange dauern). Programm 2 - Primzahlzwillinge Eingabe: Startzahl n Ausgabe: nächst größeres Primzahlzwillingspaar Bei Eingabe von großen n hält das Programm (vorerst?) nicht. Hält für kleine n. Ob dies für alle n gilt, ist nicht bekannt. Programm 3 – Primzahl nicht neben 6er-Zahl Eingabe: Startzahl n Ausgabe: nächste Primzahl, die nicht neben einer 6er-Zahl liegt Bei Eingabe von großen n hält das Programm (vorerst?) nicht. Hält außer für 1, 2 und 3 nie. 8 Ein Analyseprogramm für Ungeduldige Ziel ist es, ein Programm zu entwickeln, mit dessen Hilfe man Endlosschleifen bei beliebigen Programmen feststellen kann. Wir betrachten hier zunächst die Analyse von Python-Programmen. True Python-Programm + Eingabedaten falls das Python-Programm bei Eingabe der Daten hält, sonst False 9 Textanalyse bei Python-Programmen Wir vereinfachen das Problem: Getestet werden soll zunächst, ob ein Python-Programm eine while-Anweisung enthält. analyseWhile Python-Programm True falls das Python-Programm eine while-Anweisung enthält, sonst: False 10 Aufgabe Testen Sie das folgende Analyseprogramm (siehe "analyseWhile.py"). Lassen Sie es verschiedene Python-Programme / beliebige Texte analysieren. Testen Sie auch den Fall, dass das Programm seinen eigenen Quelltext analysiert. def analyseWhile ( dateiname ) : try : datei = file ( dateiname ) quelltext = datei.read ( ) datei.close ( ) print quelltext except : return 'FehlerBeimLaden‚ liste = quelltext.split ( ) print liste gefunden = False for i in range ( 0 , len ( liste ) - 1 ) : if liste [ i ] == 'while' : gefunden = True return gefunden >>> analyseWhile('ggt1.py') ggt1.py def ggt ( x , y ) : while y > 0 : h = x % y x = y y = h return x Aufgabe 11 Modifizieren Sie das Analyseprogramm so, dass es rekursive PythonProgramme erkennen kann. Gehen Sie vereinfachend davon aus, dass die zu analysierenden Programme in einer Token-basierten Form vorliegen (der Quelltext ist hier so gestaltet, dass die einzelnen Bausteine / Token durch Leerzeichen getrennt sind wie im Beispiel unten). rekursiv def ggt ( x , y ) : if x == y : return x else : if x > y : return ggt ( x - y , y ) else : return ggt ( x , y - x ) nicht rekursiv def ggt ( x , y ) : while y > 0 : h = x % y x = y y = h return x Aufgabe 12 Ein Analyseprogramm soll testen, ob eine der in der Abbruchbedingung einer while-Anweisung vorkommenden Variablen innerhalb des Restprogramms einen Wert zugewiesen erhält. Beurteilen Sie auch den eingeschlagenen Weg, das Terminationsverhalten eines Programms anhand syntaktischer Eigenschaften des Quelltextes abzulesen. kritische Variable def ggt ( x , y ) : while y > 0 : h = x % y x = y y = h return x 13 Selbsthaltende Programme Ein (Python-)Programm heißt selbsthaltend, wenn es bei Eingabe seines eigenen Quelltextes hält. Gibt es ein Programm "analyseSelbsthaltend", das entscheiden kann, ob ein Python-Programm selbsthaltend ist? analyseSelbsthaltend Python-Programm True falls, das Python-Programm bei Eingabe des eigenen Quelltextes hält, sonst: False Aufgabe 14 Wie würde sich dieses "seltsame" Programm bei der Analyse von Quelltexten / seines eigenen Quelltextes verhalten? Gehen Sie von der Annahme aus, dass der kommentierte Teil des Programms durch geeignete Anweisungen realisiert ist. def seltsam(dateiname): # wenn das (unter dem Dateinamen abgespeicherte Programm) # selbsthaltend ist: # dann wird der Wert der Variablen selbsthaltend # auf True gesetzt, # sonst # wird der Wert auf False gesetzt. if selbsthaltend: while True: selbsthaltend = selbsthaltend return selbsthaltend 15 Ein seltsames Programm Das Programm 'seltsam.py' kehrt den Spieß um: seltsam Python-Programm hält nicht falls, das Python-Programm bei Eingabe des eigenen Quelltextes hält, sonst: hält Ein seltsames Programm 16 Wenn das Programm 'seltsam.py' sich selbst analysiert, dann ergibt sich eine widersprüchliche Situation: 'seltsam.py' hält nicht bei Eingabe des eigenen Quelltextes genau dann, wenn es bei Eingabe des eigenen Quelltextes hält. seltsam 'seltsam.py' hält nicht falls, das 'seltsam.py' bei Eingabe des eigenen Quelltextes hält, sonst: hält 17 Spezielles Halteproblem Problem: Gibt es ein Programm "analyseSelbsthaltend", das entscheiden kann, ob ein Python-Programm selbsthaltend ist? Annahme: Es gibt ein solches Programm . Konstruktion: Dann gibt es ein modifiziertes Programm 'seltsam.py', das sich wie folgt verhält: seltsam Python-Programm hält nicht falls, das Python-Programm bei Eingabe des eigenen Quelltextes hält, sonst: hält Spezielles Halteproblem 18 Argumentation: Wenn das Programm 'seltsam.py' sich selbst analysiert, dann ergibt sich eine widersprüchliche Situation: seltsam 'seltsam.py' hält nicht falls, das 'seltsam.py' bei Eingabe des eigenen Quelltextes hält, sonst: hält Folgerung: Die Annahme, dass es ein Programm "analyseSelbsthaltend" gibt, muss falsch sein. Entscheidbarkeit 19 Definition: Eine Sprache über einem Alphabet heißt (Python-) entscheidbar, wenn es ein (Python-) Programm gibt, das für jedes Wort über dem Alphabet feststellt, ob es zur Sprache gehört oder nicht. Programm Wort True falls, das Wort zur Sprache gehört, sonst: False Beachte: Das Programm muss für jede Eingabe halten und eine der beiden Ausgaben "True" bzw. "False" erzeugen. Entscheidbarkeit 20 Satz: Die Sprache der Python-Quelltexte, die zu einem Programm gehören, das bei Eingabe des eigenen Quelltextes hält, ist nicht (Python-) entscheidbar. True Python-Programm falls, das Python-Programm bei Eingabe des eigenen Quelltextes hält, sonst: False Fazit: Das spezielle Halteproblem (Hält ein Programm, wenn es seinen eigenen Quelltext bearbeitet?) ist nicht (Python-) entscheidbar. 21 Weitere Ergebnisse Termination ist nicht entscheidbar: Es gibt kein (Python-) Programm zur Entscheidung von Termination, d. h. ob ein beliebig vorgegebenes Programm bei Eingabe beliebiger Daten hält. Korrektheit ist nicht entscheidbar: Es gibt kein (Python-) Programm zur Entscheidung von Korrektheit, d. h. ob ein beliebig vorgegebenes Programm bei Eingabe beliebiger Daten eine im Vorfeld festgelegte Eigenschaft hat. 22 Beurteilung der Ergebnisse Irren ist menschlich. Solange Menschen Programme schreiben, werden diese mit Fehlern behaftet sein. (Sneed) Eine unzuverlässige Programmiersprache, aus der unzuverlässige Programme hervorgehen, bedeutet eine größere Gefahr für die Gesellschaft als unsichere Automobile, giftige Schädlingsbekäpfungsmittel oder undichte Reaktoren in Kernkraftwerken. (Hoare) 23 Teil 2 Berechenbarkeit als Problem 24 Vorsicht: Verallgemeinerungen „Geben Sie einem Computer die richtige Software, und er wird tun, was immer Sie wünschen. Die Maschine selbst mag Grenzen haben, doch für die Möglichkeiten von Software gibt es keine Grenzen.“ Das (spezielle) Halteproblem ist nicht Python-entscheidbar. D.h.: Es gibt keinen Algorithmus, mit dem man das (spezielle) Halteproblem lösen kann. (zitiert nach D. Harel: Das Affenpuzzle und weitere bad news aus der Computerwelt) Etwas unvorsichtige Äußerung eines Herausgebers einer SoftwareZeitschrift, der seine Erfahrungen über die Entwicklungen in der Informatik beschreibt Etwas schnelle Verallgemeinerung von Programmen in einer speziellen Programmiersprache zu beliebigen Algorithmen In beiden Fällen werden Aussagen über das algorithmisch Machbare getroffen. Dies ist insofern problematisch, da hier Aussagen über alle denkbaren Algorithmen gemacht werden. 25 (Un-)Möglichkeitsnachweise Es gibt eine Zahl, deren Quadrat 1 ergibt. Es gibt keine Zahl, deren Quadrat -1 ergibt. Da 1*1 = 1, ist die Zahl schon gefunden. Unter "Zahlen" verstehen wir hier reelle Zahlen. Aus den Festlegungen über die Multiplikation reeller Zahlen folgt, dass für jede reelle Zahl x gilt: x*x ≥ 0. Also gibt es keine reelle Zahl, deren Quadrat -1 ergibt. Es gibt einen Algorithmus, der ... leistet. Es gibt keinen Algorithmus, der ... leistet. Möglichkeitsnachweis: Man entwickelt einen geeigneten Algorithmus. Unmöglichkeitsnachweis: Man muss zeigen, dass es keinen Algorithmus gibt, der das gestellte Problem löst. Dies erfordert letztlich, dass man den Algorithmusbegriff präzisiert. 26 Was ist ein Algorithmus? Zielsetzung: Um Nachweise über alle möglichen Algorithmen führen zu können, benötigt man eine Klärung des Algorithmusbegriffs. Ziel der folgenden Betrachtungen ist es daher, diesen Begriff möglichst präzise zu beschreiben. Es gibt einen Algorithmus, der ... leistet. Es gibt keinen Algorithmus, der ... leistet. Möglichkeitsnachweis: Man entwickelt einen geeigneten Algorithmus Unmöglichkeitsnachweis: Man muss zeigen, dass es keinen Algorithmus gibt, der das gestellte Problem löst. Dies erfordert letztlich, dass man den Algorithmusbegriff präzisiert. Aufgabe 27 Welche der folgenden Verfahren würden Sie als Algorithmus bezeichnen? def ggt(x, y): while y > 0: h = x % y x = y y = h return x "Wenn CD aber AB nicht misst, und man nimmt bei AB, CD abwechselnd immer das kleinere vom größeren weg, dann muss (schließlich) eine Zahl übrig bleiben, die die vorangehende misst." Eingabe: a/b und c/d Sei g der ggT von b und d. Sei b = m*g und d = n*g. Sei x = (n*a + m*b). Sei y = m*n*g. Ausgabe: x/y GGT - Version 2 {x = a; y = b; a,b natürliche Zahlen größer 0} SOLANGE y > 0 x>y ja nein x := x - y {x = ggT(a,b)} y := y - x Eingabe: Polynomgleichung p mit ganzzahligen Koeffizienten, in der verschiedene Variablen mit verschiedenen Exponenten vorkommen können (wie z. B. x3 + 5x2y2z – xz + 37 = 0) Wenn p ganzzahlige Lösungen hat, dann bestimme ein Lösungstupel t. Ausgabe: t 28 Aufgabe Vergleichen Sie die Begriffsdefinitionen. Welches sind die definierenden Eigenschaften des Algorithmusbegriffs? Warum ist es so schwierig, den Begriff "Algorithmus" präzise zu klären? Ein Algorithmus ist eine endliche Folge von Instruktionen, die alle eindeutig interpretierbar und mit endlichem Aufwand in endlicher Zeit ausführbar sind. Algorithmen enthalten Instruktionen zur Formulierung von (beliebig vielen) Wiederholungen anderer Instruktionen. Unabhängig von den Werten der Eingangsgrößen endet ein Algorithmus stets nach endlich vielen Instruktionsschritten. Ein Programm ist dann ein Algorithmus, wenn für alle möglichen Eingabewerte sichergestellt ist, dass keine Instruktion unendlich oft wiederholt wird. (Knuth) Ein Algorithmus ist eine präzise, d.h. in einer festgelegten Sprache abgefasste, endliche Beschreibung eines allgemeinen Verfahrens unter Verwendung ausführbarer elementarer (Verarbeitungs-) Schritte. (Bauer, Goos) Ein Algorithmus ist ein endliches schrittweises Verfahren zur Berechnung gesuchter aus gegebenen Größen, in dem jeder Schritt aus einer Anzahl ausführbarer eindeutiger Operationen und einer Angabe über den nächsten Schritt besteht. (Rechenberg) siehe: http://www.swe.uni-linz.ac.at/teaching/lva/ss02/algo1_vorlesung/hinweise.html 29 Intuitiver Algorithmusbegriff "Definition": Ein Algorithmus ist eine Verarbeitungsvorschrift, die so präzise formuliert ist, dass sie auch von einer Maschine abgearbeitet werden kann. Ein Algorithmus ist eindeutig, d. h.: die einzelnen Schritte und ihre Abfolge sind unmissverständlich beschrieben ausführbar, d. h.: der "Prozessor" muss die Einzelschritte abarbeiten können endlich, d. h.: seine Beschreibung besteht aus einem Text endlicher Länge allgemein, d. h.: es wird nicht nur ein Problem, sondern eine ganze Klasse von Problemen gelöst nach: Gasper, Leiß, Spengler, Stimm: Technische und theoretische Informatik. bsv Merkert: http://www.hsg-kl.de/faecher/inf/algorithmus/definition/index.php 30 Intuitiver Algorithmusbegriff "Definition": Ein Algorithmus ist eine Verarbeitungsvorschrift, die so präzise formuliert ist, dass sie auch von einer Maschine abgearbeitet werden kann. Ein Algorithmus ist eindeutig, d. h.: die einzelnen Schritte und ihre Abfolge sind unmissverständlich beschrieben nicht präzise ausführbar, d. h.: der "Prozessor" muss die Einzelschritte abarbeiten können endlich, d. h.: seine Beschreibung besteht aus einem Text endlicher Länge allgemein, d. h.: es wird nicht nur ein Problem, sondern eine ganze Klasse von Problemen gelöst Die oben aufgeführte Begriffsklärung ist keine präzise Definition im mathematischen Sinne. Ziel ist es, die informelle Begriffsklärung durch eine präzise Definition im mathematischen Sinne zu ersetzen. Berechnungsmodelle 31 Ansatz: Die Festlegung des Algorithmusbegriffs bezieht sich auf ein streng definiertes Berechnungsmodell, das genau vorschreibt, was unter „ausführbar“ zu verstehen ist. Eingaben Verarbeitungsanweisungen “Prozessor” Ausgaben Maschinenorientierter Ansatz: Präzisierung des Prozessors Zuordnungsorientierter Ansatz: Präzisierung der E/A-Zuordnungen Anweisungsorientierter Ansatz: Präzisierung der zulässigen Anweisungen 32 Anforderungen an Berechnungsmodelle Anforderungen an ein Berechnungsmodell: Es soll die „Idee Computer“ erfassen, d. h. es kann Problemlösungen (in geeignet beschriebener Form) selbstständig ausführen es kann Rechenoperationen ausführen es ist universell programmierbar in dem Sinn, dass es beliebige Programme bei beliebigen Daten ausführen kann es ist so mächtig, dass es alle Algorithmen (in geeignet kodierter Form) ausführen kann Eingaben Verarbeitungsanweisungen Ausgaben “Prozessor” 33 Teil 3 Turingmaschinen und Marienkäfer 34 Ein erstes Berechnungsmodell http://www.alanturing.net/ Alan Mathison Turing FRS OBE (born 23 June 1912 at 2 Warrington Crescent, London W9, died 7 June 1954 at his home in Wilmslow, Cheshire) contributed to mathematics, cryptanalysis, logic, philosophy, biology, and formatively to computer science, cognitive science, Artificial Intelligence and Artificial Life. Educated at Sherborne School in Dorset, Turing went up to King's College, Cambridge in October 1931 to read Mathematics. He was elected a Fellow of King's in March 1935, at the age of only 22. In the same year he invented the abstract computing machines - now known simply as Turing machines - on which all subsequent stored-program digital computers are modelled. ... Ein erstes Berechnungsmodell wurde 1936 von A. Turing entwickelt - die sog. Turingmaschine. Turings Idee ... 35 „Computing is normally done by writing certain symbols on paper. We may suppose this paper is divided into squares like a child's arithmetic book. In elementary arithmetic the twodimensional character of the paper is sometimes used. But such a use is always avoidable, and I think that it will be agreed that the two-dimensional character of paper is no essential of computation. I assume then that the computation is carried out on one-dimensional paper, i.e. on a tape divided into squares. [...]“ „The behaviour of the computer at any moment is determined by the symbols which he is observing and his “state of mind” at that moment. [...]“ „Let us imagine the operations performed by the computer to be split up into “simple operations” which are so elementary that it is not easy to imagine them further divided. [...]“ aus: Alan Turing: On Computable Numbers, with an Application to the Entscheidungsproblem. Proceedings of the London Mathematical Society 3 6 2 7 7 2 2 5 2 9 7 2 36 ... umgesetzt mit einem Marienkäfer Kara ist ein Marienkäfer. Kara lebt in einer Welt mit unbewegliche Baumstümpfen, Pilzen, die Kara verschieben kann und Kleeblättern, die Kara legen und aufnehmen kann. 37 Kara´s Sicht der Welt Kara hat Sensoren, mit denen er/sie die Umwelt wahrnimmt: Kara versteht einige Befehle, die er/sie folgsam ausführt: stehe ich vor einem Baumstumpf? mache einen Schritt vorwärts! ist links von mir ein Baumstumpf? drehe um 90° nach links! ist rechts von mir ein Baumstumpf? drehe um 90° nach rechts! stehe ich vor einem Pilz? lege ein Kleeblatt hin! stehe ich auf einem Kleeblatt? nimm ein Kleeblatt auf! Kara soll ein Problem lösen 38 Kara soll bis zum nächsten Baumstumpf, einmal um ihn herum und anschließend zurück zum Ausgangspunkt laufen. AZ: ... ZZ: Steuerung von Kara 39 Akt. Zustand: Bedingung: Aktionen: Neuer Zustand: markieren hin hin nein hin hin ja zurück nein zurück zurück ja stop ... Vor Baum? nein / vorwärts mark. / Blatt hinlegen hin zurück Auf Blatt? nein / vorwärts Vor Baum? ja / links; ... zurück Auf Blatt? ja / links; links stop 40 Kara lernt rechnen Kara soll Rechenaufgaben wie mit einem Abakus durchführen. Zum Rechnen benutzt Kara Kleeblätter. Eine Additionsaufgabe sieht wie folgt aus: AZ: Kara steht vor zwei beliebig langen, durch eine leere Zelle getrennte Blattreihen der Längen m und n (die auch 0 sein können). ZZ: Kara hat eine Blattreihen der Länge m+n erzeugt. Steuerung von Kara 41 Akt. Zustand: Bedingung: Aktionen: SchrittVor Neuer Zustand: BlattAufhenen BlattAufheben nein stop BlattAufheben ja LueckeSuchen LueckeSuchen nein LueckeSuchen LueckeSuchen ja ZurueckLaufen ZurueckLaufen nein ZurueckLaufen ZurueckLaufen ja stop Auf Blatt? nein / vorwärts SchrittVor / vorwärts Auf Blatt? ja / vorwärts Auf Blatt? ja / Auf Blatt? ja / Auf Blatt? nein / aufheben; BlattLuecke- hinlegen; Zurueck- links; links stop Aufheben vorwärts Suchen links; links Laufen Auf Blatt? nein / 42 Darstellung im Programm AZ: Kara steht vor zwei beliebig langen, durch eine leere Zelle getrennte Blattreihen der Längen m und n (die auch 0 sein können). ZZ: Kara hat eine Blattreihen der Länge m+n erzeugt. 43 Aufgabe Entwickeln Sie einen "Kara-Algorithmus" zur Lösung des Problems: AZ: Kara sieht in Blickrichtung eine beliebig lange Baumstumpfreihe. ZZ: Kara umläuft die Baumstümpfe und bleibt stehen. 44 Aufgabe Entwickeln Sie einen "Kara-Algorithmus" zur Lösung des Problems: AZ: Kara sieht in Blickrichtung eine beliebig lange vertikale Baumstumpfreihe. ZZ: Kara umläuft die Baumstumpfreihe und bleibt in der Verlängerung seines Wegs stehen. 45 Aufgabe Entwickeln Sie einen "Kara-Algorithmus" zum Verdoppeln: AZ: Kara steht vor einer beliebig langen Blattreihe der Länge n (die auch 0 sein kann). ZZ: Kara hat eine Blattreihe der Länge 2n erzeugt. 46 Aufgabe Entwickeln Sie einen "Kara-Algorithmus" zur Subtraktion: AZ: Kara steht vor zwei beliebig langen, durch eine leere Zelle getrennte Blattreihen der Längen m und n (die auch 0 sein können). ZZ: Falls mn ist, hat Kara eine Blattreihe der Länge m-n erzeugt. 47 Aufgabe Entwickeln Sie einen "Kara-Algorithmus" zur Subtraktion: AZ: Kara steht vor zwei beliebig langen, durch eine leere Zelle getrennte Blattreihen der Längen m und n (die auch 0 sein können). ZZ: Falls m<n ist, kommt Kara nicht mehr klar und dreht sich ständig im Kreis herum. 48 Aufgabe Entwickeln Sie einen "Kara-Algorithmus" zur Multiplikation: AZ: Kara steht vor zwei beliebig langen, durch eine leere Zelle getrennte Blattreihen der Längen m und n (die auch 0 sein können). ZZ: Kara hat eine Blattreihe der Länge mn erzeugt. Turingmaschine 49 Ein-/Ausgabeband I Schreib/Lesekopf I I q0 I I Zustandsbasierte Verarbeitungseinheit Die Turingmaschine besteht aus - einem unendlich langen Speicherband mit unendlich vielen sequentiell angeordneten Feldern. In jedem dieser Felder kann genau ein Zeichen gespeichert werden. (Man darf sich das unendliche lange Band auch als ein endliches vorstellen, es muss jedoch lang genug sein, um die aktuelle Berechnung ungehindert ausführen zu können, d. h. der Lese- und Schreibkopf darf nicht an das Ende stoßen.) - einem programmgesteuerten Lese- und Schreibkopf, der sich auf dem Speicherband feldweise bewegen und die Zeichen verändern kann. Eine Turingmaschine modifiziert die Eingabe auf dem Band nach einem gegebenen Programm. Ist die Berechnung beendet, so befindet sich das Ergebnis auf dem Band. Es wird somit jedem Eingabewert ein Ausgabewert zugeordnet. siehe: http://de.wikipedia.org/wiki/Turingmaschine 50 Variationen der Turingmaschine I AZ: 2-Band-Turingmaschine z0 I I I I ;II;RR z0 I ;I ;LS ; ;LS z1 I ;II;RR ; ;RS z2 ; ;SS 2-dimensionale Turingmaschine z3 Arbeitsweise der Turingmaschine 51 Berechnungsproblem: Addition von „Strichzahlen“ AZ: I I z0 ZZ: I S I I I I I I I Turingmaschine (dargestellt mit einem Zustandsgraphen): I; I; R I; I; R I; I; L I; I; S Aktion z0 ; I; R z1 ; ;L z2 Gelesenes Zeichen I; ; L z3 ; ;R z4 Geschriebenes Zeichen Arbeitsweise der Turingmaschine 52 Turingmaschine (dargestellt mit einer Zustandstafel): alter Zustand gelesenes Zeichen geschrieb. KopfZeichen bewegung neuer Zustand Z0 Z0 I ' ' I I R R Z0 Z1 Z1 Z1 I ' ' I ' ' R L Z1 Z2 ... Turingmaschine (dargestellt mit einem Zustandsgraphen): I; I; R I; I; R I; I; L I; I; S Aktion z0 ; I; R z1 ; ;L z2 Gelesenes Zeichen I; ; L z3 ; ;R z4 Geschriebenes Zeichen 53 Aufgabe Zeigen Sie, dass die folgenden Rechenoperationen von einer Turingmaschine ausgeführt werden können: Verdopplung einer natürlichen Zahl (dargestellt als Strichzahl) Addition von zwei natürlichen Zahlen Subtraktion von zwei natürlichen Zahlen Multiplikation von zwei natürlichen Zahlen ... Übertragen Sie für eines der Berechnungsprobleme das bereits entwickelte Kara-Programm in ein entsprechendes Turingmaschinen-Programm. 54 Aufgabe Testen Sie auch den Turingmaschinen-Simulator von MathePrisma. Schauen Sie sich die Arbeitsweise von verschiedenen Turingmaschinen an (u. a. zum Sortieren). 55 Teil 4 Turingmaschine als universelles Berechnungsmodell 56 Anforderungen an Berechnungsmodelle Anforderungen an ein Berechnungsmodell: Es soll die „Idee Computer“ erfassen, d. h. es kann Problemlösungen (in geeignet beschriebener Form) selbstständig ausführen es kann Rechenoperationen ausführen es ist universell programmierbar in dem Sinn, dass es beliebige Programme bei beliebigen Daten ausführen kann es ist so mächtig, dass es alle Algorithmen (in geeignet kodierter Form) ausführen kann Eingaben Verarbeitungsanweisungen Ausgaben “Prozessor” 57 Präzisierung des Berechnungsmodells Definition: Eine Turingmaschine ist ein Tupel T = (X, B, b, Z, z0, ) bestehend aus - einer endlichen, nichtleeren Menge X von Eingabezeichen, - einer Menge B mit X B von Bandzeichen, - einem speziellen Bandzeichen b B \ X („Blank“), - einer endlichen, nichtleeren Menge Z von Zuständen, - einem Anfangszustand z0Z, - einer Überführungsfunktion : Z x B B x {L, R, S} x Z alter Zustand gelesenes Zeichen geschrieb. KopfZeichen bewegung neuer Zustand Z0 Z0 I ' ' I I R R Z0 Z1 Z1 Z1 I ' ' I ' ' R L Z1 Z2 ... 58 Berechenbarkeit Definition: Eine Funktion f: N N heißt Turingmaschinen-berechenbar, gdw gilt: Es gibt eine Turingmaschine T mit der folgenden Eigenschaft: AZ: Auf dem Band befindet sich n dargestellt als Strichzahl. I I z0 ZZ: Fall 1: f(n) ist definiert: T hält und hat f(n) dargestellt als Strichzahl erzeugt. I I I I Fall 2: f(n) ist undefiniert (kurz: f(n) = ): T hält nicht. Analog für f: N x N x ... x N N 59 Ergebnisse Satz: Die folgenden Funktionen sind Turing-berechenbar: f(n) = 2n f(m, n) = m + n f(m, n) = IF(mn, m-n, ) f(m, n) = mn ... 60 Zwischenbilanz Was leistet das Berechnungsmodell "Turingmaschine"? Es soll die „Idee Computer“ erfassen, d. h. es kann Problemlösungen (in geeignet beschriebener Form) selbstständig ausführen (z. B. Sortieren) es kann Rechenoperationen ausführen (z. B. Addieren) es ist universell programmierbar in dem Sinn, dass es beliebige Programme bei beliebigen Daten ausführen kann es ist so mächtig, dass es alle Algorithmen (in geeignet kodierter Form) ausführen kann Zielsetzung: Die Turingmaschine ist ein auf den ersten Blick sehr primitives RechnerModell. Zu klären ist, ob sie auch im oben beschriebenen Sinn programmierbar ist. 61 Universelle Berechnungsmodelle Computer sind programmierbar! Ein universelles Berechnungsmodell sollte in der Lage sein, nicht nur Eingabedaten in einer ganz bestimmten Weise zu verarbeiten, sondern Eingabedaten nach einem beliebigen ebenfalls einzugebenden Verarbeitungsprogramm zu verarbeiten. Daten Computer als programmierbares System Programm Daten Universelle Turingmaschine 62 Eine universelle Turingmaschine besitzt die Fähigkeit, beliebige andere Turingmaschinen zu simulieren. Als Eingabe erhält sie die Beschreibung der zu simulierenden Turingmaschine und der Daten auf dem Eingabeband für diese Turingmaschine. Eine universelle Turingmaschine ist somit ein Turingmaschinen-Interpreter. Eingabeband 10110111# universelle Turingmaschine 1;0;R 0;1;R z1 Eingabeband #;#;S 01001000# z0 Turingmaschine zum Invertieren einer 0-1-Zeichenkette Simulation mit Turing-Kara 63 Aktueller Zustand Kodierung der TM 1;0;R 0;1;R z1 #;#;S z0 101010101# Ein-/Ausgabeband Vgl.: Turingkara – Aufgaben: Die universelle Turingmaschine 64 Aufgabe Testen Sie die universelle Turingmaschine der Turing-Kara-Umgebung. Versuchen Sie insbesondere zu verstehen, wie diese universelle Turingmaschine arbeitet. Verändern Sie auch die Bandbelegung zu Beginn der Simulation. Versuchen Sie auch, die Arbeitsweise einer weiteren Turingmaschine (z. B. zum Verdoppeln von Strichzahlen) zu simulieren. Simulation mit dem MPG-Simulator 65 Kodierung: alter Zustand als Strichzahl+1; Leerzeichen; altes Zeichen; neues Zeichen; Bewegung; neuer Zustand als Strichzahl+1 * 10# 1;0;R 0;1;R z0 I I #;#;S 1 0 R I * ... Kodierung der Turing-Tafel 1 0 # z1 Aktueller Zustand Ein-/Ausgabe-Band Vgl.: U. Mayr: Theoretische Informatik am PC, S. 18 ff. Programm: Bsp-206.tm 66 Aufgabe Testen Sie die universelle Turingmaschine der MPG-Simulationsumgebung. Versuchen Sie insbesondere zu verstehen, wie diese universelle Turingmaschine arbeitet. Verändern Sie auch die Bandbelegung zu Beginn der Simulation. Versuchen Sie auch, die Arbeitsweise einer weiteren Turingmaschine (z. B. zum Verdoppeln von Strichzahlen) zu simulieren. Universelle Turingmaschine 67 Die universelle Turingmaschine ist bisher als zweidimensionale (Kara) bzw. Zwei-Band-Turingmaschine (MPG-Simulator) konzipiert. Um von einem universellen Berechnungsmodell sprechen zu können, müsste die universelle Turingmaschine vom selben Typ wie die zu simulierenden Turingmaschinen sein (also eine Ein-Band-Turingmaschine). Band Zweidimensionale Turingmaschine / Ein-Band-TM Zwei-BandTuringmaschine Band 68 Äquivalenzsatz Satz: Eine Funktion f: N x N x ... x N N ist mit einer Ein-Band-Turingmaschine berechenbar gdw sie mit einer Zwei-Band-Turingmaschine berechenbar ist gdw sie mit einer Mehr-Band-Turingmaschine berechenbar ist gdw sie mit einer zweidimensionalen Turingmaschine berechenbar ist. Beweisidee: Simulation siehe etwa: U. Mayr: Theoretische Informatik am PC. (Programm: Bsp-a5.tm) 69 Existenz universeller Turingmaschinen Satz: Es gibt universelle Turingmaschinen. Bemerkungen zum Beweis: Die Existenz einer universellen Turingmaschine zeigt man, indem man eine TM konstruiert, die sich wie ein Turingmaschinen-Interpreter verhält, d. h. diese (zweidimensionale oder Mehr-Band-) Turingmaschine simuliert das Verhalten einer beliebig vorgegebenen Ein-Band-Turingmaschine bei einer beliebig vorgegebenen Bandbelegung. Die vorgegebene Turingmaschine und die vorgegebene Bandbelegung müssen dabei geeignet kodiert werden. 70 Zwischenbilanz Was leistet das Berechnungsmodell "Turingmaschine"? Es soll die „Idee Computer“ erfassen, d. h. es kann Problemlösungen (in geeignet beschriebener Form) selbstständig ausführen (z. B. sortieren) es kann Rechenoperationen ausführen (z. B. Addieren) es ist universell programmierbar in dem Sinn, dass es beliebige Programme bei beliebigen Daten ausführen kann es ist so mächtig, dass es alle Algorithmen (in geeignet kodierter Form) ausführen kann Bemerkung: Die Turingmaschine ist damit trotz ihrer Einfachheit ein ernst zu nehmender Kandidat für die Präzisierung der "Idee Computer". 71 Teil 5 Alternative Berechnungsmodelle 72 Maschinenorientierte Modelle Die Turingmaschine ist letztlich eine mathematische Präzisierung des "Prozessors". Hier wird eine Art Modell-Maschine festgelegt, die die "Idee Computer" erfassen soll. Weitere Modell-Maschinen sind möglich. Eingaben Verarbeitungsanweisungen “Prozessor” Ausgaben Maschinenorientierter Ansatz: Präzisierung des Prozessors Beispiele: Turingmaschine, Registermaschine Anweisungsorientierter Ansatz: Präzisierung der zulässigen Anweisungen Zuordnungsorientierter Ansatz: Präzisierung der E/A-Zuordnungen Registermaschine 73 Das Registermaschinenmodell orientiert sich stärker am Aufbau realer Computer. Daten 0: 1: 2: 3: 4: 5 3 0 0 0 .. > 0 1 2 3 4 5 JMP INC DEC TST JMP HLT 3 0 1 1 1 Programm > x INC i Erhöhe Register i um 1. Gehe zu Zeile x+1. > x DEC i Erniedrige Register i um 1. Gehe zu Zeile x+1. > x JMP i Gehe zu Zeile i. > x TST i Wenn Register i ungleich 0 ist, dann gehe zu Zeile x+1, sonst zu Zeile x+2. > x HLT Beende die Bearbeitung. Aufgabe 74 Entwickeln Sie ein Registermaschinenprogramm, das den Inhalt eines Registers verdoppelt: 0: 1: 2: 3: 4: .. 0 n 0 0 0 Zustand vorher 0: 1: 2: 3: 4: .. RM-Programm 2n 0 0 0 0 Zustand nachher Berechenbarkeit 75 Definition: Eine Funktion f: N N heißt Registermaschinen-berechenbar, gdw gilt: Es gibt eine Registermaschine mit der folgenden Eigenschaft AZ: Im Registern R1 befindet sich der Ausgangswert. 0 ZZ: n 0 0 ... Fall 1: f(n) ist definiert: Die RM hält und in R0 befindet sich der Ergebniswert. f(n) ... ... ... ... Fall 2: f(n) ist undefiniert: Die RM hält nicht. Analog für f: N x N x ... x N N Berechenbarkeit 76 0: 1: 2: 3: 4: .. 0 n 0 0 0 Zustand vorher > 0 1 2 3 4 5 6 7 8 9 10 11 JMP DEC INC INC TST JMP JMP DEC INC TST JMP HLT 4 1 0 2 1 1 10 2 0 2 7 RM-Programm 0: 1: 2: 3: 4: .. 2n 0 0 0 0 Zustand nachher Das RM-Programm oben zeigt, dass die Funktion f: N N mit f(n) = 2n Registermaschinen-berechenbar ist. 77 Ergebnisse Satz: Die folgenden Funktionen sind Registermaschinen-berechenbar: f(n) = 2n f(m, n) = m + n f(m, n) = IF(mn, m-n, ) f(m, n) = mn ... 78 Äquivalenzsatz Satz: Eine Funktion f: N x N x ... x N N ist Turingmaschinen-berechenbar gdw sie Registermaschinen-berechenbar ist. Bemerkungen zum Beweis: Der Beweis wird konstruktiv geführt. Man konstruiert mit Hilfe einer Turingmaschine einen Registermaschinen-Interpreter und umgekehrt mit Hilfe einer Registermaschine einen Turingmaschinen-Interpreter. 79 Anweisungsorientierte Modelle Die Grundidee anweisungsorientierter Berechnungsmodelle besteht darin, die erlaubten Anweisungen über eine Programmiersprache festzulegen. Eingaben Verarbeitungsanweisungen “Prozessor” Ausgaben Maschinenorientierter Ansatz: Präzisierung des Prozessors Anweisungsorientierter Ansatz: Präzisierung der zulässigen Anweisungen Beispiele: LOOP, WHILE, PASCAL, DELPHI, JAVA, PYTHON, ... Zuordnungsorientierter Ansatz: Präzisierung der E/A-Zuordnungen 80 LOOP-Programme / Syntax Bestandteile von LOOP-Programmen: Variablen: x0 x1 x2 ... Konstanten: 0 1 2 ... Trennsymbole: ; := Operatoren: +- Schlüsselwörter: LOOP DO END Aufbau eines LOOP-Programms: Jede Wertzuweisung der Form xi := c oder xi := xj oder xi := xj + c oder xi := xj - c ist ein LOOP-Programm. Falls P1 und P2 LOOP-Programme sind, dann ist auch die Sequenz P1; P2 ein LOOP-Programm. Falls P ein LOOP-Programm ist, dann ist auch LOOP xi DO P END ein LOOPProgramm. 81 LOOP-Programme / Semantik Beispiel eines LOOP-Programms x0 := x1; LOOP x2 DO x0 := x0 + 1 END Entsprechendes Python-Programm x0 = x1 for i in range(x2): x0 = x0 + 1 Ausführung der LOOP-Anweisung Eine LOOP-Anweisung der Form LOOP xi DO P END wird wie folgt ausgeführt: Die LOOP-Anweisung P wird sooft ausgeführt, wie der Wert der Variablen xi zu Beginn beträgt. Bedeutung eines LOOP-Programms {x0: [...]; x1: [5]; x2: [3]; x3: [...]; ... } x0 := x1; LOOP x2 DO x0 := x0 + 1 END {x0: [8]; x1: [5]; x2: [3]; x3: [...]; ... } Das Programm berechnet die Additionsfunktion auf natürlichen Zahlen: f(m, n) = m + n 82 WHILE-Programme / Syntax Bestandteile von WHILE-Programmen: Variablen: x0 x1 x2 ... Konstanten: 0 1 2 ... Trennsymbole: ; := Operatoren: +- Schlüsselwörter: WHILE DO END Aufbau eines LOOP-Programms: Jede Wertzuweisung der Form xi := c oder xi := xj oder xi := xj + c oder xi := xj - c ist ein WHILE-Programm. Falls P1 und P2 WHILE-Programme sind, dann ist auch die Sequenz P1; P2 ein WHILE-Programm. Falls P ein WHILE-Programm ist, dann ist auch WHILE xi 0 DO P END ein WHILEProgramm. 83 WHILE-Programme / Semantik Beispiel eines WHILE-Programms x0 := x1; WHILE x2 0 DO x0 := x0 + 1; x2 := x2 - 1 END Entsprechendes Python-Programm x0 = x1 while x2 <> 0: x0 = x0 + 1 x2 = x2 - 1 Ausführung der WHILE-Anweisung Eine WHILE-Anweisung der Form WHILE xi 0 DO P END wird wie folgt ausgeführt: Das WHILE-Programm P wird solange ausgeführt, wie der Wert der Variablen xi ungleich Null ist. Bedeutung eines LOOP-Programms {x0: [0]; x1: [5]; x2: [3]; x3: [0]; ... } x0 := x1; WHILE x2 0 DO x0 := x0 + 1; x2 := x2 - 1 END {x0: [8]; x1: [5]; x2: [0]; x3: [0]; ... } Das Programm berechnet die Additionsfunktion auf natürlichen Zahlen: f(m, n) = m + n 84 Berechenbarkeit Definition: Eine Funktion f: N N heißt LOOP-/WHILE-berechenbar, gdw gilt: Es gibt ein LOOP-/WHILE-Programm mit der Eigenschaft: AZ: Die Variable x1 enthält den Ausgangswert: {x0: [0]; x1: [n]; x2: [0]; x3: [0]; ... } ZZ: Fall 1: f(n) ist definiert: Die Ausführung des Programms endet und x0 enthält den Ergebniswert. {x0: [f(n)]; x1: [...]; x2: [...]; x3: [...]; ... } Fall 2: f(n) ist undefiniert: Die Ausführung des Programms endet nicht. Analog für f: N x N x ... x N N 85 Aufgabe Entwickeln Sie ein LOOP-Programm / WHILE-Programm zur Berechnung der Verdopplungsfunktion / Multiplikationsfunktion. Testen Sie das jeweilige Programm mit einer entsprechenden Python-Implementierung. 86 Aufgabe Welche Funktion wird durch das folgende WHILE-Programm berechnet? x0 := x1; WHILE x2 0 DO x0 := x0 + 1 END Gibt es Funktionen, die mit keinem LOOP-Programm berechnet werden können? 87 Ergebnisse Satz: Die folgenden Funktionen sind WHILE-berechenbar: f(n) = 2n f(m, n) = m + n f(m, n) = IF(mn, m-n, ) f(m, n) = mn ... Satz: Es gibt Funktionen f: N x N x ... x N N, die WHILE-berechenbar, aber nicht LOOP-berechenbar sind. Die Ausführung jedes LOOP-Programms endet immer. Ein WHILEProgramm kann dagegen eine Endlosschleife enthalten. x0 := x1; WHILE x2 0 DO x0 := x0 + 1 END 88 Äquivalenzsatz Satz: Eine Funktion f: N x N x ... x N N ist WHILE-berechenbar gdw sie Registermaschinen-berechenbar ist. Bemerkungen zum Beweis: Der Beweis wird konstruktiv geführt. Man konstruiert zu jeder Registermaschine ein entsprechendes WHILE-Programm und umgekehrt zu jedem WHILE-Programm eine entsprechende Registermaschine. 89 Zuordnungsorientierte Modelle Grundidee: Man beschreibt die berechenbaren E/A-Zuordnungen wie folgt: Einige einfache Grundfunktionen werden als „berechenbar“ erklärt. Des weiteren werden einige einfache Konstruktionsprinzipien angegeben, die beschreiben, wie man aus „berechenbaren Funktionen“ weitere „berechenbare Funktionen“ erhält. Die zentrale Konstruktionsoperation ist dabei die Rekursion. Eingaben Verarbeitungsanweisungen “Prozessor” Ausgaben Maschinenorientierter Ansatz: Präzisierung des Prozessors Anweisungsorientierter Ansatz: Präzisierung der zulässigen Anweisungen Zuordnungsorientierter Ansatz: Präzisierung der E/A-Zuordnungen Beispiele: primitiv rekursive Funktionen, partiell rekursive Funktionen 90 Rekursive Berechnungsschemata Beispiel: Addition natürlicher Zahlen add(x,0) = x add(x,s(y))= s(add(x,y)) Beispiel: Berechnung einer Addition add(3,2) = s(add(3,1)) = s(s(add(3,0))) = s(s(3)) = s(4) = 5 Bemerkungen: Die Nachfolgerfunktion s: N N, die jeder natürlichen Zahl ihren direkten Nachfolger zuordnet, wird als gegebene berechenbare Funktion betrachtet. Die Funktion add: N x N N, die je zwei natürlichen Zahlen ihre Summe zuordnen soll, wird rekursiv festgelegt: - Zunächst wird der Rekursionsanfang „addiere zur Zahl x die Zahl 0“ festgelegt. - Anschließend wird der Fall „addiere zur Zahl x den Nachfolger s(y) einer Zahl y“ auf den Fall „addiere zu x die Zahl y“ rekursiv reduziert. Bei der Festlegung werden hier die Konstruktionsoperationen „Rekursion“ und „Funktionskomposion“ und die Grundfunktion „s“ benutzt. 91 Implementierung mit Python Beispiel: Addition natürlicher Zahlen add(x,0) = x add(x,s(y))= s(add(x,y)) Beispiel: Berechnung einer Addition add(3,2) = s(add(3,1)) = s(s(add(3,0))) = s(s(3)) = s(4) = 5 Implementierung def s(x): return x+1 def p(x): return x-1 def add(x, y): if y == 0: return x else: return s(add(x, p(y))) >>> add(3, 2) 5 92 Aufgabe Entwickeln Sie rekursive Berechnungsschemata für die folgenden Funktionen. Benutzen Sie nur die vorgegebene Nachfolgerfunktion s und bereits definierte Funktionen (wie add). mult(x, y) Beschreibt die übliche Multiplikation natürlicher Zahlen fakt(x) Beschreibt die Fakultätsfunktion: f(0) = 1, f(1) = 1, f(2) = 2*1, f(3) = 3*2*1, ... exp(x, y) Beschreibt die Potenzbildung für natürliche Zahlen, d. h.: exp(2, 3) = 23 93 Aufgabe Untersuchen Sie die folgenden rekursiven Berechnungsschemata und beschreiben Sie die jeweils berechneten Funktionen. test(0)=1 test(s(x))=0 pred(0)=0 pred(s(x))=x subtr(x,0)=x subtr(x,s(y))=pred(subtr(x,y)) absdiff(x,y)=add(subtr(x,y),subtr(y,x)) equal(x,y)=test(absdiff(x,y)) 94 Aufgabe Welche Berechnungsschemata sind korrekt, sinnvoll? subtr2(x, 0) = x subtr2(0, y) = y subtr2(s(x), s(y)) = subtr2(x, y) subtr3(x, 0) = x subtr3(0, y) = y subtr3(x, y) = subtr3(s(x), s(y)) add2(x, 0) = x add2(x,y)= add(s(x),pred(y))) 95 Primitive Rekursion Beispiel für ein primitives Reduktionsschema: add(x,0) = x add(x,s(y))= s(add(x,y)) Verallgemeinerung f(x1,...,xn,0) = g(x1,...,xn) f(x1,...,xn,s(y)) = h(x1,...,xn,y,f(x1,...,xn,y)) Rekursionsanfang: Die Funktion f kommt nicht auf der rechten Seite vor. Rekursionsschritt: Die Funktion f kommt auf der rechten Seite vor, ein Argument wird dabei um 1 reduziert. 96 Primitiv rekursive Funktionen Definition: Eine Funktion f: N x ... x N N heißt primitiv rekursiv, gdw gilt: Die Funktion f lässt sich mit Hilfe der Nachfolgerfunktion s als Grundfunktion sowie Funktionskomposition und primitiver Rekursion als Konstruktionsoperationen berechnen. Satz: Die folgenden Funktionen sind primitiv rekursiv: f(n) = 2n f(m, n) = m + n f(m, n) = mn ... 97 Aufgabe Testen Sie das folgende rekursive Berechnungsschemata zur sogenannten Ackermann-Funktion. Was beobachtet man, wenn die Parameter (insbesondere der zweite) nicht sehr klein gewählt werden? Ack(0,y)=s(y) Ack(s(x),0)=Ack(x,1) Ack(s(x),s(y))=Ack(x,Ack(s(x),y)) 98 Ackermann-Funktion Rekursive Definition: Ack(0,y)=s(y) Ack(s(x),0)=Ack(x,1) Ack(s(x),s(y))=Ack(x,Ack(s(x),y)) Beachte: Es handelt sich hier nicht um ein primitiv rekursives Rekursionsschema. Satz: Die Ackermann-Funktion ist nicht primitiv rekursiv. Bemerkung: Man muss zeigen, dass die Ackermannfunktion sich nicht mit Hilfe eines primitiv rekursiven Rekursionsschemas darstellen lässt. Zum Beweis zeigt man, dass die Ackermann-Funktion schneller wächst als jede primitiv rekursive Funktion. 99 Aufgabe Wir betrachten die folgende informell definierte Funktion. Berechnen Sie f(5, 2) und f(2, 5). Beschreiben Sie das Verhalten der Funktion f. f(x, y) = „das kleinste z mit y+z=x“ 100 Primitiv rekursive Funktionen Definition: Eine Funktion f: N x ... x N N heißt partiell rekursiv, gdw gilt: Die Funktion f lässt sich mit Hilfe der Nachfolgerfunktion s als Grundfunktion sowie Funktionskomposition, primitiver Rekursion und dem „das kleinste“-Operator als Konstruktionsoperationen berechnen. Satz: Die Ackermann-Funktion ist partiell rekursiv. Beweis: siehe Fachliteratur 101 Äquivalenzsatz Satz: Eine Funktion f: N x N x ... x N N ist primitiv rekursiv gdw sie LOOPberechenbar ist. Eine Funktion f: N x N x ... x N N ist partiell rekursiv gdw sie WHILEberechenbar ist. Beweis: siehe Fachliteratur 102 Zusammenfassung Satz (Äquivalenz von Berechnungsmodellen): Gegeben sei eine Funktion f: N x N x ... x N N. Die folgenden Aussagen sind äquivalent: - f ist Turingmaschinen-berechenbar. - f ist Registermaschinen-berechenbar. - f ist WHILE-berechenbar, - f ist partiell rekursiv. - f ist Pascal-berechenbar. - ... Zusammenfassung 103 Alle bisher gewählten Ansätze zur Präzisierung der "Grundidee Computer" führen auf dieselbe Klasse berechenbarer Funktionen. Eingaben Verarbeitungsanweisungen “Prozessor” Ausgaben Maschinenorientierter Ansatz: Präzisierung des Prozessors Anweisungsorientierter Ansatz: Präzisierung der zulässigen Anweisungen Zuordnungsorientierter Ansatz: Präzisierung der E/A-Zuordnungen 104 Church-Turing-These These: Die Klasse der im intuitiven Sinn berechenbaren Funktion ist genau die Klasse der Turingmaschinen-berechenbaren Funktionen bzw. die Klasse der partiell rekursiven Funktionen bzw. die Klasse der WHILE-berechenbaren Funktionen bzw. ... Was leistet das Berechnungsmodell "Turingmaschine" / "Python-programmierbar" / ...? Es soll die „Idee Computer“ erfassen, d. h. es kann Problemlösungen (in geeignet beschriebener Form) selbstständig ausführen (z. B. sortieren) es kann Rechenoperationen ausführen (z. B. Addieren) es ist universell programmierbar in dem Sinn, dass es beliebige Programme bei beliebigen Daten ausführen kann es ist so mächtig, dass es alle Algorithmen (in geeignet kodierter Form) ausführen kann Anwendung: Oben wurde gezeigt, dass das Halteproblem nicht Python-entscheidbar ist. Mit der Church-Turing-These ergibt sich hieraus, dass das Halteproblem algorithmisch nicht entscheidbar ist. 105 Teil 6 Grenzen der Berechenbarkeit Problem 106 Ist jede Funktion f: N N (Turingmaschinen-) berechenbar? ? Menge der Funktionen von N nach N n prim(n) n 2n n s(n) ? Menge der berechenbaren Funktionen von N nach N Abzählverfahren 107 Es gibt nur endlich viele Turingmaschinen mit 1 Zustand. Diese können der Reihe nach abgezählt (durchnummeriert) werden. 0 Z000 ' ' ' ' R Z000 Z000 'I' ' ' R Z000 1 Z000 ' ' ' ' L Z000 Z000 'I' ' ' L Z000 2 Z000 ' ' ' ' S Z000 Z000 'I' ' ' S Z000 3 Z000 ' ' 'I' R Z000 Z000 'I' ' ' R Z000 4 Z000 ' ' 'I' L Z000 Z000 'I' ' ' L Z000 ... Aufgabe 108 Ergänzen Sie die begonnene Abzählung um weitere Turingmaschinen mit genau einem Zustand. Wie viele gibt es insgesamt? 0 Z000 ' ' ' ' R Z000 Z000 'I' ' ' R Z000 1 Z000 ' ' ' ' L Z000 Z000 'I' ' ' L Z000 2 Z000 ' ' ' ' S Z000 Z000 'I' ' ' S Z000 3 Z000 ' ' 'I' R Z000 Z000 'I' ' ' R Z000 4 Z000 ' ' 'I' L Z000 Z000 'I' ' ' L Z000 ... Abzählverfahren 109 Es gibt nur endlich viele Turingmaschinen mit 2 Zuständen. Diese können ebenfalls der Reihe nach abgezählt werden. 0 Z000 Z000 Z001 Z001 ... ' ' 'I' ' ' 'I' ' ' ' ' ' ' ' ' R R R R Z000 Z001 Z000 Z000 Abzählverfahren 110 Die gesamte Menge der Turingmaschinen kann abgezählt werden, indem man zunächst die mit 1 Zustand durchnummeriert, dann die mit 2 Zuständen u.s.w.. 0 Z000 ' ' ' ' R Z000 Z000 'I' ' ' R Z000 1 Z000 ' ' ' ' L Z000 Z000 'I' ' ' L Z000 .. ... 36 Z000 Z000 Z001 Z001 ... ' ' 'I' ' ' 'I' ' ' ' ' ' ' ' ' R R R R Z000 Z001 Z000 Z000 111 Abzählbarkeit Definition: Eine Menge M heißt abzählbar genau dann, wenn es eine Abbildung von den natürlichen Zahlen N in M gibt, bei der alle Elemente aus M als Bildelemente natürlicher Zahlen erfasst werden. D. h., die Elemente von M können durchnummeriert werden. Alle Elemente aus M müssen bei der Nummerierung erfasst werden. Wiederholungen sind bei der Nummerierung zugelassen. Satz: Die Menge der Turingmaschinen (über dem Eingabealphabet {'I'}) ist abzählbar. D. h., die Turingmaschinen lassen sich durchnummerieren: T0; T1; T2; ... Abzählverfahren 112 Wir streichen jetzt alle Turingmaschinen, die keine Funktion f: N N berechnen. Die verbleibenden Turingmaschinen entsprechen genau den Turing-berechenbaren Funktionen. 0 Z000 ' ' ' ' R Z000 Z000 'I' ' ' R Z000 f0: n 1 Z000 ' ' ' ' L Z000 Z000 'I' ' ' L Z000 f1: n 2 Z000 ' ' ' ' S Z000 Z000 'I' ' ' S Z000 f2: 0 0 n n-1 (n > 0) .. ... ... x Z000 Z000 Z001 Z001 ' ' 'I' ' ' 'I' ' ' 'I' ' ' ' ' R R R S Z000 Z001 Z000 Z000 Keine Funktion Abzählbarkeit 113 Satz: Die Menge der Turingmaschinen-berechenbaren Funktion f: N N ist abzählbar. ? Menge der Funktionen von N nach N f0, f1, f2, f3, ... ? Menge der berechenbaren Funktionen von N nach N Existenz nicht-berechenbarer Funktionen 114 Definition einer neuen Funktion f: N N f(0) = f0(0)+1, falls f0(0) definiert ist, sonst f(0) = 0 f f0 f(1) = f1(1)+1, falls f1(1) definiert ist, sonst f(1) = 0 f f1 f(2) = f2(2)+1, falls f2(2) definiert ist, sonst f(2) = 0 f f2 f(3) = f3(3)+1, falls f3(3) definiert ist, sonst f(3) = 0 f f3 ... ... f(n) = fn(n)+1, falls fn(n) definiert ist, sonst f(n) = 0 f f0 ... ... Die Funktion f: N N unterscheidet sich von allen berechenbaren Funktionen, kann also selbst nicht berechenbar sein. 115 Existenz nicht-berechenbarer Funktionen Satz: Es gibt Funktionen f: N N, die nicht (Turingmaschinen-) berechenbar sind. f Menge der Funktionen von N nach N f0, f1, f2, f3, ... ? Menge der berechenbaren Funktionen von N nach N 116 Existenz nicht-berechenbarer Funktionen Ziel ist es, eine nicht-berechenbare Funktion konkret zu beschreiben. Rado´sche -Funktion Menge der Funktionen von N nach N f0, f1, f2, f3, ... ? Menge der berechenbaren Funktionen von N nach N Biber-Turingmaschinen 117 Eine Biber-TM ist eine eindimensionale TM, die in jedem Arbeitsschritt genau eine "Baumaktion" durchführt (Baumstamm hinlegen oder wegnehmen) und einen Schritt nach rechts oder links geht. Eine Biber-TM startet in einer leeren Welt, erzeugt „Baumstämme“ und hält nach endlich vielen Arbeitsschritten. Vorher: Biber-TM: Nachher: 118 Aufgabe Biberwettbewerb: Gesucht ist eine Biber-TM mit genau 2 Zuständen (außer dem Stop-Zustand), die möglichst viele Baumstämme erzeugt, bevor sie hält. Eine solche TM heißt „fleißiger Biber“ (mit 2 Zuständen) bzw. „busy beaver TM“. Gesucht ist eine Biber-TM mit genau 3 (bzw. 4) Zuständen (außer dem Stop-Zustand), die möglichst viele Baumstämme erzeugt, bevor sie hält. Eine solche TM heißt „fleißiger Biber“ (mit 3 bzw. 4 Zuständen) bzw. „busy beaver TM“. Fleißige Biber 119 Fleißiger Biber mit 2 Zuständen: alter Zustand gelesenes Zeichen geschrieb. KopfZeichen bewegung neuer Zustand Z0 Z0 I ' ' I I L R Z1 Z1 Z1 Z1 I ' ' I I S L Z0 Z0 Fleißiger Biber mit 3 Zuständen: alter Zustand gelesenes Zeichen geschrieb. KopfZeichen bewegung neuer Zustand Z0 Z0 I ' ' I I L R Z2 Z1 Z1 Z1 I ' ' I I S L Z1 Z0 Z2 Z2 I ' ' I I S L Z2 Z1 120 Rado´sche Σ-Funktion Definition (Tibor Rado, 1962): Die Funktion : N N ist wie folgt festgelegt: (n) bezeichne die maximale Anzahl von Baumstämmen, die eine Biber-TM mit genau n Zuständen (außer dem Stop-Zustand) erzeugen kann. n (n) 0 0 1 1 2 4 3 6 4 13 5 4098 6 95524079 ... ... 121 Satz von Rado Satz Die Rado´sche -Funktion ist nicht Turingmaschinen-berechenbar. Beweis: Der Beweis benutzt die folgenden (leicht zu zeigenden) Eigenschaften der -Funktion: (n) n für alle n N, (n) < (n+1) für alle n N (Monotonie von ). Der Beweis wird durch Widerspruch geführt. Annahme: Es gibt eine Turingmaschine T, mit der berechnet werden kann. Die Anzahl der Zustände von T bezeichnen wir mit k. T : I I z0 ZZ: I AZ: I I I 122 Satz von Rado Man zeigt zunächst, dass es eine Turingmaschine Tn mit n+1 Zuständen (außer dem Stop-Zustand) gibt, der auf einem leeren Band eine Baumstammreihe mit genau n Baumstämmen erzeugt: AZ: T2: z0 ZZ: I I Man zeigt anschließend, dass es eine Turingmaschine TV mit 6 Zuständen (außer dem Stop-Zustand) gibt, der eine gegebene, beliebig lange Baumstammreihe verdoppelt: AZ: I TV: z0 ZZ: I I I I I 123 Satz von Rado Wir verknüpfen die 3 Turingmaschinen jetzt wie folgt zu einer neuen Turingmaschine Tn,V, : z0 AZ: T n: erzeugt eine Baumstammreihe der Länge n ZZ: I TV: erzeugt eine Baumstammreihe der Länge 2n ZZ: I T : ZZ: I I I I erzeugt eine Baumstammreihe der Länge (2n) I I I I I I I I ... Beachte: Tn,V, hat n+7+k Zustände und erzeugt eine Baumstammreihe der Länge (2n). 124 Satz von Rado Wir vergleichen jetzt diese zusammengesetzte Turingmaschine Tn,V, mit einem fleißigen Biber TFB(n+7+k) mit n+7+k Zuständen: Tn,V, hat n+7+k Zustände und erzeugt (2n) Baumstämme. TFB(n+7+k) hat n+7+k Zustände und erzeugt (n+7+k) Baumst Da ein fleißiger Biber die maximal mögliche Anzahl von Baumstämmen erzeugt, gilt (für alle n N): (n+7+k) (2n). Sei n = 2(7+k). Dann gilt: n+7+k = 3(7+k) 2n = 4(7+k), also n+7+k < 2n. Aus der Monotonie von folgt: (n+7+k) < (2n). Es ergibt sich also ein Widerspruch. Da alle Schlüsse korrekt sind, muss die Annahme falsch sein. 125 Entscheidbarkeit Definition: Eine Sprache über einem Alphabet heißt (Turing-) entscheidbar, wenn es einen Algorithmus (als Turingprogramm) gibt, der für jedes Wort über dem Alphabet feststellt, ob es zur Sprache gehört. Nicht-entscheidbaren Probleme (bzw. deren zugehörige Sprachen): Halteproblem: Kann man mit einem Algorithmus entscheiden, ob ein beliebiger Algorithmus bei der Bearbeitung von Daten hält? Korrektheitsproblem: Kann man mit einem Algorithmus entscheiden, ob ein beliebiger Algorithmus korrekt bzgl. einer Spezifikation ist? Wahrheitsproblem: Kann man mit einem Algorithmus entscheiden, ob eine beliebige mathematische Aussage wahr ist. Diophantische Gleichungen: Kann man mit einem Algorithmus entscheiden, ob eine beliebige Polynomgleichung (in der verschiedene Variablen mit verschiedenen Exponenten vorkommen können) mit ganzzahligen Koeffizienten eine ganzzahlige Lösung hat? Semi-Entscheidbarkeit 126 Definition: Eine Sprache über einem Alphabet heißt semientscheidbar, wenn es einen Algorithmus gibt, der für jedes Wort über dem Alphabet, das zur Sprache gehört, dies auch mitteilt. Algorithmus zur Lösung Diophantischer Gleichungen: Eingabe: Gleichung; z. B.: x3 + 5x2y2z – xz + 37 = 0 Probiere systematisch alle möglichen Belegungen der in der Gleichung vorkommenden Variablen aus, ob sie die Gleichung erfüllen. Stoppe, wenn eine passende Belegung gefunden wurde. Im Beispiel: x= x= x= x= ... x= 0; 1; -1; 0; y y y y = = = = 0; 0; 0; 1; 1; y = 2; z z z z = = = = 0: 0: 0 0 z = -2 nein nein nein nein ja Ausgabe: Lösbarkeit; im Beispiel: ja Beachte: Der Algorithmus liefert nur in den Fällen, in denen eine Lösung existiert, ein positives Ergebnis, in anderen Fällen hält er nicht. 127 Teil 7 Ein Blick in die Geschichte 128 David Hilbert 129 Hilbert´s Rede Wer von uns würde nicht gern den Schleier lüften, unter dem die Zukunft verborgen liegt, um einen Blick zu werfen auf die bevorstehenden Fortschritte unsrer Wissenschaft und in die Geheimnisse ihrer Entwickelung während der künftigen Jahrhunderte! Welche besonderen Ziele werden es sein, denen die führenden mathematischen Geister der kommenden Geschlechter nachstreben? welche neuen Methoden und neuen Thatsachen werden die neuen Jahrhunderte entdecken - auf dem weiten und reichen Felde mathematischen Denkens? Die Geschichte lehrt die Stetigkeit der Entwickelung der Wissenschaft. Wir wissen, daß jedes Zeitalter eigene Probleme hat, die das kommende Zeitalter löst oder als unfruchtbar zur Seite schiebt und durch neue Probleme ersetzt. Wollen wir eine Vorstellung gewinnen von der muthmaßlichen Entwickelung mathematischen Wissens in der nächsten Zukunft, so müssen wir die offenen Fragen vor unserem Geiste passiren lassen und die Probleme überschauen, welche die gegenwärtige Wissenschaft stellt, und deren Lösung wir von der Zukunft erwarten. Zu einer solchen Musterung der Probleme scheint mir der heutige Tag, der an der Jahrhundertwende liegt, wohl geeignet; denn die großen Zeitabschnitte fordern uns nicht blos auf zu Rückblicken in die Vergangenheit, sondern sie lenken unsere Gedanken auch auf das unbekannte Bevorstehende. [...] 130 Hilbert´s Rede 2. Die Widerspruchslosigkeit der arithmetischen Axiome Wenn es sich darum handelt, die Grundlagen einer Wissenschaft zu untersuchen, so hat man ein System von Axiomen aufzustellen, welche eine genaue und vollständige Beschreibung derjenigen Beziehungen enthalten, die zwischen den elementaren Begriffen jener Wissenschaft stattfinden. Die aufgestellten Axiome sind zugleich die Definitionen jener elementaren Begriffe und jede Aussage innerhalb des Bereiches der Wissenschaft, deren Grundlagen wir prüfen, gilt uns nur dann als richtig, falls sie sich mittelst einer endlichen Anzahl logischer Schlüsse aus den aufgestellten Axiomen ableiten läßt. Bei näherer Betrachtung entsteht die Frage, ob etwa gewisse Aussagen einzelner Axiome sich untereinander bedingen und ob nicht somit die Axiome noch gemeinsame Bestandteile enthalten, die man beseitigen muß, wenn man zu einem System von Axiomen gelangen will, die völlig von einander unabhängig sind. Vor Allem aber möchte ich unter den zahlreichen Fragen, welche hinsichtlich der Axiome gestellt werden können, dies als das wichtigste Problem bezeichnen, zu beweisen, daß dieselben untereinander widerspruchslos sind, d.h. daß man auf Grund derselben mittelst einer endlichen Anzahl von logischen Schlüssen niemals zu Resultaten gelangen kann, die miteinander in Widerspruch stehen. [...] 131 Hilbert´sches Programm Hilbert´sches Programm: Formalisierung der Mathematik Widerspruchsfreiheit: Die Formalisierung soll widerspruchsfrei sein (d. h.: keine zwei sich ausschließenden Aussagen können hergeleitet werden). Vollständigkeit: Jede wahre mathematische Aussage kann hergeleitet werden. Entscheidbarkeit: Es gibt ein Verfahren, mit dem man für jede beliebige Aussage in endlich vielen Schritten entscheiden kann, ob sie wahr oder falsch ist. 132 Hilbert´sches Programm Hilbert´sches Programm: Formalisierung der Mathematik Widerspruchsfreiheit: Die Formalisierung soll widerspruchsfrei sein (d. h.: keine zwei sich ausschließenden Aussagen können hergeleitet werden). Vollständigkeit: Jede wahre mathematische Aussage kann hergeleitet werden. Entscheidbarkeit: Es gibt ein Verfahren, mit dem man für jede beliebige Aussage in endlich vielen Schritten entscheiden kann, ob sie wahr oder falsch ist. Das Hilbert´sche Entscheidungsproblem verlangt den Nachweis, dass es einen Algorithmus gibt, mit dessen Hilfe man die Wahrheit mathematischer Aussagen "berechnen" kann. 133 Ergebnisse von Gödel Gödelsche Unvollständigkeitssätze (1931) In jedem formalen System, das widerspruchsfrei ist, existieren Aussagen, die wahr sind, aber innerhalb des Systems nicht hergeleitet werden können. Das bedeutet, es bleiben immer wahre Aussagen übrig, die nicht herleitbar sind. Wenn ein formales System widerspruchsfrei ist, dann kann man innerhalb des Systems nicht herleiten, dass es widerspruchsfrei ist. Widerspruchsfreiheit: Die Formalisierung soll widerspruchsfrei sein (d. h.: keine zwei sich ausschließenden Aussagen können hergeleitet werden). Vollständigkeit: Jede wahre mathematische Aussage kann hergeleitet werden. Entscheidbarkeit: Es gibt ein Verfahren, mit dem man für jede beliebige Aussage in endlich vielen Schritten entscheiden kann, ob sie wahr oder falsch ist. 134 Ergebnisse von Church und Turing Church / Turing (1936) Es gibt kein Verfahren, mit dem man für jede beliebige Aussage in endlich vielen Schritten entscheiden kann, ob sie ableitbar ist oder nicht. Widerspruchsfreiheit: Die Formalisierung soll widerspruchsfrei sein (d. h.: keine zwei sich ausschließenden Aussagen können hergeleitet werden). Vollständigkeit: Jede wahre mathematische Aussage kann hergeleitet werden. Entscheidbarkeit: Es gibt kein Verfahren, mit dem man für jede beliebige Aussage in endlich vielen Schritten entscheiden kann, ob sie wahr oder falsch ist. 135 Ergebnisse von Church und Turing Church / Turing (1936) Es gibt kein Verfahren, mit dem man für jede beliebige Aussage in endlich vielen Schritten entscheiden kann, ob sie ableitbar ist oder nicht. Um nachzuweisen, dass es keinen Algorithmus zur Entscheidung über den Wahrheitsgehalt mathematischer Aussagen gibt, musste zunächst präzisiert werden, was ein Algorithmus ist. Turing führte zu diesem Zweck die später nach ihm benannte Turingmaschine ein, Church entwickelte unabhängig hiervon eine zuordnungsbasierte Präzisierung. Beide Präzisierungen wurden später als gleichwertig erkannt. Interessant ist in diesem Zusammenhang auch, dass die "Idee Computer" präzisiert wurde, bevor die ersten praktikablen Computer gebaut wurden. 136 Ein Blick über den Zaun Informatik: Methode: Ein Problem mit Hilfe eines Algorithmus lösen. Grenze der Methode: Das Entscheidungsproblem (... Halteproblem ...) ist algorithmisch nicht lösbar. (Turing) Mathematik: Methode: Einen Satz beweisen. Grenze der Methode: In jedem formalen System, das widerspruchsfrei ist, existieren Aussagen, die wahr sind, aber innerhalb des Systems nicht hergeleitet werden können. Das bedeutet, es bleiben immer wahre Aussagen übrig, die nicht beweisbar sind. (Gödel) Physik: Methode: Eigenschaften eines Systems messen. Grenze der Methode: Man kann Ort und Impuls eines Teilchens nicht gleichzeitig exakt bestimmen. (Heisenberg) 137 Literaturhinweise U. Schöning: Theoretische Informatik – kurzgefasst. Spektrum Akademischer Verlag 2001. Gasper, Leiß, Spengler, Stimm: Technische und theoretische Informatik. Bayerischer Schulbuch-Verlag 1992. Reichert, Nievergelt, Hartmann: Programmieren mit Kara. Springer-Verlag 2004. D. Harel: Das Affenpuzzle und weitere bad news aus der Computerwelt. Springer-Verlag 2002. J. Casti: Das Cambridge Quintett. Berlin Verlag 1998. D. R. Hofstadter: Gödel, Escher, Bach. Klett-Cotta 1985.