Die Problemreduzierung des Stoßproblems ist ein leistungsstarkes Instrument, um zu beweisen, dass ein bestimmtes Problem (oder ein Algorithmus)
unentscheidbar ist Dies bedeutet, dass es keinen allgemeinen Algorithmus gibt, der immer korrekt bestimmen kann, ob die angegebene Probleminstanz von einem anderen Algorithmus gelöst werden kann. Es * sagt Ihnen nicht direkt, ob ein Algorithmus * berechnet wird, sondern wenn die Ermittlung einer Eigenschaft über * Der Algorithmus berechnet wird.
So funktioniert die Reduzierung:
1. Das Störungsproblem verstehen:
*Das Problem mit dem Stoppen fragt:Bei einem Algorithmus (Programm) *H *und einem Eingang *i *Für diesen Algorithmus wird *h *h *hals am Ausgang mit Input *i *anhalten (Lauf).
* Das Störungsproblem ist unentscheidbar . Es gibt keinen Algorithmus, `Halts (h, i), das kann immer richtig` true` zurückgeben, wenn *H *auf *i *und `false` if *h *Loops für immer anhält.
2. Die Reduktionstechnik (Beweis nach Widerspruch):
Um zu beweisen, dass ein Problem * p * unentscheidbar ist, machen Sie Folgendes:
1. Dies bedeutet, dass wir davon ausgehen, dass ein Algorithmus "LESTEP (INPUTFORP)` existiert, der die Lösung für jede Instanz des Problems immer korrekt zurückgibt.
2. eine Reduktion konstruieren: Sie müssen zeigen, wie Sie den hypothetischen `Solvep ()` -Algorithmus verwenden, um das Staltproblem zu lösen. Mit anderen Worten, Sie erstellen einen Algorithmus "Haltet" (h, i) ", der" LELVEP () als Unterroutine verwendet. Dieser Algorithmus hält (h, i) wie folgt funktionieren:
`` `
hält (h, i):
1. Verwandeln Sie die Anstaltprobleminstanz (h, i) in eine Instanz von Problem P, nennen wir es "inputForp`". Dies ist der entscheidende Schritt:Sie erstellen `InputForp` auf eine Weise, dass *die Lösung für das Problem P in diesem Eingang direkt zeigt, ob H an i *anhält. Die Besonderheiten, wie Sie diese Transformation durchführen, hängen vollständig vom Problem ab *p *.
2. resultp =Solvep (inputForp) // Aufrufen Sie unseren hypothetischen Löser für Problem P.
3. Basierend auf ErgebnisP, bestimmen Sie, ob H auf I anhält, und geben Sie entsprechend wahr oder falsch zurück.
`` `
3. Erklären Sie klar, wie das Ergebnis von "SolveP (inputForp)` direkt sagt, ob Algorithmus *h *auf Eingabe *i *anhält.
4. Widerspruch: Da bekannt ist, dass das Problem mit dem Anstieg nicht entschlossen ist und Sie gezeigt haben, dass ein hypothetischer "Lösung" verwendet werden kann, um es zu lösen, haben Sie einen Widerspruch erreicht.
5. Schlussfolgerung: Daher muss unsere anfängliche Annahme (dass * p * lehnte) falsch sein. Daher ist Problem * p * unentscheidbar.
Schlüsselideen und Herausforderungen:
* Transformation ist der Schlüssel: Der schwierigste Teil ist es, eine Transformation von (h, i) zu einer Instanz von *p *zu finden, so dass die Lösung für *p *direkt zeigt, ob *h *auf *i *anhält. Dies erfordert eine Klugheit und das Verständnis sowohl des Stillstandsproblems als auch des Problems *p *.
* Beweis im Widerspruch: Sie sind nicht * direkt * beweisen, dass * p * nicht entscheidbar ist. Sie zeigen, dass, wenn * p * * * entschlossen wäre, dies zu einer Unmöglichkeit führen würde (das Problem der Stillstehe zu lösen).
* Generalisierung: Das Ziel ist es zu beweisen, dass es *keinen Algorithmus gibt, der *p *für *alle möglichen Eingänge *löst. Ihre Reduzierung muss für einen beliebigen Algorithmus *H *und Eingabe *i *gültig sein.
Beispiel:Das Leeresproblem für Turing -Maschinen
Das Leeresproblem für Turing -Maschinen fragt:Wenn eine Turing -Maschine *m *ist, wird die Sprache von *m *leer akzeptiert (d. H. *M *Akzeptiere *irgendwelche *Eingabe)? Lassen Sie uns zeigen, dass dies unentscheidbar ist.
1. Angenommen, die Leere ist lichtdurchschnittlich: Angenommen, es gibt einen Algorithmus "IsEmpty (m)", der "true" zurückgibt, wenn die von * m * akzeptierte Sprache leer ist, und ansonsten "falsch".
2. Reduktion: Wir werden einen Algorithmus erstellen.
`` `
hält (h, i):
1. // Konstruieren Sie eine neue Turing -Maschine M_HI
// - m_hi nimmt jede Eingabe w.
// - m_hi simuliert zuerst H auf I.
// - Wenn H an i anhält, dann akzeptiert M_HI w.
// - Wenn H nicht an i haltet, dann ist M_HI -Schleifen für immer.
M_hi =constructtm (h, i)
2. Ergebnis =isempty (m_hi)
3. Wenn Ergebnis ==wahr:
Rückgabe falsch // H hält mich nicht an
anders:
Return true // h hält mich an i an
`` `
3. Warum das funktioniert:
*Wenn *h *an *i *anhält, dann akzeptiert `m_hi` *jede *Eingabe` w`. Somit ist die von `m_hi` akzeptierte Sprache nicht leer (es ist tatsächlich σ*, die Menge aller Zeichenfolgen). Daher wird `isempty (m_hi)` `` false` zurückgeben und `hält (h, i)` Returns `true` zurück.
*Wenn *h * *nicht *anhält *i *, dann wird `m_hi` für immer auf *jedem *Eingabe` w` schleifen. Somit ist die von `m_hi` akzeptierte Sprache leer. Daher wird `isempty (m_hi)` `true` und" Halts (h, i) zurückgeben "Returns` false ".
4. Widerspruch: Wir haben einen Algorithmus erstellt. Aber das Anstaltproblem ist unentscheidbar, also ist dies ein Widerspruch.
5. Schlussfolgerung: Daher ist das Leeresproblem für Turing -Maschinen unentscheidbar.
Wichtige Hinweise:
* Die Reduzierung zeigt, dass das Problem * p * mindestens so hart ist wie * das Störungsproblem. Da das Störungsproblem nicht entschlossen ist, ist es auch *p *.
* Reduzierungen werden häufig verwendet, um Unentschlossenheit zu beweisen, können aber auch verwendet werden, um die NP-Vervollständigung im Kontext der rechnerischen Komplexität zu beweisen.
* Der Algorithmus `constructtm (h, i)` im obigen Beispiel ist ein theoretisches Konstrukt. In der Praxis würden Sie keine physische Turing -Maschine "bauen". Der Punkt ist, dass * im Prinzip * es möglich ist, eine solche Maschine zu beschreiben.
Zusammenfassend ist die Reduzierung der Problemstörung eine leistungsstarke Beweistechnik, die uns hilft, die Grenzen der Berechnung zu verstehen. Indem wir zeigen, dass die Lösung eines bestimmten Problems eine Lösung für das Stoppproblem bedeuten würde (von dem wir wissen, dass es unmöglich ist), können wir schließen, dass das Problem nicht entscheidbar ist.