Wie ist Turings Lösung für das Halteproblem nicht einfach „Failure By Design“?


7

Es fällt mir schwer, Turings Lösung für das Halteproblem als Logiker und nicht als Ingenieur zu sehen.

Hier ist mein Verständnis des Halteproblems:

Sei die Menge aller Turingmaschinen. M

Lassen für alle die Turing - Maschinen in die Menge aller Eingänge sein . iM

Sei jedes Element in ein Element in . Mi

Die booleschen Werte und seien Elemente in . truefalsei

Sei eine Funktion, die zurückgibt: h(M,i)

  • true wenn und nur wenn anhält M(i)
  • false genau dann, wenn nicht anhält M(i)

Sei eine Turingmaschine in , die:p(M)M

  • rufth(M,M)
  • wird genau dann angehalten, wenn zurückgibth(M,M)false
  • hört nicht genau dann auf, wenn zurückkehrth(M,M)true

Was passiert, wenn wir anrufen? p durch Vorbeigehen p zu sich selbst, p(p)?

Der Teil, mit dem ich Probleme habe, ist die Implementierung p(M) damit es nicht aufhört wann h(M,M) ist true. Mein Bauch versteht diesen Ansatz wie folgt:

Eine Methode gegeben h() das funktioniert und eine Methode p() entworfen, um zu brechen h()Wenn wir diese Methoden kombinieren, um eine Maschine zu bauen, ist diese Maschine kaputt.

Ich verstehe, dass Beweis durch Widerspruch ein gültiger Ansatz zur Problemlösung in der formalen Logik ist, aber diese spezielle Anwendung von Beweis durch Widerspruch scheint irgendwie fehlerhaft zu sein.

Was vermisse ich?


2
Es würde dieser Diskussion helfen, wenn Sie genau klären könnten, warum Sie der Meinung sind, dass "diese spezielle Anwendung fehlerhaft erscheint". Ihre Kommentare zu den Antworten helfen ein bisschen, aber ich sehe immer noch nicht genau, was Sie beunruhigt.
Rick Decker

Antworten:


10

Im Folgenden werde ich eine Maschine unterscheiden M. aus seiner Beschreibung, die die Beschreibung von bezeichnet M. durch M.

Spezifikation des Stopp-Tester-Programms, H.

H. nimmt als Eingabe ein Paar (M.,ich), wo M. ist die Beschreibung der Maschine M., und ich ist die Eingabe von M..

H.hält bei jedem Eingangspaar an(M.,ich) und gibt die richtige Antwort zurück, nämlich:

H.(M.,ich)gibt genau dann true zurück , wennM. hält bei der Eingabe an ich.

Angenommen, es gibt eine solche Maschine H., wir können benutzen H. als Unterprogramm zum Erstellen eines Programms P. wie folgt:

Spezifikation des "perversen" Programms P.

P. nimmt als Eingabe eine Beschreibung, M.einer Maschine M..

P.funktioniert bei jeder Eingabe korrektM.nämlich

P.(M.) hält genau dann an, wenn M. stoppt nicht bei Eingabe M..

Der Schlüssel zu diesem Argument ist, wenn wir eine Maschine definieren könnenH.dass satiffies die Spezifikation oben, dann können wir eine Maschine bauenP. das erfüllt die zweite Spezifikation.

Jedoch, P.wenn gegeben P.zeigt unmögliches Verhalten,

P.(P.) hält genau dann an, wenn P.(P.) hört nicht auf

Damit P.erfüllt nicht seine zweite Anforderung an mindestens einen Eingang und folglich muss es der Fall sein, dassH. kann seine Anforderung nicht erfüllen, daher können wir folglich nicht machen H. wie angegeben.

Jetzt H. kann sich sehr gut so verhalten, wie es bei vielen Eingaben angegeben ist (M.,ich)Der Punkt ist jedoch, dass kein Stopp-Tester erstellt werden kann, der mit allen möglichen Eingaben funktioniert .


4

So könnte ein Logiker das Problem angehen:

h(M,i) ist per Definition die allgemeine Falllösung für das Halting-Problem.

(1) h(M,i) muss feststellen können, ob oder nichtMhält für alle an M(dh eine uneingeschränkte Menge vonM ).

