Wie können Sie überprüfen, ob zwei Algorithmen (z. B. Merge Sort und Naive Sort) für jede Eingabe dasselbe Ergebnis liefern, wenn die Menge aller Eingaben unendlich ist?
Update: Vielen Dank, Ben, für die Beschreibung, wie dies im allgemeinen Fall nicht algorithmisch möglich ist. Daves Antwort ist eine großartige Zusammenfassung sowohl algorithmischer als auch manueller Methoden (abhängig vom menschlichen Verstand und der Metapher), die nicht immer funktionieren, aber sehr effektiv sind.
computability
formal-methods
software-engineering
software-verification
Andres Riofrio
quelle
quelle
Antworten:
Im Gegensatz zu dem, was die Neinsager sagen, gibt es dafür viele effektive Techniken.
Bisimulation ist ein Ansatz. Siehe zum Beispiel Gordons Artikel über Coinduction und Functional Programming .
Ein anderer Ansatz ist die Verwendung operationeller Theorien zur Programmäquivalenz, wie beispielsweise die Arbeit von Pitts .
Ein dritter Ansatz besteht darin, zu überprüfen, ob beide Programme dieselbe Funktionsspezifikation erfüllen. Es gibt Tausende von Artikeln zu diesem Ansatz.
Ein vierter Ansatz besteht darin, zu zeigen, dass ein Programm mithilfe von Sound- Programmtransformationen in das andere umgeschrieben werden kann .
Natürlich ist keine dieser Methoden aufgrund der Unentscheidbarkeit vollständig, aber es wurden Volumen und Arbeitsvolumen erzeugt, um das Problem anzugehen.
quelle
Um die "Es ist unmöglich" -Aussagen etwas näher zu erläutern, hier eine einfache Beweisskizze.
Wir können Algorithmen mit Ausgabe von Turing Machines modellieren, die mit der Ausgabe auf ihrem Band anhalten. Wenn Sie Maschinen haben möchten, die anhalten können, indem Sie entweder die Ausgabe auf dem Band annehmen oder ablehnen (in diesem Fall gibt es keine Ausgabe), können Sie leicht eine Codierung erstellen, mit der Sie diese Maschinen mit der Option "anhalten oder nicht anhalten" modellieren können. Es gibt keine "Ausschuss" -Maschinen.
Angenommen , ich habe einen Algorithmus P, um zu bestimmen, ob zwei solcher TMs für jeden Eingang den gleichen Ausgang haben. Dann kann ich mit einem TM A und einer Eingabe X ein neues TM B konstruieren , das wie folgt funktioniert:
Jetzt kann ich P auf A und B ausführen . B hält nicht an X an , sondern hat dieselbe Ausgabe wie A für alle anderen Eingaben. Wenn A also nicht an X anhält, haben diese beiden Algorithmen für jede Eingabe dieselbe Ausgabe. Es wurde jedoch angenommen, dass P in der Lage ist, zu erkennen, ob zwei Algorithmen für jede Eingabe dieselbe Ausgabe haben. Wenn wir also P hätten , könnten wir feststellen, ob eine beliebige Maschine bei einer beliebigen Eingabe anhält, was das Halteproblem ist. Da das Halteproblem als unentscheidbar bekannt ist, kann P nicht existieren.
Dies bedeutet, dass es keinen allgemeinen (berechenbaren) Ansatz gibt, um zu bestimmen, ob zwei Algorithmen die gleiche Ausgabe haben, die immer funktioniert. Daher müssen Sie die Argumentation speziell auf das zu analysierende Algorithmenpaar anwenden. In der Praxis kann es jedoch berechenbare Ansätze geben, die für große Klassen von Algorithmen funktionieren, und es gibt sicherlich Techniken, mit denen Sie versuchen können, einen Beweis für einen bestimmten Fall zu erarbeiten. Die Antwort von Dave Clarke gibt Ihnen einige relevante Dinge, die Sie hier ansehen sollten. Das Ergebnis "Unmöglichkeit" gilt nur für die Entwicklung einer generischen Methode, die das Problem für alle Algorithmenpaare ein für alle Mal löst.
quelle
Es ist im Allgemeinen unmöglich, aber viele Einschränkungen können es möglich machen. Beispielsweise können Sie die Gleichwertigkeit von zwei Programmen mit linearem Code mithilfe von BDDs überprüfen. Die symbolische Ausführung kann viele andere Fälle behandeln.
quelle
Es ist unmöglich, einen Algorithmus zu entwickeln, der diese Gleichheit im Allgemeinen beweist. Hinweis: Reduzierung des Halteproblems.
quelle