Zum Inhalt springen
Zurück zur Themenübersicht

Theoretische Informatik

Berechenbarkeit: Turingmaschine und Halteproblem

Gibt es Aufgaben, die kein Computer jemals lösen kann? Die Antwort ist ja, und sie ist beweisbar.

Benötigte Grundlagen

Dieses Vorwissen brauchst du für das Kapitel. Schau kurz nach, wenn dir etwas davon nicht mehr präsent ist, sonst leg direkt los.

Einführung

Rechner werden schneller, Speicher größer, Verfahren besser. Es liegt nahe zu denken, dass am Ende alles nur eine Frage von genug Rechenzeit ist.

Das ist falsch, und zwar nicht ein bisschen, sondern grundsätzlich. Es gibt klar formulierte, völlig eindeutige Aufgaben, für die kein Programm existiert. Nicht heute keines, sondern nie eines, gleich mit welcher Sprache, auf welcher Maschine, mit wie viel Zeit.

Dieses Kapitel zeigt zwei Dinge: wie man überhaupt beweisen kann, was alle Programme können, und wie der Beweis für eine solche unlösbare Aufgabe aussieht. Er passt auf eine halbe Seite und gehört zu den bemerkenswertesten Ergebnissen der Informatik.

Das kannst du nach diesem Kapitel

  • erklären, warum man für Aussagen über alle ein präzises Maschinenmodell braucht.

  • Aufbau und Arbeitsweise einer Turingmaschine beschreiben (Vertiefung).

  • die Church-Turing-These wiedergeben und ihren Status als These einordnen.

  • den Begriff berechenbar verwenden und begründen, dass es nicht berechenbare Probleme gibt.

  • den Beweis der Unentscheidbarkeit des Halteproblems nachvollziehen.

Kurz aufgefrischt

Vorausgesetzt wird der Algorithmusbegriff aus Was ist ein Algorithmus? mit seinen Merkmalen Eindeutigkeit, Ausführbarkeit, Endlichkeit und Terminierung, dazu die Formalisierung aus Formale Sprachen.

Neu ist die Umkehrung der Fragerichtung: Bisher hieß es „wie löse ich dieses Problem?". Jetzt heißt es „gibt es überhaupt eine Lösung?".

Das Problem mit dem Wort „Algorithmus“

Das Problem mit dem Wort „Algorithmus"

Die Definition aus Klasse 9 ist für die Praxis völlig ausreichend: eine endliche Folge eindeutiger, ausführbarer Schritte. Für einen Beweis reicht sie nicht, und der Grund ist entscheidend.

Angenommen, du willst zeigen: „Für dieses Problem gibt es keinen ." Dann musst du eine Aussage über alle Algorithmen treffen, auch über die, an die noch niemand gedacht hat. Dafür brauchst du eine mathematisch exakte Fassung des Begriffs, sonst kannst du über die Gesamtheit gar nicht argumentieren.

🔴 Halte den Unterschied fest: „Ich habe keinen gefunden" ist eine Aussage über dich. „Es gibt keinen" ist eine Aussage über alle. Nur die zweite ist ein Ergebnis, und sie verlangt ein präzises Modell.

Vertiefung: die Turingmaschine

Dieser Abschnitt gehört zum erhöhten Anforderungsniveau.

Alan Turing schlug 1936 ein Modell vor, das absichtlich so einfach wie möglich ist:

  • Ein Band, unendlich lang, in Felder eingeteilt, in jedem Feld ein Zeichen.
  • Ein Schreib-Lese-Kopf, der genau ein Feld sieht.
  • Eine endliche Menge von , dazu ein Startzustand.
  • Eine : Aus (Zustand, gelesenes Zeichen) folgt (neuer Zustand, zu schreibendes Zeichen, Bewegung des Kopfes: links, rechts oder stehen bleiben).

Das ist alles. Es gibt keine , keine , keine .

Du erkennst darin den endlichen Automaten wieder, allerdings mit einem entscheidenden Zusatz: Die Turingmaschine kann schreiben und sich in beide Richtungen bewegen. Genau daran scheiterte der endliche Automat im vorigen Kapitel; er konnte sich nur seinen Zustand merken, und davon gibt es endlich viele. Das Band ist unbegrenzt und ersetzt den fehlenden Speicher.