p(M) ist ein Element in M.

(2) Die folgenden Aussagen sind äquivalent:

  • p(M) hält genau dann an, wenn h(M,M) kehrt zurück false
  • p(M) hält genau dann an, wenn p(M) hört nicht auf

(3) Darüber hinaus sind die folgenden Aussagen gleichwertig:

  • p(M) hört nicht genau dann auf, wenn h(M,M) kehrt zurück true
  • p(M) hört nicht genau dann auf, wenn p(M) hält an

Beide (2) und (3) sind Widersprüche.

h(M,i)- Die allgemeine Falllösung für das Halteproblem - kann nicht richtig bestimmen, obp(M) hält an, widerspricht (1). Daher gibt es keine allgemeine Falllösung für das Halteproblem.


4

Du sagst:

Der Teil, mit dem ich Probleme habe, ist die Implementierung p(M) damit es nicht aufhört wann h(M,M) ist true. Mein Bauch versteht diesen Ansatz wie folgt:

Eine Methode gegeben h() das funktioniert und eine Methode p() entworfen, um zu brechen h()Wenn wir diese Methoden kombinieren, um eine Maschine zu bauen, ist diese Maschine kaputt.

Das Problem ist, dass p() ist NICHT zum Brechen ausgelegt h()ist es konzipiert, um zu verwenden h()- und die Nutzung ist gültig UND funktioniert! Außer, es funktioniert nicht, wenn die Eingabe istp(), was beweist, dass es nicht für alle Eingaben funktioniert .

Was bedeutet, dass h() existiert bestenfalls nicht hminus()existiert. Das ist nicht wichtigp() ist kaputt, wichtig ist das h() existiert nicht.

Wenn jemand sagt, dass er geschrieben hat h() Sie wissen, dass sie sich irren oder lügen, wenn sie daran arbeiten wollen h() Sie verschwenden dein Geld und so weiter.

Es legt Grenzen für das fest, was entschieden werden kann und was nicht und welche Ressourcen dafür benötigt werden.

Wenn jemand die Frage stellt: Können wir feststellen, ob p()hält bei dieser Eingabe an? Die möglichen Antworten darauf sind: (a) ja - es tut, (b) ja - es tut nicht (c) ja - aber wir wissen derzeit nicht, ob es tut oder nicht und schließlich (d) nein - es ist unmöglich, den einen oder anderen Weg zu beweisen.

Es kann äußerst nützlich sein, schnell feststellen zu können, ob die Antwort (c) oder (d) lautet. Denken Sie daran, Halting sagt nicht, dass wir ein bestimmtes nicht beweisen könnenp()Halting, Halting sagt, wir können keine allgemeine Lösung haben, die für jede Eingabe funktioniert. Beschränken Sie entwederp() oder die Eingabe und die Antwort ist ziemlich häufig ja, das ist trivial.


3

Sie sollten nicht mit "Zerbrochenheit" darüber nachdenken, da es eine Vielzahl von absolut legitimen Programmen gibt, die für immer ausgeführt werden sollen. Daher ist es nicht unbedingt "kaputt", für immer zu laufen.

pist der folgende einfache Algorithmus, vorausgesetzt, wir haben bereits eine Funktion h(X,Y), die zurückgibt, truewenn die Maschine Xmit der Eingabe anhält, Yund zurückgibt, falsewenn dies nicht der Fall ist.

function p(M)
    if (h(M,M)) then
        while (true) do
        endwhile;
    return;

Zwar gibt es eine Vielzahl von absolut legitimen Programmen, die für immer ausgeführt werden sollen, doch an dieses Projekt werden sozusagen Anforderungen gestellt. Das heißt, dass es das Halting-Problem lösen sollte. p () ist so konzipiert, dass die resultierende Maschine in Kombination mit h () die Projektanforderungen nicht mehr erfüllt. Ist das nicht einfach ein Designfehler?
StudentsTea

