Informatik

Halteproblem: Unentscheidbarkeit verstehen

Halteproblem: Unentscheidbarkeit verstehen
Halteproblem: Unentscheidbarkeit verstehen
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

Das Halteproblem fragt: Kann ein Algorithmus für jedes beliebige Programm und jede beliebige Eingabe korrekt entscheiden, ob die Ausführung irgendwann endet? Die Antwort lautet nein. Ein solcher universeller Halte-Entscheider kann nicht existieren.

Auf dieser Seite lernst du, warum bloßes Ausprobieren nicht genügt, wie der Widerspruchsbeweis funktioniert und was die Unentscheidbarkeit für praktische Programme bedeutet.

Deine Lernziele

Hake ab, was du schon kannst — und komm am Ende hierher zurück!

Welche Frage stellt das Halteproblem?

Stell dir ein Prüfprogramm vor. Es erhält zwei Dinge:

  • den Code eines beliebigen Programms $P$,
  • eine konkrete Eingabe $w$ für dieses Programm.

Das Prüfprogramm soll immer nach endlich vielen Schritten eine korrekte Antwort geben:

  • Ja: $P$ hält bei der Eingabe $w$.
  • Nein: $P$ läuft bei dieser Eingabe unbegrenzt weiter.
Definition

Halteproblem

Das Halteproblem ist die Frage, ob ein beliebiges Programm bei einer vorgegebenen Eingabe irgendwann anhält. Ein Entscheider müsste jeden zulässigen Fall korrekt beantworten und dabei selbst immer halten.

Für Turingmaschinen kann die zugehörige Haltesprache so beschrieben werden:

$$K=\{b(T)*w\mid T\text{ hält bei Eingabe }w\}$$

Dabei bezeichnet $b(T)$ eine codierte Beschreibung der Turingmaschine $T$. Das Zeichen $*$ trennt die Maschinenbeschreibung von der Eingabe $w$.

Beispiel

Ein Programm zählt von 10 bis 0 herunter und beendet sich danach. Für dieses konkrete Programm lässt sich das Halten leicht erkennen.

Das Halteproblem verlangt jedoch viel mehr: Ein einziges Verfahren soll jedes mögliche Programm mit jeder möglichen Eingabe untersuchen. Genau diese allgemeine Forderung ist unerfüllbar.

Teste dich
Frage 1 von 1LeichtWelche Leistung müsste ein universeller Halte-Entscheider erbringen?
Lösung: Für jedes Programm und jede Eingabe nach endlich vielen Schritten korrekt mit Ja oder Nein antworten. — Ein Entscheider muss alle zulässigen Fälle beantworten, korrekt entscheiden und selbst immer terminieren.
Warum reicht eine Simulation nicht aus?

Man kann $P$ mit der Eingabe $w$ Schritt für Schritt simulieren. Hält $P$, beobachtet die Simulation dies nach endlich vielen Schritten. Der positive Fall ist damit allgemein erkennbar.

Läuft $P$ dagegen unbegrenzt, läuft auch die Simulation möglicherweise unbegrenzt. Zu keinem endlichen Zeitpunkt folgt allein aus dem bisherigen Verlauf, dass das Programm niemals mehr halten wird.

Definition

Semientscheidbarkeit

Ein Problem ist semientscheidbar, wenn ein Verfahren alle Ja-Fälle nach endlich vielen Schritten erkennt. Bei einem Nein-Fall darf das Verfahren unbegrenzt weiterlaufen. Das Halteproblem ist semientscheidbar, aber nicht entscheidbar.

Auch das Speichern schon beobachteter Zustände löst die allgemeine Aufgabe nicht. Wiederholt sich eine vollständige Konfiguration, wurde eine Schleife nachgewiesen. Zu einer Konfiguration gehören der Bandinhalt, die Position des Schreib-Lese-Kopfs und der Zustand der Turingmaschine.

Eine Turingmaschine kann jedoch immer neue Bandbereiche beschreiben. Sie kann daher unendlich laufen, ohne eine vollständige Konfiguration zu wiederholen.

Merke