Beispielhafte Arbeitsweise einer Maschine, die eine Folge von Einsen um eine verlängert:

Zustandgelesenschreibebewegeneuer Zustand
q0q_011rechtsq0q_0
q0q_0leer1stehenqstopq_{\text{stop}}

Die Maschine läuft über alle Einsen nach rechts, findet das erste leere Feld, schreibt dort eine Eins und hält an. So mühsam das aussieht: Auf diese Weise lässt sich jede Berechnung ausdrücken, die ein heutiger Rechner ausführt.

Die Maschine beginnt

Ausgangslage111␣␣q0(q0, 1) → (1, →, q0)Drei Einsen auf dem Band, derKopf steht auf der ersten, derZustand ist q0.

Das ist die ganze Maschine: ein Band, ein Kopf, ein . Keine , keine , keine . Die Regelzeile darunter liest sich so: Steht die Maschine in q0q_0 und liest eine 11, dann schreibt sie eine 11 (also nichts Neues), geht ein Feld nach rechts und bleibt in q0q_0. Beachte die gestrichelten Enden, das Band ist unbegrenzt, und genau darin liegt der Unterschied zum endlichen des vorigen Kapitels. Der konnte sich nur seinen Zustand merken, und davon gibt es endlich viele; hier ersetzt das Band den fehlenden Speicher.

Die zweite Regel greift

Nach drei Schritten nach rechts111␣␣q0(q0, ␣) → (1, •, qstop)Der Kopf steht jetzt auf demersten leeren Feld, und dafürgilt die zweite Regel.

Dieselbe Maschine, drei Schritte später. Am Band hat sich nichts geändert, nur der Kopf ist gewandert, die erste Regel schrieb ja bloß dieselbe 11 zurück. Jetzt liest er ein leeres Feld, und dafür gilt die andere Zeile der : schreibe 11, bleib stehen, geh nach qstopq_{\text{stop}}. Danach steht auf dem Band 11111111, und die Maschine hält. Achte auf das Leerzeichen ␣: Es ist ein eigenes Zeichen des Bandalphabets, nicht die Ziffer 0. Stünde dort eine 0, griffe eine andere Regel: oder gar keine. So mühsam das wirkt: Auf genau diese Weise lässt sich jede Berechnung ausdrücken, die ein heutiger Rechner ausführt.

Die Church-Turing-These

Nun die zentrale Behauptung:

Church-Turing-These: Alles, was im intuitiven Sinn „ berechenbar" ist, lässt sich von einer Turingmaschine berechnen.

