Damit wurde Alan Turing berühmt: Die Lösung des “Halteproblems”. EIn Nachtrag zu Turings hundertsten Geburtstag (über den ich bereits beim letzten Mal geschrieben habe).

i-9806967bdebf604edd4de83fdd7a4787-turing sw.jpg
Manche Computerberechnungen haben ein Ergebnis, andere laufen ewig weiter. Die Frage, ob es eine eindeutige Methode gibt, schon im Vorhinein zwischen diesen beiden Fällen zu unterscheiden, ist das „Halteproblem”. Alan Turing hat es gelöst.

Das Problem wurde freilich schon formuliert, als es noch lange keine Computer gab. Die Mathematik kannte schließlich auch schon vorher komplizierte Algorithmen – Kombinationen von Rechenregeln, die man nach einem festen Schema abarbeitet, um auf ein Ergebnis zu kommen. In der Schule haben wir zum Beispiel Algorithmen gelernt, mit denen wir große Zahlen per Hand multiplizieren konnten. Ziffer für Ziffer haben wir die Zahlen nach bestimmten Regeln bearbeitet, am Ende kam eine Zahl heraus – im optimalen Fall die richtige.

Das Collatz-Problem

Bei so einem Algorithmus ist es recht leicht zu zeigen, dass er ein Ergebnis haben wird. Es gibt aber auch Algorithmen, die möglicherweise nie auf ein Ende führen. Ein schönes Beispiel für so einen Algorithmus mit ungewissem Ausgang ist das Collatz-Problem: Wir beginnen mit einer beliebigen natürlichen Zahl. Wenn sie gerade ist, teilen wir sie durch zwei. Wenn sie ungerade ist, multiplizieren wir sie mit drei und addieren eins. Mit der Zahl, die wir nun bekommen haben, gehen wir genauso vor.

Beispiel: Wir beginnen mit 7 – ungerade, daher: 3×7+1=22. 22 ist gerade, das führt auf 11. Weiter geht’s mit 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1.

Die Collatz-Vermutung ist, dass man mit diesen Rechenregeln immer bei der 1 landet, egal mit welcher Zahl man beginnt. Doch lässt sich das beweisen? Gibt es eine Methode, die zuverlässig entscheidet, ob meine Rechenregeln auf ein Ende führen werden, oder ich vielleicht auf Zahlen stoße, die mich unendlich im Kreis schicken?

Im Fall des Collatz-Problems fehlt die Antwort noch immer. Alan Turing hat allerdings ganz allgemein gezeigt, dass es keine Rechenvorschrift (heute sagt man meistens: kein Computerprogramm) geben kann, um von beliebigen Rechenprozeduren zu entscheiden, ob sie zu einem Ende kommen werden. Das gelang ihm, indem er die Frage stellte: Was würde geschehen, wenn es ein solches Programm gäbe, und man dieses Programm sich selbst untersuchen ließe?

Wie sich zeigen lässt, führt dieser Gedanke auf einen logischen Widerspruch.
Mehr dazu hier auf www.naklar.at.

i-3fadc23af21e95ced1ae9ed9d78e16ef-fb.jpg

Werden Sie naklar-Fan auf Facebook