Simulation bestätigt das Halten, sobald es geschieht. Aus einer bislang langen Laufzeit folgt aber nicht, dass das Programm niemals halten wird.

Teste dich
Frage 1 von 1MittelEine Simulation läuft schon sehr lange, ohne dass das untersuchte Programm hält. Was darfst du daraus schließen?
Lösung: Noch nicht, ob das Programm später hält oder unbegrenzt weiterläuft. — Eine Simulation liefert beim Halten ein endliches Zeugnis. Für das Nichthalten muss es im allgemeinen Fall keinen endlich beobachtbaren Beleg geben.
Wie entsteht der Widerspruch?

Der zentrale Beweis beginnt mit einer Annahme: Es gebe einen universellen Entscheider HALT(P, w). Er antworte immer korrekt und halte selbst stets an.

Aus diesem angeblichen Entscheider bauen wir ein Gegenprogramm GEGEN(P):

  1. GEGEN fragt HALT, ob das Programm $P$ bei Eingabe seines eigenen Codes $P$ hält.
  2. Antwortet HALT mit Nein, beendet sich GEGEN.
  3. Antwortet HALT mit Ja, läuft GEGEN absichtlich endlos.

Damit kehrt GEGEN die Vorhersage des Entscheiders um:

$$GEGEN(P)\text{ hält}\iff P(P)\text{ hält nicht}$$

Nun erhält GEGEN seinen eigenen Code als Eingabe. Wir betrachten also GEGEN(GEGEN).

Beispiel

Es gibt nur zwei mögliche Annahmen:

  1. `GEGEN(GEGEN)` hält. Dann müsste HALT zuvor Nein gemeldet haben. Diese Meldung behauptet aber, dass GEGEN(GEGEN) nicht hält.
  2. `GEGEN(GEGEN)` hält nicht. Dann müsste HALT zuvor Ja gemeldet haben. Diese Meldung behauptet aber, dass GEGEN(GEGEN) hält.

In beiden Fällen widerspricht das tatsächliche Verhalten der angeblich korrekten Vorhersage. Das Gegenprogramm ist konstruierbar; falsch war daher die Ausgangsannahme, dass HALT existiert.

Merke

Die Beweisstruktur lautet: universellen Entscheider annehmen, ihn auf Selbstanwendung ansetzen, seine Vorhersage umkehren und dadurch einen Widerspruch erzeugen.

Teste dich
Frage 1 von 2MittelWarum wird der eigene Programmcode als Eingabe verwendet?
Lösung: Dadurch kann das Gegenprogramm die Vorhersage über sein eigenes Verhalten umkehren. — Selbstanwendung verbindet die Vorhersage des Entscheiders mit genau dem Programm, das diese Vorhersage anschließend umkehrt.
Frage 2 von 2SchwerJemand schlägt einen Tester vor, der manchmal korrekt antwortet, bei schwierigen Fällen aber endlos läuft. Widerlegt der Beweis auch die Existenz dieses Testers?
Lösung: Nein. Widerlegt wird ein Tester, der jeden Fall korrekt und in endlicher Zeit entscheidet. — Das Halteproblem ist semientscheidbar. Unmöglich ist die vollständige, stets terminierende Ja-Nein-Entscheidung für alle Fälle.
Was folgt aus der Unentscheidbarkeit?

Die Aussage betrifft den allgemeinen Fall. Sie bedeutet nicht, dass man bei keinem Programm etwas über die Terminierung sagen kann.

Für einzelne Programme oder eingeschränkte Programmklassen sind Terminierungsnachweise möglich. Ein Programm ohne Schleifen kann beispielsweise zu einer Klasse gehören, deren Halteverhalten entscheidbar ist. Auch eine erkannte Wiederholung einer vollständigen Konfiguration beweist eine konkrete Endlosschleife.

Compiler können außerdem syntaktische Fehler erkennen. Daraus folgt jedoch nicht, dass sie für jedes syntaktisch korrekte Programm entscheiden könnten, ob es bei jeder Eingabe hält.

Vertiefung: Halten auf leerem Band