🔴 Beachte das Wort These. Es ist kein Satz, und es kann keiner sein. Auf der einen Seite steht ein mathematisch exakter Begriff (Turingmaschine), auf der anderen ein umgangssprachlicher („was man ausrechnen kann"). Zwischen einem exakten und einem unscharfen Begriff kann es keine bewiesene Gleichheit geben.

Was es dafür gibt, ist außerordentlich starke Evidenz: Mehrere unabhängig entwickelte Modelle, darunter Turings Maschine, Churchs Lambda-Kalkül und die Funktionen, stellten sich alle als gleich mächtig heraus. Verschiedene Menschen mit verschiedenen Ansätzen landeten bei genau derselben Grenze. Seit 1936 wurde kein Verfahren gefunden, das mehr kann.

Der praktische Nutzen der These ist groß: Wenn man zeigt, dass eine Turingmaschine etwas nicht kann, dann kann es kein Rechner und keine Programmiersprache. Deshalb sind alle üblichen Sprachen im Kern gleich mächtig; sie unterscheiden sich in Bequemlichkeit, nicht in der Menge lösbarer Probleme. Man nennt das turingvollständig.

Berechenbar und nicht berechenbar

Ein Problem heißt berechenbar, wenn es einen gibt, der für jede Eingabe nach endlich vielen Schritten das richtige Ergebnis liefert. Bei Ja-Nein-Fragen sagt man auch entscheidbar.

Dass es nicht berechenbare Probleme geben muss, lässt sich schon durch Abzählen einsehen:

Programme sind abzählbar. Jedes Programm ist ein endlicher Text über einem endlichen Zeichenvorrat. Man kann alle solchen Texte der Länge nach ordnen und durchnummerieren. Es gibt also „nur" abzählbar unendlich viele Programme.

Probleme sind überabzählbar. Eine Ja-Nein-Frage über allen möglichen Eingaben ist im Kern eine Funktion von den natürlichen Zahlen nach {0,1}\{0,1\}. Von diesen gibt es überabzählbar viele, wie Cantors Diagonalargument zeigt.

Folgerung: Es gibt echt mehr Probleme als Programme. Also müssen Probleme ohne Programm existieren, und zwar unvergleichlich viel mehr als lösbare.

Dieses Argument ist elegant, aber unbefriedigend: Es sagt, dass es solche Probleme gibt, ohne eines zu nennen. Turing lieferte ein konkretes.

Zwei Unendlichkeiten, nicht gleich groß

ProgrammeProblemeWie viele gibt es?abzählbarunendlichüberabzählbarunendlichWas ist das überhaupt?jedes ist einendlicher Textüber endlichvielen ZeichenjedeJa-Nein-Frageist eineFunktion von ℕnach {0, 1}Warum diese Anzahl?man kann sie derLänge nachordnen unddurchnummerierenCantorsDiagonalargument:durchnummerierenist unmöglichEs gibt echt mehr Probleme alsProgramme, also muss es Problemeohne Programm geben, und zwarunvergleichlich viel mehr alslösbare.

Beide Spalten sagen „unendlich“, und trotzdem ist die rechte echt größer. Das ist der überraschende Teil, und er ist reines Abzählen: Programme lassen sich durchnummerieren, Ja-Nein-Fragen über allen Eingaben nicht. Daraus folgt zwingend, dass es Probleme geben muss, für die kein Programm existiert, ohne dass man ein einziges davon kennen müsste. Genau das ist die Schwäche dieses Arguments: Es ist elegant und unbefriedigend, weil es nichts benennt. Turing lieferte deshalb ein konkretes Beispiel, und das steht im nächsten Abschnitt.

Das Halteproblem

Halteproblem: Gibt es ein Programm HH, das für ein beliebiges Programm PP und eine beliebige Eingabe EE zuverlässig entscheidet, ob PP bei Eingabe EE anhält oder ewig läuft?

Die Frage ist alles andere als akademisch. Ein solches Programm wäre das perfekte Werkzeug gegen Endlosschleifen, und jede Entwicklungsumgebung hätte es eingebaut.

Turings Antwort: Ein solches HH kann es nicht geben. Der Beweis:

Annahme: H(P,E)H(P, E) existiere und liefere immer nach endlicher Zeit „hält" oder „hält nicht".

Schritt 1: Konstruktion: Wir bauen daraus ein neues Programm TT, das genau eine Eingabe nimmt, nämlich ein Programm PP:

T(P):
    wenn H(P, P) sagt "hält":
        wiederhole endlos            // T läuft absichtlich ewig
    sonst:
        halte an                     // T hält absichtlich sofort

TT tut also immer das Gegenteil dessen, was HH für PP mit sich selbst als Eingabe vorhersagt. Beachte: H(P,P)H(P, P) ist erlaubt, denn ein Programm ist ein Text und darf als Eingabe dienen. Genau das tut jeder Übersetzer, der Quelltext liest.

Schritt 2: Selbstanwendung: Was macht TT, wenn man ihm TT selbst gibt, also T(T)T(T)?

Fall 1: H(T,T)H(T,T) sagt „hält". Dann geht TT nach Konstruktion in die Endlosschleife, hält also nicht. HH hat falsch vorhergesagt.

Fall 2: H(T,T)H(T,T) sagt „hält nicht". Dann hält TT nach Konstruktion sofort an. HH hat wieder falsch vorhergesagt.

Schritt 3: Widerspruch: In beiden Fällen irrt HH, obwohl es nach Annahme immer richtig liegt. Die Annahme ist also falsch.

Ergebnis: Das Halteproblem ist unentscheidbar. Ein allgemeiner Endlosschleifen-Prüfer kann nicht existieren.

Das Programm T, gebaut aus H

T bekommt einProgramm PSagt H(P,P)voraus:„P hält“?janeinT hältsofortanT läuft ewigweiter

Dieses kleine Diagramm ist der ganze Beweis. Angenommen, es gäbe HH, das für jedes Programm und jede Eingabe zuverlässig sagt, ob es hält, dann könnte man daraus dieses TT bauen: Es fragt HH und tut dann das Gegenteil. Und nun gib TT sich selbst als Eingabe. Sagt H(T,T)H(T,T) „hält“, geht TT nach dem linken Weg in die Endlosschleife und hält also nicht. Sagt H(T,T)H(T,T) „hält nicht“, hält TT nach dem rechten Weg sofort. In beiden Fällen irrt HH, obwohl es nach Annahme nie irrt. Also gibt es HH nicht: Ein allgemeiner Endlosschleifen-Prüfer ist nicht bloß schwer zu bauen, sondern beweisbar unmöglich.

Was das bedeutet, und was nicht

Was folgt nicht: dass man nie erkennen kann, ob ein Programm hält. Für viele einzelne Programme ist das leicht. Eine von 1 bis 100 hält offensichtlich.

Was folgt: Es gibt kein Verfahren, das das für jedes Programm richtig entscheidet. Die Aussage betrifft die Allgemeinheit, nicht den Einzelfall.

Daraus ergibt sich der Alltag der Softwarewerkzeuge. Ein Übersetzer, der vor möglichen Endlosschleifen warnt, arbeitet zwangsläufig unvollständig: Er meldet manche Fälle und übersieht andere, oder er warnt gelegentlich zu Unrecht. Beides ist keine Schlamperei, sondern die einzige Möglichkeit. Dasselbe gilt für Virenscanner, statische Codeprüfer und automatische Programmverifikation. Wer ein Werkzeug verspricht, das „alle Fehler dieser Art zuverlässig findet", verspricht etwas beweisbar Unmögliches.

Eine Turingmaschine Schritt für Schritt

Die Maschine mit den q0q_0 (Start) und qstopq_{\text{stop}} und der Tabelle aus dem Theorieteil bekommt das Band 1 1 _ _\texttt{1 1 \_ \_} mit dem Kopf auf dem ersten Feld. Führe sie aus.

  1. 1

    Tabelle zur Hand nehmen:

    Zustandgelesenschreibebewegeneuer Zustand
    q0q_011rechtsq0q_0
    q0q_0leer1stehenqstopq_{\text{stop}}
  2. 2

    Schritt 1: Zustand q0q_0, gelesen 11. Also: 11 schreiben (nichts ändert sich), nach rechts, bleibt q0q_0. Band 1 1 _ _\texttt{1 1 \_ \_}, Kopf auf Feld 2.

  3. 3

    Schritt 2: Zustand q0q_0, gelesen 11. Dasselbe noch einmal. Band unverändert, Kopf auf Feld 3.

  4. 4

    Schritt 3: Zustand q0q_0, gelesen leer. Zweite Zeile greift: 11 schreiben, stehen bleiben, Zustand qstopq_{\text{stop}}.

  5. 5

    Band jetzt 1 1 1 _\texttt{1 1 1 \_}, Zustand qstopq_{\text{stop}}. Die Maschine hält, weil für qstopq_{\text{stop}} keine Zeile existiert.

  6. 6

    Was hat sie geleistet? Aus zwei Einsen wurden drei, also 2+1=32 + 1 = 3. Sie zählt eins hinzu. Das wirkt lächerlich aufwendig, und genau darin liegt der Punkt: Weil das Modell so wenig kann, ist eine Aussage über alles, was es kann, überhaupt erst beweisbar.

Band 1 1 1 _\texttt{1 1 1 \_}, Halt in qstopq_{\text{stop}}. Die Maschine berechnet die Nachfolgerfunktion.

Den Halteproblem-Beweis nachvollziehen

Warum genügt es, TT mit sich selbst aufzurufen, um HH zu widerlegen?

  1. 1

    Was HH nach Annahme leistet: Für jedes Paar (P,E)(P, E) liefert es nach endlicher Zeit die richtige Antwort. Das ist eine sehr starke Zusage, und genau sie soll widerlegt werden.

  2. 2

    Was TT tut: T(P)T(P) fragt H(P,P)H(P,P) und macht dann das Gegenteil. Sagt HH „hält", läuft TT ewig; sagt HH „hält nicht", hält TT an.

  3. 3

    Warum T(T)T(T) erlaubt ist: Ein Programm ist ein Text und darf als Eingabe dienen. Übersetzer, Virenscanner und Editoren lesen ständig Programmtexte als . TT als Eingabe für TT ist also nichts Exotisches.

  4. 4

    Fall 1: H(T,T)H(T,T) sagt „hält". Dann geht T(T)T(T) in die Endlosschleife, hält also nicht. Die Vorhersage war falsch.

  5. 5

    Fall 2: H(T,T)H(T,T) sagt „hält nicht". Dann hält T(T)T(T) sofort. Wieder falsch.

  6. 6

    Warum es keinen dritten Fall gibt: HH liefert nach Annahme immer eine der beiden Antworten. Es darf weder schweigen noch selbst ewig laufen. Damit sind die Fälle vollständig.

  7. 7

    Schluss: Aus der Annahme folgt, dass HH sich irrt, obwohl es sich nach Annahme nie irrt. Ein Widerspruch, also war die Annahme falsch: HH existiert nicht.

Die Selbstanwendung erzeugt einen Fall, in dem jede mögliche Antwort von HH sich selbst widerlegt. Deshalb kann HH nicht existieren.

Typischer Fehler

„Das Halteproblem heißt, dass man bei einem Programm nie wissen kann, ob es anhält."

Das ist eine deutliche Übertreibung, und sie verwechselt „für alle" mit „für jedes einzelne".

Bei sehr vielen Programmen ist die Frage leicht zu beantworten. Eine von 1 bis 100 hält, das sieht man sofort. Ein Programm, das nur aus Zuweisungen besteht, hält immer. Und solange wahr: tue nichts\texttt{solange wahr: tue nichts} hält offensichtlich nie.

Bewiesen ist etwas anderes: Es gibt kein einziges Verfahren, das die Frage für jedes beliebige Programm richtig beantwortet. Die Unmöglichkeit steckt in der Allgemeinheit, nicht im Einzelfall.

Der Unterschied ist derselbe wie bei der Aussage „es gibt keine Formel, die alle Primzahlen erzeugt" gegenüber „man kann nicht wissen, ob 17 prim ist". Die erste ist ein Ergebnis, die zweite ist unsinnig.

Praktisch heißt das: Werkzeuge, die vor Endlosschleifen warnen, sind sinnvoll und nützlich. Sie können nur nicht vollständig und immer korrekt zugleich sein. Entweder übersehen sie Fälle oder sie warnen manchmal zu Unrecht, und diese Lücke ist beweisbar unvermeidlich.

Übung 1

leicht

a) Nenne die vier Bestandteile einer Turingmaschine. b) Was unterscheidet sie von einem endlichen ? c) Warum ist die Church-Turing-These eine These und kein Satz?