3
Nr. h()Soll "die Projektanforderungen erfüllen" (dh das Stoppproblem entscheiden). Wir gehen davon aus, dass dieses Programm existiert und funktioniert. p()ist etwas, das einer Ihrer Programmierer geschrieben hat, während er in seiner Mittagspause herumgespielt hat. Es ist nicht so, dass es "die Projektanforderungen nicht erfüllt", es ist so, dass es ein unmögliches Programm ist: Wenn es nicht anhält, stoppt es; Wenn es anhält, hört es nicht an. Da die Annahme, die h()existiert und funktioniert, zu einer unmöglichen Situation geführt hat, müssen wir zu dem Schluss kommen, dass h() es keine gibt.
David Richerby

Sagen wir, dass p () ein unmögliches Programm ist, oder sagen wir, dass p () in Kombination mit h () - als Ganzes genommen - ein unmögliches Programm ist?
StudentsTea

Ich denke, ich kann das Kaninchenloch sehen, das wir hinuntergehen: Damit p () p auswerten kann, muss p eingegeben werden; warum nicht p? Damit p () p auswerten kann, muss p eine Feed-Eingabe sein. warum nicht ... und so weiter.
StudentsTea

1
"Es gibt eine Vielzahl von absolut legitimen Programmen, die für immer laufen sollen" - denken Sie oder Halbentscheider oder Dinge wie Betriebssysteme? Wenn letzteres der Fall ist, geht dies über den Rahmen von TMs hinaus und sollte daher bei solchen Anfängerfragen (imho) nicht berücksichtigt werden.
Raphael

3

Es gibt einen weiteren Beweis durch Widerspruch, den Sie vielleicht besser mögen, nach dem Vorbild von Berrys Paradoxon. Für eine TuringmaschineT, Lassen N(T)die Ausgabe der Turing-Maschine sein, wenn sie auf einem leeren Band ausgeführt wird, interpretiert als Zahl; möglicherweiseN(T)ist undefiniert, wenn die Maschine nie anhält. LassenXn sei die kleinste Zahl, die von einer Turingmaschine höchstens nicht produziert werden kann nZustände (eine solche Anzahl existiert, da es endlich viele solcher Turingmaschinen gibt). Angenommen, das Halteproblem wäre lösbar. Dann könnten wir eine Turing-Maschine konstruieren, die den folgenden Algorithmus implementiert:

  1. Schreiben Sie die binäre Codierung von n auf dem Band.
  2. Gehen Sie alle Turingmaschinen mit höchstens durch n Berechnen Sie für jeden von ihnen, der anhält, die Zahl, die sie berechnen.
  3. Geben Sie die kleinste Zahl aus, die in Schritt 2 nicht angezeigt wird Xn.

Die letzten beiden Stufen können unter Verwendung einer festen Turingmaschine mit implementiert werden C Staaten, und die erste mit einem Extra log2nZustände. Insgesamt erhalten wir eine Turingmaschine mitlog2n+C Zustände, die berechnen Xn. Wannn groß genug ist, erreichen wir seitdem einen Widerspruch log2n+Cn: Auf der einen Seite, Xn sollte nicht mit einer Turing-Maschine berechenbar sein nZustände; Auf der anderen Seite berechnet die obige Maschine dies nur mitlog2n+Cn Zustände.

Ich habe diesen Beweis von Ran Raz gehört .


0

Der Punkt des Halteproblems besteht darin, dass es mit einem Algorithmus unmöglich ist, zu entscheiden, ob ein gegebener Algorithmus anhält. Natürlich können Sie Algorithmen angeben, die immer anhalten (für alle gegebenen Eingaben). Sie können dies jedoch nicht für alle Algorithmen entscheiden (z. B.)p) mit einem Algorithmus, daher kein Algorithmus h kann existieren.

Gegeben p(p(EIN)))für einen gegebenen Algorithmus EIN. Wennh sagt Ihnen EIN hält an, dann das innere p wird nicht und die äußere p wird false zurückgeben. WennM. hält das Innere nicht auf p wird nicht aufhören, sondern die äußere p wird false zurückgeben. Daher kann h nicht entscheiden, ob p anhalten wird.


1
Ihr Wortlaut ist nicht eindeutig; Sie müssen klarstellen, dass "erzählen" bedeutet "mit einem Algorithmus entscheiden" und in welcher Reihenfolge die Quantifizierer auftreten ("für jedes Programm gibt es einen Algorithmus, der ..." vs "gibt es einen Algorithmus, der ... für alle Programme ").
Raphael
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.