29
Das Halteproblem

Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Embed Size (px)

Citation preview

Page 1: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Das Halteproblem

Page 2: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig

vorgegebene Eingabe E entscheiden kann, ob das Programm R für dieses E

anhält oder nicht (d.h. sich in einer Endlosschleife befindet)?

Page 3: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Dann könnte man ein Programm schreiben, das von einem beliebigen

Programm feststellen kann, ob es eine Endlosschleife besitzt.

Page 4: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Antwort:Es gibt keinen Algorithmus,

der diese Aufgabe lösen kann!

Page 5: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Frage:Kann man erkennen, ob ein Programm abstürzt (d.h. eine Endlosschleife besitzt), indem man das Programm laufen lässt (startet)?

Page 6: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Antwort:Nein, da man selbst nach1 000 000 000 000 000 000 000 000 Jahren Laufzeit nicht entscheiden kann, ob das Programm eine Sekunde später doch anhält.Es wird eine CPU vorausgesetzt, die unendlich viel Speicher ansprechen kann.

Page 7: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Beweis (indirekt):D.h. wir nehmen an, dass es so einen Algorithmus gibt und zeigen, dass dies zu einem Widerspruch führt.

Page 8: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Zuerst aber ein paar Definitionen und Bezeichnungen...

Page 9: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

1) Ein mögliches Programm (eventuell mit Eingabe) besteht aus einer Nullen/Einsenfolge des Programms und einer Nullen/Einsenfolge der Eingabe. Ein tatsächliches Programm besteht genauso aus einer Nullen/Einsenfolge und kann von der CPU ausgeführt werden (weil die Nullen und Einsen als Maschinenbefehle interpretiert werden). 2) Die Länge eines Programms P ist anschaulich die Größe der ausführbaren exe-Datei und wird mit | P | bezeichnet

Page 10: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

3) Es wird eine CPU vorausgesetzt, die unendlich viel Speicher ansprechen kann.  4) Eine positive Zahl n, die man als Dualzahl abspeichert braucht trunc(log2 n) + 1

SpeicherplatzDie Zahl 9 dual dargestellt ist:1001 und belegt 4 Stellen.trunc(log2 9) + 1 = trunc (3.17) + 1 = 3 + 1 = 4

Bemerkungen: trunc bedeutet truncate (deutsch abschneiden des Nachkommateils).Statt log2 n schreibt man hier auch ld n (d wie dual oder binär).

Page 11: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Aufgabe: Zählen Sie die möglichen Programme mit maximaler Länge 10 auf.Wie viele gibt es ?

Page 12: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Antwort:0100011011...0000000000...1111111111 Es gibt 211 - 2 Programme (allgemein: 2n+1-2)

Page 13: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Zurück zu unserem "Beweis":Wir nehmen an, dass es so einen Algorithmus gibt und nennen ihn den Halt-Algorithmus.

Page 14: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Halt-Algorithmus

Dualzahl D

D ist ein/kein Programm.D hält an/ hält nicht an.

Halt-Algorithmus wird mit einer Dualzahl "gefüttert"

Halt-Algorithmus "spuckt aus", ob

diese Eingabe ein Programm ist und

wenn ja, ob es anhält.

Page 15: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Wir basteln nun Programme X_1, X_2, X_3, ... , X_n, ... die u.a. den Halt-Algorithmus als "Unterprogramm" enthalten. Wir nehmen nun ein beliebiges Programm X_n, das folgendes macht:

Page 16: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Halt-Algorithmus

0 Jage alle möglichen Programme P, die keine Eingabe und maximale Länge n

haben (also max. 2^(n+1)-2) Programme durch den Halt-Algorithmus. Wie sieht

das kleinste, bzw. größte aus?

1

...

111...111

P1 P2 ... ... ... Pm

n-mal

Speichere alle tatsächlichen, und dazu noch anhaltenden

Programme in der Datei1 ab.

Starte diese anhaltenden Programme und speichere die

Ausgaben in der Datei2 ab.A1 A2 Am.........

Füge an das Ende der Datei2 die Zeichenkette "MS"

(steht für Microschrott) an.

MS

Die Länge der Datei2 bezeichnen wir nun mit b.

Damit haben wir den Algorithmus (=Programm) X_n vorgestellt.

Page 17: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Halt-Algorithmus