Tipp anzeigen

Zu b): Was konnte der endliche Automat im vorigen Kapitel nicht?

Lösung anzeigen

a) Ein unbegrenztes Band mit Feldern, ein Schreib-Lese-Kopf, endlich viele und eine Übergangstabelle, die aus Zustand und gelesenem Zeichen den neuen Zustand, das zu schreibende Zeichen und die Kopfbewegung bestimmt.

b) Zwei Dinge: Die Turingmaschine kann schreiben und sie kann sich in beide Richtungen bewegen. Damit hat sie unbegrenzten Speicher. Der endliche Automat merkt sich nur seinen Zustand, und davon gibt es endlich viele; genau daran scheiterte er bei {anbn}\{a^n b^n\}.

c) Weil sie einen mathematisch exakten Begriff (turingberechenbar) mit einem umgangssprachlichen Begriff (intuitiv berechenbar) gleichsetzt. Ein Beweis verlangt auf beiden Seiten exakte Begriffe. Für die These spricht sehr starke Evidenz, weil mehrere unabhängig entwickelte Modelle sich als gleich mächtig erwiesen haben.

Detaillierte Schritterklärung anzeigen

Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.

Erklärungstiefe

✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.

  1. 1

    a) Die vier Bestandteile und was jeder leistet

    Ein unbegrenztes Band mit Feldern (der Speicher), ein Schreib-Lese-Kopf (der Zugriff), endlich viele Zustände (das Gedächtnis fester Größe) und eine Übergangstabelle, die aus Zustand und gelesenem Zeichen den neuen Zustand, das zu schreibende Zeichen und die Kopfbewegung bestimmt.

  2. 2

    b) Der Unterschied zum endlichen Automaten: schreiben und zurückgehen

    Zwei Dinge: Die Turingmaschine kann schreiben, und sie kann sich in beide Richtungen bewegen. Damit hat sie unbegrenzten Speicher. Der endliche Automat merkt sich nur seinen Zustand, und davon gibt es endlich viele, genau daran scheiterte er bei {anbn}\lbrace a^n b^n \rbrace.

  3. 3

    c) Warum die Church-Turing-These eine These bleibt

    Weil sie einen mathematisch exakten Begriff (turingberechenbar) mit einem umgangssprachlichen gleichsetzt (intuitiv berechenbar). Ein Beweis verlangt auf beiden Seiten exakte Begriffe. Hier ist eine Seite unscharf, also ist ein Beweis unmöglich.