Beim Null-Halteproblem startet eine Turingmaschine mit einem leeren Band. Diese Variante ist hinsichtlich der Entscheidbarkeit genauso schwer wie das allgemeine Halteproblem.

Zu einer Maschine $T$ und einer Eingabe $w$ lässt sich eine neue Maschine $T_w$ konstruieren:

  1. $T_w$ schreibt zuerst $w$ auf das leere Band.
  2. Danach verhält sich $T_w$ genauso wie $T$ bei der Eingabe $w$.

Daher gilt:

$$T_w\text{ hält auf leerem Band}\iff T\text{ hält bei Eingabe }w$$

Könnte man das Halten auf leerem Band allgemein entscheiden, könnte man damit auch das allgemeine Halteproblem entscheiden. Weil das unmöglich ist, ist auch das Null-Halteproblem unentscheidbar.

Teste dich
Frage 1 von 2LeichtWelche Aussage beschreibt den Geltungsbereich korrekt?
Lösung: Manche konkrete Programme sind analysierbar, aber es gibt keinen vollständigen Halte-Entscheider für alle Programme und Eingaben. — Allgemeine Unentscheidbarkeit und erfolgreiche Analysen eingeschränkter Fälle widersprechen einander nicht.
Frage 2 von 2SchwerWas zeigt die Konstruktion von $T_w$?
Lösung: Eine explizite Eingabe kann in den Startablauf einer neuen Maschine eingebaut werden. — Die Konstruktion überträgt jede allgemeine Haltefrage auf eine Maschine, die mit leerem Band startet.
Karteikasten
Karteikasten

Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.

Alles auf einen Blick
Mindmap
  • Halteproblem
    • Fragestellung
      • Hält ein beliebiges Programm bei einer konkreten Eingabe?
      • Ein Entscheider müsste immer korrekt antworten und selbst halten.
    • Simulation
      • Haltende Ausführungen sind endlich erkennbar.
      • Nichthalten ist nicht allgemein endlich erkennbar.
    • Widerspruchsbeweis
      • Universellen Entscheider annehmen.
      • Eigenen Code als Eingabe verwenden.
      • Vorhersage umkehren.
    • Folgerung
      • Das allgemeine Halteproblem ist unentscheidbar.
      • Eingeschränkte Fälle können trotzdem analysierbar sein.
    • Reduktion
      • Eingabe in eine neue Maschine einbauen.
      • Null-Halteproblem und allgemeines Halteproblem sind gleich schwer.
Abschluss-Check
Teste dich
Frage 1 von 3LeichtWas unterscheidet einen Entscheider von einem Semientscheider des Halteproblems?
Lösung: Ein Entscheider müsste auch jeden Nichthaltefall endlich erkennen; ein Semientscheider muss das nicht. — Die entscheidende Grenze liegt bei den Nein-Fällen: Ein vollständiger Entscheider müsste auch Nichthalten stets endlich und korrekt feststellen.
Frage 2 von 3MittelEin Analysewerkzeug erkennt bestimmte Schleifenmuster zuverlässig, meldet bei anderen Programmen aber „unbekannt“. Widerspricht seine Existenz der Unentscheidbarkeit?
Lösung: Nein, denn es behauptet nicht, jeden möglichen Fall vollständig zu entscheiden. — Teilweise Analysen und Terminierungsbeweise bleiben möglich. Ausgeschlossen ist nur ein stets erfolgreicher universeller Entscheider.
Frage 3 von 3SchwerOrdne die Schritte des Widerspruchsbeweises gedanklich: Was erzwingt den eigentlichen Widerspruch?
Lösung: Das Gegenprogramm wird auf seinen eigenen Code angewendet und verhält sich entgegengesetzt zur Vorhersage. — Bei der Selbstanwendung müsste das Gegenprogramm genau dann halten, wenn es nicht hält. Deshalb kann die Annahme eines universellen Entscheiders nicht stimmen.

Du hast das Lernziel erreicht, wenn du nicht nur sagen kannst, dass das Halteproblem unentscheidbar ist, sondern auch die Annahme, Selbstanwendung, Umkehrung und den entstehenden Widerspruch in eigenen Worten verbindest.

Passend dazu