"Alan Turing hat 1936 bewiesen, dass ein allgemeiner Algorithmus zur Lösung des Halteproblems für alle möglichen Programm-Eingabe-Paare nicht existieren kann."
Kann ich einen allgemeinen Algorithmus finden, um das Halteproblem für einige mögliche Programmeingabepaare zu lösen ?
Kann ich eine Programmiersprache (oder Sprachen) finden, in der ich für jede Art von Programm in dieser Sprache entscheiden kann, ob das Programm beendet wird oder für immer ausgeführt wird?
Antworten:
Ja sicher. Sie könnten beispielsweise einen Algorithmus schreiben, der für jedes Programm, das weder Schleifen noch Rekursionen enthält, "Ja, es wird beendet" und für jedes Programm, das eine
while(true)
Schleife enthält , die definitiv erreicht wird und keine enthält, "Nein, es wird nicht beendet" eine break-Anweisung und "Dunno" für alles andere.Nicht wenn diese Sprache Turing-vollständig ist, nein.
Es gibt jedoch vollständige Nicht-Turing-Sprachen wie zum Beispiel Coq , Agda oder Microsoft Dafny, für die das Problem des Anhaltens entschieden werden kann (und in der Tat von den jeweiligen Typsystemen bestimmt wird, wodurch sie zu Gesamtsprachen werden (dh ein Programm, das möglicherweise nicht beendet wird, wird dies nicht tun) kompilieren)).
quelle
Ich denke, alle Antworten hier sind vollständig und verfehlen den Punkt. Die Antwort auf die Frage lautet: Unter der Annahme, dass das Programm anhalten soll, sollten Sie in der Lage sein, anzuzeigen, dass es anhält. Wenn Sie nicht zeigen können, dass es leicht stoppt, sollte das Programm als sehr schlecht geschrieben und von der Qualitätskontrolle als solches abgelehnt angesehen werden.
Ob Sie tatsächlich einen geeigneten Maschinenalgorithmus schreiben können, hängt von der eingegebenen Programmiersprache ab und davon, wie ehrgeizig Sie sind. Es ist ein vernünftiges Entwurfsziel für eine Programmiersprache, die Beendigung leicht nachweisen zu können.
Wenn die Sprache C ++ ist, können Sie das Tool wahrscheinlich nicht schreiben, in der Tat ist es unwahrscheinlich, dass Sie jemals den Parser zum Laufen bringen, geschweige denn die Kündigung beweisen. Für eine besser strukturierte Sprache sollten Sie in der Lage sein, einen Beweis zu erstellen, oder zumindest mit bestimmten Annahmen: Im letzteren Fall sollte das Tool diese Annahmen ausgeben. Ein ähnlicher Ansatz wäre, Abschlusszusagen in die Sprache aufzunehmen und in komplexen Situationen zu verwenden, in denen das Tool den Zusagen vertraut.
Die Quintessenz ist, dass niemand zu verstehen scheint, dass der Beweis, dass ein Programm anhält, in der Tat möglich ist, weil (gute) Programmierer, die beabsichtigen, solche anhaltenden Programme zu schreiben, dies immer absichtlich und mit einem mentalen Bild davon tun, warum sie abbrechen und richtig handeln: Ein solcher Code ist absichtlich geschrieben, so ist es klar, dass sie anhalten und korrekt sind und wenn ein vernünftiger Algorithmus dies nicht beweisen kann, möglicherweise mit einigen Hinweisen, dann sollte das Programm abgelehnt werden.
Der Punkt: Programmierer schreiben keine willkürlichen Programme, so dass die These des Haltesatzes nicht erfüllt ist und die Schlussfolgerung nicht zutrifft.
quelle
ausgezeichnete und (wahrscheinlich ungewollt tiefe) Frage. Es gibt in der Tat Programme zur Erkennung von Unterbrechungen, die bei einer begrenzten Anzahl von Eingaben erfolgreich sein können. Es ist ein aktives Forschungsgebiet. es ist sehr eng mit (automatisierten) Theoremprüfbereichen verbunden.
Die Informatik scheint jedoch keinen genauen Begriff für "Programme" zu haben, die "manchmal" erfolgreich sind. Das Wort "Algorithmus" ist normalerweise für Programme reserviert, die immer anhalten.
Das Konzept scheint sich deutlich von probabilistischen Algorithmen zu unterscheiden, bei denen CS-Theoretiker darauf bestehen, dass eine bekannte oder berechenbare Wahrscheinlichkeit für ihren Erfolg besteht.
Es gibt einen Begriff Semialgorithmen , der manchmal verwendet wird, aber anscheinend ein Synonym für rekursiv aufzählbar oder nicht berechenbar ist.
Nennen Sie sie hier also Quasialgorithmen . Das Konzept ist anders als entscheidbar oder unentscheidbar.
in CS scheint diese "Quasi-Algorithmus-Hierarchie" bislang meist nur informell untersucht worden zu sein.
es zeigt sich in der fleißigen Biberforschung [1] und dem PCP-Problem [2]. Tatsächlich kann ein DNA-basierter Angriff auf PCP als quasialer Algorithmus angesehen werden. [3] und es ist in anderen Bereichen zu sehen, die bereits erwähnt wurden, wie der Beweis des Theorems [4].
[1] New Millenium Attack auf das Problem der beschäftigten Biber
[2] Korrespondenzprobleme bei der Bekämpfung von Posts von Zhao (v2?)
[3] Verwenden von DNA zur Lösung des Bounded-Post-Correspondence-Problems von Kari et al
[4] Beweisen der Programmbeendigung durch Cook et al., Comm. der ACM
(Das ist also eigentlich eine sehr tiefe Frage, die es definitiv verdient, auf TCS.SE zu sein, imho ... vielleicht kann jemand sie dort so nachfragen, dass sie passt und bleibt)
quelle
Solange die betreffende Programmiersprache ausreichend komplex ist (dh wenn sie vollständig ist), gibt es immer Programme in der Sprache, die kein Programm als beendet erweisen kann.
Da alle bis auf die primitivsten Sprachen Turing vollständig sind (es sind nur Variablen und Bedingungen erforderlich), können Sie wirklich nur sehr kleine Spielzeugsprachen erstellen, für die Sie das Halteproblem lösen können.Bearbeiten: Lassen Sie mich in Anbetracht der Kommentare etwas präziser sein: Jede Sprache, für die Sie das Halteproblem lösen könnten, müsste zwangsläufig unvollständig sein. Dies schließt jede Sprache aus, die einen geeigneten Satz grundlegender Bestandteile enthält (z. B. "Variablen, Bedingungen und Sprünge" oder, wie @ sepp2k sagt, eine generische "while" -Schleife).
Anscheinend gibt es mehrere praktische "einfache" Sprachen wie diese (zB Theoremlöser wie Coq und Agda). Wenn diese Ihrer Vorstellung einer "Programmiersprache" entsprechen, können Sie untersuchen, ob sie eine Art von Vollständigkeit erfüllen oder ob das Halteproblem für sie lösbar ist.
quelle
Das ist ziemlich trivial. Wenn wir die Vereinigung einer Teilmenge von angehaltenen TMs und einer Teilmenge von nicht angehaltenen TMs nehmen, wird das Ergebnis aus TMs gebildet, für die das Anhalten-Problem entschieden werden kann (führen Sie beide Maschinen parallel aus, wenn die erste die TM akzeptiert) stoppt, wenn der zweite akzeptiert, stoppt die Maschine nicht). Dies wird jedoch nicht zu interessanten Sprachen führen.
quelle
Ja, das kannst du, aber ich bezweifle, dass es nützlich sein wird. Sie müssten wahrscheinlich eine Fallanalyse durchführen und könnten dann nur nach den offensichtlichsten Fällen suchen. Beispielsweise könnten Sie eine Datei für den Code abrufen
while(true){}
. Wenn die Datei diesen Code hat, wird ^ nie beendet. Allgemeiner könnte man sagen, dass ein Programm ohne Schleife oder Rekursion immer beendet wird, und es gibt mehrere Fälle, in denen Sie garantieren könnten, dass ein Programm beendet wird oder nicht, aber selbst für ein mittelgroßes Programm wäre dies sehr schwierig und in vielen Fällen wäre es nicht möglich, Ihnen eine Antwort zu geben.tl; dr: Ja, aber Sie werden nicht in der Lage sein, es für die meisten nützlichen Programme nützlich zu machen.
^ Ja, technisch gesehen, wenn dieser Code nicht im Codepfad ist oder es andere Threads gibt, könnte er immer noch enden, aber ich mache hier einen allgemeinen Punkt.
quelle