Übung 2

mittel

a) Erkläre in eigenen Worten, was das Halteproblem fragt. b) Warum ist es zulässig, ein Programm als Eingabe für ein Programm zu verwenden? c) Führe den Widerspruch für beide Fälle vor. d) Ein Anbieter wirbt: „Unser Werkzeug findet garantiert jede Endlosschleife in Ihrem Quelltext." Beurteile das.

Tipp anzeigen

Zu d): Was müsste das Werkzeug leisten, wenn man ihm ein beliebiges Programm gibt?

Lösung anzeigen

a) Es fragt, ob es ein Programm gibt, das für jedes Programm PP und jede Eingabe EE zuverlässig und nach endlicher Zeit entscheidet, ob PP bei EE anhält oder ewig läuft.

b) Weil ein Programm nichts anderes ist als ein endlicher Text. Als Text lässt es sich einlesen und verarbeiten wie jede andere Zeichenfolge. Genau das tun Übersetzer, Editoren und Virenscanner täglich.

c) Sei T(P)T(P) das Programm, das H(P,P)H(P,P) befragt und dann das Gegenteil tut. Betrachte T(T)T(T): Fall 1: H(T,T)=H(T,T) = „hält". Dann geht TT in die Endlosschleife, hält also nicht → HH irrt. Fall 2: H(T,T)=H(T,T) = „hält nicht". Dann hält TT an → HH irrt. Weitere Fälle gibt es nicht, weil HH nach Annahme immer eine der beiden Antworten liefert. Also irrt HH in jedem Fall, im Widerspruch zur Annahme.