0

1

...

111...111

P1 P2 ... ... ... Pm

n-mal

A1 A2 Am......... MS

Bemerkung:X_n hat keine Eingabe (über Tastatur)

Nebenbei: Die Zeichenkette "MS" hat die Länge 2.

Page 18: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Warum muss der Algorithmus (Programm) X_n anhalten?

Page 19: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Wir überlegen uns dazu, wo theoretisch eine Endlosschleife auftreten könnte.

Page 20: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Halt-Algorithmus

0 Beim "Durchjagen" der 2^(n+1)-2 Programme durch den Halt-Algorithmus kann keine Endlosschleife auftreten, da

der Halt-Algorithmus anhält.

1

...

111...111

P1 P2 ... ... ... Pm

Keines der Programme aus Datei1, die alle

hintereinander gestartet wurden, kann endlos laufen,

da diese Programme (laut Voraussetzung) anhalten.

A1 A2 Am......... MS

Page 21: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Frage:

Gilt | X_n | <= n

wobei mit | X_n | die Programmlänge bezeichnet wird

Page 22: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Annahme: Es gilt| X_n | <= n

Page 23: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Was folgt daraus?Denken Sie an eine Selbstbezüglichkeit, wie etwa eine Kamera die "alles" aufnimmt, auch sich selbst (wie sie gerade photografiert).

Page 24: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Da |X_n| <= n gilt, muss sich das Programm unter den Programmen befinden, die durch den Halt-Algorithmus gejagt werden!!! Für z.B. n = 8 könnte X_n z.B. wie folgt aussehen:X_n = 10101010

Page 25: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Halt-Algorithmus

0 Es wird also u.a. auch X_n selbst durch den Halt-Algorithmus (hier wird z.B. n=8 angenommen). gejagt. Was passiert, wenn X_n durch den Halt-Algorithmus gejagt

wird?

...10101010

11111111

P1 P2 ... X_n ... Pm

Da X_n anhält (siehe frühere Folie), muss X_n in der Datei1

abgespeichert werden.

A1 A2 Am...... MS

...

X_n

Frage: Was gibt aber X_N aus, wenn es gestartet wird?

A1 A2 ... ... ... Am MS

Die Datei2!Hier nochmals anders

dargestellt...

Page 26: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

A1 A2 ... ... Am MS

A1 A2 ... ... ... Am MS

A1 A2 ... A1 A2 ... ... ... Am MS ... Am MS

Dies anders dargestellt ergibt:

Diese Länge ist aber b.

Die Datei2 hat also mindestens die Länge b+2 (weil am Ende ja noch MS steht).

Dies ist ein Widerspruch zur Aussage: "Datei2 hat die Länge b".

Also ist die Annahme: |X_n| <= n falsch. Also gilt: |X_n| > n

Page 27: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Im Programm von X_n müssen die 2^(n+1)-2 möglichen Programme durch den Halt-Algorithmus gejagt werden. Deshalb muss in diesem Programm die Zahl n gespeichert sein.Außerdem ist auch noch der Programmcode gespeichert. Die Länge des Programmcodes ist eine Konstante (man braucht z.B.nur eine begrenzte Menge Papier, um diesen zu notieren).Allerdings benötigt das Notieren der Zahl n (als Dualzahl) einen nicht konstanten Speicherplatz (siehe frühere Folie).

Page 28: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Fassen wir zusammen:|X_n| > n , alson < |X_n|Damit:n < |X_n| = Speicherplatz für n + Speicherplatz für ProgrammcodeEtwas formaler:n < |X_n| = trunc (ld n) + 1 + Konstante

Dafür führen wir die Bezeichnung k ein.

also:n < trunc (ld n) + k

also:n < |X_n| = trunc (ld n) + k

Page 29: Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden

Da trunc (ld n) <= ld n gilt:n < trunc (ld n) + k < = ld n + kAlso gilt:n < ld n + kAlso gilt:n - ld n < k

Betrachten Sie im Display des Taschenrechners die Werte von n – ld n für immer größer werdende n.

Da n – ld n "für große n gegen unendlich strebt", wird n – ld n ab einem bestimmten n größer als die Konstante k. Dies ist ein Widerspruch.

Also ist die Annahme: "Es gibt diesen Halt-Algorithmus ..." falsch!!!