Kommentare (10)

  1. #1 Dr. Webbaer
    Juni 25, 2012

    Ergänzend gefragt: Kann man ein Programm schreiben, das die hier erörterte Frage nach der Begrenztheit der Laufzeit beantwortet, aber zuerst eine Prüfung vornimmt, ob das bearbeitete Programm mit dem Prüfprogramm identisch ist und für diesen Fall sofort einen dritten Programm- oder Funktionswert (bspw. “Null”) ausgibt?

  2. #2 Mortimer
    Juni 26, 2012

    @Dr. Webbaer

    Kann man ein Programm schreiben, das die hier erörterte Frage nach der Begrenztheit der Laufzeit beantwortet,

    Man kann ein Programm schreiben, welches einem ausgibt, ob ein anderes Programm bei einer bestimmten Eingabe nach einer vorgegebenen Zeit hält. (Siehe utm/smn-Theoreme)

    ob das bearbeitete Programm mit dem Prüfprogramm identisch ist

    Die Äquivalenz ist leider auch nicht nachweisbar, ebensowenig die Korrektheit.

  3. #3 AndreasM
    Juni 26, 2012

    Man kann ein Programm schreiben, welches einem ausgibt, ob ein anderes Programm bei einer bestimmten Eingabe nach einer vorgegebenen Zeit hält. (Siehe utm/smn-Theoreme)

    Das ist ja auch einfach. Man simuliert das Programm mit der Eingabe für die vorgegebene Zeit und gibt dann zurück, ob es angehalten hat.

  4. #4 Mortimer
    Juni 26, 2012

    Das ist ja auch einfach.

    Genau, die Rechenkisten können nicht mehr als einfach. Dennoch ermöglicht dieses einfache Programm den Beweis eines der wichtigsten Theoreme über Turing Maschinen (Universelle Turingmaschinen Theorem). Auch Rogers Äquivalenzsatz baut letztendlich darauf auf.

  5. #5 Ucuri
    Juni 26, 2012

    @Dr. Webbaer

    Man kann das ganze auch noch etwas formaler und über 2-3 Ecken Beweisen, da braucht man dann die “Selbstanwendung” nichtmehr und kommt trotzdem zu einem Widerspruch.

  6. #6 Kallewirsch
    Juni 27, 2012

    bearbeitete Programm mit dem Prüfprogramm identisch ist und für diesen Fall sofort einen dritten Programm- oder Funktionswert (bspw. “Null”) ausgibt?

    Damit hast du aber die Problemstellung verändert.
    Die originale Problemstellung erlaubt nur 2 Antworten: ‘Hält’ oder ‘Hält nicht’.

  7. #7 AndreasM
    Juni 27, 2012

    @Kallewirsch:
    Die veränderte Problemstellung ist aber auch nicht einfacher, weil es zwar leicht ist, die Identität im Programmtext festzustellen, es aber unendlich viele Programme gibt, die das gleiche Ein-/Ausgabeverhalten haben und es wiederum nicht möglich ist für ein Programm, diese Äquivalenz für alle Programme zu bestimmen.
    Interessanterweise sind alle nichttrivialen semantischen Eigenschaften von Programmen algorithmisch unentscheidbar (Satz von Rice).

    Was natürlich möglich ist, sind Algorithmen, die für manche Programme die Eigenschaft als zutreffend bestimmen, für andere als nicht zutreffend und für den Rest einfach “Weiss nicht” sagt. Häufig werden dabei dann Über- oder Untermengen des Programmverhaltens untersucht, um nicht von der Komplexität erschlagen zu werden.

  8. #8 Frank Wappler
    Juni 27, 2012

    Ergänzend gefragt:
    Kann man ein Programm schreiben, das zu jeder vorgegebenen Zahl n ≥ 0 berechnet, wie viele (aufanderfolgende) Einsen eine “Lazy Weasel”-Turing-Maschine, die n “Operations”-Zustände sowie einen “Halt”-Zustand hat, auf die Felder eines (anfänglich ausschließlich mit Nullen beschriebenen) Bandes schreiben (und daraufhin anhalten) würde?

    Dabei seien die “Lazy Weasel”-Maschinen Bn (unter allen Turing-Maschinen Xn mit jeweils n “Operations”-Zuständen, die eine bestimmte Anzahl k_Xn von aufanderfolgenden Einsen schreiben und daraufhin anhalten) dadurch (rekursiv) definiert:

    – für n = 0 als die (einzige), die sofort und ausschließlich hält, und folglich gar keine Eins schreibt, sodass k_W0 := 0, und

    – für jeden folgenden Wert n als diejenige (oder ggf. jede derjenigen) Turing-Maschine(n), für die k_Wn der maximale Wert (unter allen Werten k_Xn) ist, mit dem die Funktion
    k_W : { 0, … n } → N,
    k_W[ j ] := k_Wj für j ∈ { 0, … n-1 } und
    k_W[ n ] := k_Xn
    eine berechenbare Funktion ist.

  9. #9 Mortimer
    Juni 28, 2012

    Kann man ein Programm schreiben, das zu jeder vorgegebenen Zahl n ≥ 0 berechnet, wie viele (aufanderfolgende) Einsen eine “Lazy Weasel”-Turing-Maschine, die n “Operations”-Zustände sowie einen “Halt”-Zustand hat, auf die Felder eines (anfänglich ausschließlich mit Nullen beschriebenen) Bandes schreiben (und daraufhin anhalten) würde?

    Man müsste alle möglichen Quelltexte/Programme abarbeiten, was auch geht, da abzählbar. Festzustellen ob die halten, ist ein unlösbares Problem.

    Siehe auch: https://de.wikipedia.org/wiki/Busy_Beaver#Die_Funktion_S

  10. #10 Frank Wappler
    Juni 30, 2012

    Mortimer schrieb (28.06.12 · 10:31 Uhr):
    > Man müsste alle möglichen Quelltexte/Programme abarbeiten, was auch geht, da abzählbar. Festzustellen ob die halten, […]

    Du beschreibst da eine wohl nicht besonders taugliche Idee für das gesuchte Programm; bzw. auch dafür, wie eventuell nachzuweisen wäre, dass ein gegebenes Programm die gestellten Forderungen erfüllt oder nicht.

    Aber schließt das denn aus, dass ein entsprechendes Programm überhaupt existieren bzw. (ggf. basierend auf tauglicheren Ideen, oder auch rein zufällig) geschrieben werden könnte?

    Z.B.: es ist ja offenbar systematisch möglich, für jeden gegebenen Argument-Wert einen ganz erheblich größere Funktions-Wert berechnen; vgl. https://en.wikipedia.org/wiki/Ackermann_function#Ackermann_numbers

    Man könnte demnach für jede vorgegebene “Operations”-Zustands-Zahl n jedes der entsprechenden Programme soweit “abarbeiten“/simulieren, bis bis es (höchstens) Ackermann[ n ] Schritte ausgeführt oder schon vorher gehalten hätte;
    und unter den Outputs derjenigen, die bis dahin gehalten hatten, denjenigen mit den meisten aufeinanderfolgenden Einsen feststellen, um die Zahl k_Wn zu ermitteln.

    Lässt sich denn etwa nachweisen, dass dieser Algorithmus, insbesondere konkret implementiert als Turing-Maschine, nicht das gesuchte Programm wäre?

    p.s.
    Meine obige Beschreibung des gesuchten Programms (27.06.12 · 16:56 Uhr) enthält leider einen ziemlich entstellenden Tippfehler, den ich hiermit korrigieren möchte (und dabei auch versuche, die Notation noch deutlicher zu gestalten):

    Kann man ein Programm schreiben, das zu jeder vorgegebenen Zahl n ≥ 0 berechnet, wie viele (aufanderfolgende) Einsen eine “Lazy Weasel”-Turing-Maschine, die n “Operations”-Zustände sowie einen “Halt”-Zustand hat, auf die Felder eines (anfänglich ausschließlich mit Nullen beschriebenen) Bandes schreiben (und daraufhin anhalten) würde?

    Dabei seien die “Lazy Weasel”-Maschinen Wn (unter allen Turing-Maschinen Xn mit jeweils n “Operations”-Zuständen, die eine bestimmte Anzahl k_Xn von aufanderfolgenden Einsen schreiben und daraufhin anhalten) dadurch (rekursiv) definiert:

    – für n = 0 als die (einzige), die sofort und ausschließlich hält, und folglich gar keine Eins schreibt, sodass k_W0 := 0, und

    – für jeden folgenden Wert n als diejenige (oder ggf. jede derjenigen) Turing-Maschine(n), für die k_Wn der maximale Wert (unter allen Werten k_Xn) ist, mit dem die Funktion kn_W : { 0, … n } → N,
    kn_W[ j ] := k_Wj für j ∈ { 0, … n-1 } und
    kn_W[ n ] := k_Xn
    eine berechenbare Funktion ist.