d) Die Werbung verspricht etwas beweisbar Unmögliches, sofern „garantiert jede" wörtlich gemeint ist. Ein solches Werkzeug wäre genau das HH aus dem Beweis. Sinnvolle Werkzeuge dieser Art arbeiten deshalb notwendig unvollständig: Sie erkennen bestimmte Muster zuverlässig, übersehen andere oder melden gelegentlich einen Fall, der in Wahrheit keiner ist. Das ist keine Schwäche des Anbieters, sondern eine Grenze des Möglichen, und eine ehrliche Formulierung wäre „erkennt die häufigsten Muster".

Detaillierte Schritterklärung anzeigen

Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.

Erklärungstiefe

✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.

  1. 1

    Teil a): Die Quantoren richtig setzen

    Die entscheidenden Wörter sind jedes Programm und jede Eingabe. Ohne sie beschreibt man ein triviales Problem, denn für einzelne Programme ist die Frage oft leicht.

    Zwischenergebnis

    Gefordert ist ein Verfahren für alle Paare (P,E)(P, E).

    Zusätzlich muss HH selbst immer anhalten. Ein HH, das bei schwierigen Fällen einfach ewig rechnet, wäre wertlos und entginge dem Beweis nur scheinbar.

  2. 2

    Teil b): Programm als Text

    Ein Programm liegt als Zeichenfolge vor. Alles, was Zeichenfolgen verarbeiten kann, kann daher auch Programme verarbeiten.

    Zwischenergebnis

    H(P,P)H(P,P) ist eine gewöhnliche Eingabe, kein Trick.

  3. 3

    Teil c): Beide Fälle vollständig durchführen

    Man setzt TT selbst als Eingabe ein und geht die zwei möglichen Antworten von HH durch. In beiden entsteht das Gegenteil der Vorhersage.

    H(T,T) = \text{„hält"} ;\Rightarrow; T(T) \text{ hält nicht}

    Zwischenergebnis

    Beide Antworten widerlegen sich selbst.

  4. 4

    Teil d): Werbung gegen den Satz halten

    Man prüft, ob das Versprechen genau die widerlegte Zusage macht: für jedes Programm zuverlässig entscheiden. Tut es das, ist es unhaltbar.

    Zwischenergebnis

    „Garantiert jede" = das unmögliche HH.

    Vorsicht vor der Gegenübertreibung. Werkzeuge dieser Art sind trotzdem nützlich; sie müssen nur entweder Fälle übersehen oder gelegentlich falschen Alarm geben.

Übung 3

schwer

a) Begründe mit einem Abzählargument, dass es nicht berechenbare Probleme geben muss. b) Warum ist dieses Argument allein unbefriedigend? c) Eine Programmiersprache verbietet Endlosschleifen, indem jede eine feste Obergrenze für die Durchläufe angeben muss. Was gewinnt man, was verliert man? d) Erkläre, warum aus der Church-Turing-These folgt, dass eine neue Programmiersprache das Halteproblem nicht lösen kann.

Tipp anzeigen

Zu c): Terminiert jetzt jedes Programm? Und was heißt das für das Halteproblem in dieser Sprache?

Lösung anzeigen

a) Jedes Programm ist ein endlicher Text über einem endlichen Zeichenvorrat. Man kann alle solchen Texte nach Länge und innerhalb gleicher Länge alphabetisch ordnen und durchnummerieren; es gibt also abzählbar unendlich viele Programme. Ein Ja-Nein-Problem über allen Eingaben entspricht dagegen einer Funktion von den natürlichen Zahlen nach {0,1}\{0,1\}, und von diesen gibt es nach Cantors Diagonalargument überabzählbar viele. Da es echt mehr Probleme als Programme gibt, kann nicht jedes Problem ein Programm haben.

b) Weil es ein reines Existenzargument ist. Es zeigt, dass es unlösbare Probleme gibt, benennt aber kein einziges. Für die Informatik ist das wenig wert, denn interessant sind konkrete Fragen. Turings Beitrag ist gerade, ein konkretes, praktisch bedeutsames Problem anzugeben, nämlich das Halteproblem.

c) Gewonnen: In dieser Sprache hält jedes Programm, denn jede Schleife endet spätestens nach der angegebenen Obergrenze. Das Halteproblem ist damit trivial entscheidbar; die Antwort lautet immer „hält". Das ist für sicherheitskritische Bereiche durchaus erwünscht.

Verloren: Die Sprache ist nicht mehr turingvollständig. Es gibt berechenbare Probleme, die sie nicht mehr ausdrücken kann, denn manche Verfahren brauchen eine Schleife, deren Durchlaufzahl sich vorher nicht angeben lässt. Ein einfaches Beispiel ist „lies Eingaben, bis der Benutzer aufhört". Die Beschränkung ist also kein geschickter Ausweg um den Satz herum, sondern ein Tausch: Sicherheit gegen Ausdrucksstärke. Genau deshalb bleibt der Satz unberührt, denn er handelt von Sprachen, die alles Berechenbare ausdrücken können.

d) Die These besagt, dass alles intuitiv Berechenbare turingberechenbar ist. Eine neue Sprache, deren Programme im üblichen Sinn ausführbar sind, kann daher nichts berechnen, was eine Turingmaschine nicht berechnet. Da das Halteproblem für Turingmaschinen unentscheidbar ist, ist es auch in der neuen Sprache unentscheidbar. Der Beweis selbst kommt sogar ohne die These aus: Er benutzt nur, dass sich TT aus HH konstruieren lässt, und das ginge in jeder Sprache, in der HH überhaupt schreibbar wäre.

Detaillierte Schritterklärung anzeigen

Hier wird jeder Schritt einzeln erklärt, vor allem, warum er gemacht wird.

Erklärungstiefe

✦ Empfohlen: Standard – Die normale Erklärungstiefe passt zum Einstieg.

  1. 1

    a) Zwei Unendlichkeiten vergleichen: Programme gegen Probleme

    Jedes Programm ist ein endlicher Text über einem endlichen Zeichenvorrat. Man kann alle solchen Texte nach Länge und innerhalb gleicher Länge alphabetisch ordnen und durchnummerieren. Es gibt also abzählbar unendlich viele Programme. Ein Ja-Nein-Problem entspricht dagegen einer Funktion von den natürlichen Zahlen nach {0,1}\lbrace 0,1 \rbrace, und davon gibt es nach Cantors Diagonalargument überabzählbar viele.

  2. 2

    b) Warum das Abzählargument allein unbefriedigend ist

    Weil es ein reines Existenzargument ist. Es zeigt, dass es unlösbare Probleme gibt, benennt aber kein einziges. Für die Informatik ist das wenig wert, denn interessant sind konkrete Fragen.

  3. 3

    c) Was eine Sprache ohne Endlosschleifen gewinnt

    Gewonnen: In dieser Sprache hält jedes Programm, denn jede Schleife endet spätestens nach der angegebenen Obergrenze. Das Halteproblem ist damit trivial entscheidbar, die Antwort lautet immer „hält“. Für sicherheitskritische Bereiche ist das durchaus erwünscht.

  4. 4

    c) Was sie verliert: Turingvollständigkeit

    Verloren: Die Sprache ist nicht mehr turingvollständig. Es gibt berechenbare Probleme, die sie nicht mehr ausdrücken kann, denn manche Verfahren brauchen eine Schleife, deren Durchlaufzahl sich vorher nicht angeben lässt, etwa „lies Eingaben, bis der Benutzer aufhört“.

  5. 5

    d) Warum keine neue Sprache das Halteproblem lösen kann

    Die Church-Turing-These besagt, dass alles intuitiv Berechenbare turingberechenbar ist. Eine neue Sprache, deren Programme im üblichen Sinn ausführbar sind, kann daher nichts berechnen, was eine Turingmaschine nicht berechnet. Da das Halteproblem für Turingmaschinen unentscheidbar ist, ist es auch in der neuen Sprache unentscheidbar.

Zusammenfassung

Um zu beweisen, dass ein Problem von keinem gelöst wird, braucht man eine exakte Fassung des Algorithmusbegriffs; die Turingmaschine aus Band, Kopf, endlichen und leistet das, indem sie gegenüber dem endlichen Automaten Schreiben und Rückwärtsbewegung erlaubt. Die Church-Turing-These setzt intuitive und turingmäßige Berechenbarkeit gleich; sie bleibt eine These, weil ein umgangssprachlicher Begriff beteiligt ist, wird aber dadurch gestützt, dass mehrere unabhängig entwickelte Modelle sich als gleich mächtig erwiesen. Ein Abzählargument zeigt bereits, dass es überabzählbar viele Probleme, aber nur abzählbar viele Programme gibt, benennt jedoch kein konkretes unlösbares Problem. Turing lieferte eines: Das Halteproblem ist unentscheidbar, bewiesen durch ein Programm, das das Gegenteil der eigenen Vorhersage tut und auf sich selbst angewendet wird. Daraus folgt nicht, dass man bei einem einzelnen Programm nichts über das Halten wüsste, wohl aber, dass jedes Werkzeug zur automatischen Fehlersuche notwendig unvollständig bleibt.