Kurz gesagt : Ein Algorithmus ist der konstruktive Teil eines konstruktiven Beweises, dass ein gegebenes Problem eine Lösung hat. Die Motivation für diese Definition ist der Curry-Howard-Isomorphismus zwischen Programmen und Beweisen, wenn man bedenkt, dass ein Programm nur dann ein Interesse hat, wenn es ein Problem löst, aber nachweislich. Diese Definition ermöglicht eine stärkere Abstraktion und lässt einige Türen in Bezug auf die Art der Domänen offen, die möglicherweise betroffen sind, z. B. in Bezug auf Endlichkeitseigenschaften.
Warnung . Ich versuche, einen angemessenen formalen Ansatz für die Beantwortung der Frage zu finden. Ich denke, es ist notwendig, aber es scheint, dass keiner der Benutzer, die bisher geantwortet haben (ich selbst eingeschlossen und einige davon in anderen Posts mehr oder weniger explizit erwähnt), den richtigen Hintergrund hat, um die Probleme, die damit zusammenhängen, richtig zu entwickeln Konstruktive Mathematik, Beweistheorie, Typentheorie und Ergebnisse wie der Curry-Howard-Isomorphismus zwischen Beweisen und Programmen. Ich gebe hier mein Bestes, mit allem Wissen, das ich (glaube) habe, und ich bin mir der Grenzen dieser Antwort nur zu bewusst. Ich hoffe nur, einige Hinweise zu geben, wie die Antwort meiner Meinung nach aussehen sollte. Wenn Sie einen Punkt sehen, der formal (nachweislich) eindeutig falsch ist, lassen Sie es mich jetzt in einem Kommentar - oder per E-Mail - wissen.
Einige Probleme identifizieren
Eine Standardmethode, um einen Algorithmus zu betrachten, besteht darin, anzugeben, dass ein Algorithmus ein beliebiges, endlich festgelegtes Programm für einige Computergeräte ist , einschließlich solcher, die keine Speicherbeschränkungen aufweisen. Die Sprache kann auch die Maschinensprache des Computers sein. Tatsächlich ist es ausreichend, alle Programme für ein Turing-vollständiges Computergerät zu berücksichtigen (was impliziert, dass es keine Speicherbeschränkungen gibt). Möglicherweise erhalten Sie nicht alle Algorithmen in der Form, dass Algorithmen in einer Form ausgedrückt werden müssen, die in ihren Details vom Interpretationskontext abhängt, auch theoretisch, da alles bis zu einer gewissen Kodierung definiert ist. Da es jedoch alles berechnet, was zu berechnen ist, enthält es irgendwie alle Algorithmen bis hin zur Codierung.
π
π fast alle Algorithmen uninteressant sindmöglicherweise im mathematischen Sinne von fast allen. Dies würde jedoch eine genauere Definition erfordern.
Die eigentliche Frage ist also zu wissen, was die sinnvollen Algorithmen sind. Die Antwort ist, dass die aussagekräftigen Algorithmen diejenigen sind, die ein Problem lösen und Schritt für Schritt die "Lösung", die "Antwort", auf dieses Problem berechnen. Ein Algorithmus ist interessant, wenn er mit einem Problem verbunden ist, das er löst.
Wenn wir also ein formales Problem haben, wie bekommen wir einen Algorithmus, der das Problem löst. Unabhängig davon, ob explizit oder implizit, werden Algorithmen mit der Idee verknüpft, dass es eine Lösung für das Problem gibt, die sich als richtig erweisen lässt. Ob unsere Beweistechniken korrekt sind, ist eine andere Frage, aber wir versuchen uns zumindest selbst zu überzeugen. Wenn Sie sich auf konstruktive Mathematik beschränken, was wir eigentlich tun müssen (und für die meisten Mathematiker eine sehr akzeptable axiomatische Einschränkung darstellen), müssen Sie die Existenz einer Lösung anhand von Beweisschritten nachweisen, die tatsächlich ein Konstrukt aufweisen das repräsentiert die Lösung, einschließlich möglicherweise anderer Schritte, die sie auf Richtigkeit überprüfen.
Alle Programmierer denken so etwas wie: Wenn ich mit den Daten so und so herumfummle, bekomme ich dieses Widget, das aufgrund des Satzes von Sesame genau die richtigen Eigenschaften hat, und wenn ich diese foo-erhaltende Transformation durchführe, bekomme ich die gewünschte Antwort . Der Beweis ist jedoch in der Regel informell und wir arbeiten nicht alle Details aus, was erklärt, warum ein Satellit (unter anderem) versucht hat, den Mars im Untergrund zu umkreisen. Wir tun einen Großteil der Neukonstruktion, behalten jedoch nur den konstruktiven Teil bei, der die Lösung erstellt, und beschreiben ihn in einer Computersprache als den Algorithmus, der das Problem löst.
Interessante Algorithmen (oder Programme)
Dies alles war, um die folgenden Ideen einzuführen, die Gegenstand vieler aktueller Forschungen sind (von denen ich kein Spezialist bin). Der hier verwendete Begriff " interessanter Algorithmus " stammt von mir und wurde als informeller Platzhalter für genauere Definitionen eingeführt.
Ein interessanter Algorithmus ist der konstruktive Teil eines konstruktiven Beweises, dass ein gegebenes Problem eine Lösung hat . Das heißt, der Beweis muss die Lösung tatsächlich zeigen, anstatt einfach seine Existenz zu beweisen, zum Beispiel durch Widerspruch. Weitere Einzelheiten finden Sie unter Intuitionistische Logik und Konstruktivismus in der Mathematik.
Dies ist natürlich eine sehr restriktive Definition, die nur das berücksichtigt, was ich interessante Algorithmen nannte. Daher werden fast alle ignoriert. Aber auch alle unsere Lehrbücher zum Thema Algorithmus. Sie versuchen, nur einige der Interessanten zu unterrichten.
Anhand aller Parameter des Problems (Eingabedaten) erfahren Sie Schritt für Schritt, wie Sie ein bestimmtes Ergebnis erhalten. Ein typisches Beispiel ist die Auflösung von Gleichungen (der Name Algorithmus ist eigentlich aus dem Namen eines persischen Mathematiker abgeleitet, Al-Chwarizmi , der die Auflösung einiger Gleichungen untersucht). Teile des Beweises werden verwendet, um festzustellen, dass einige im Algorithmus berechnete Werte bestimmte Eigenschaften haben, diese Teile müssen jedoch nicht im Algorithmus selbst gespeichert werden.
Dies muss natürlich in einem formalisierten logischen Rahmen geschehen, der festlegt, mit welchen Daten gerechnet wird, welche elementaren Rechenschritte zulässig sind und welche Axiome verwendet werden.
Zurück zu Ihrem Fakultätsbeispiel: Es kann als Algorithmus ausgelegt werden, wenn auch als trivialer. Die normale Fakultätsfunktion entspricht einem Beweis dafür, dass es bei gegebenem arithmetischen Rahmen und gegebenem ganzzahligen n eine Zahl gibt, die das Produkt der ersten n ganzen Zahlen ist. Dies ist ziemlich einfach, ebenso wie die Fakultätsberechnung. Für andere Funktionen könnte es komplexer sein.
Wenn Sie sich nun dazu entschließen, Fakultäten zu tabellieren, vorausgesetzt, Sie können dies, was nicht für alle ganzen Zahlen gilt (sondern für einen endlichen Wertebereich gelten könnte), müssen Sie lediglich die Existenz von Fakultäten in Ihre Axiome aufnehmen, indem Sie mit a definieren neue Axiom seinen Wert für jede ganze Zahl, so dass Sie nichts mehr zu beweisen (daher zu berechnen) brauchen.
Aber ein Axiomensystem soll endlich (oder zumindest endlich definiert) sein. Und es gibt unendlich viele Werte für Fakultät, einen pro Ganzzahl. Sie stecken also in Schwierigkeiten mit Ihrem endlichen Axiomensystem, wenn Sie eine unendliche Funktion axiomatisieren, dh auf einer unendlichen Domäne definieren. Dies führt rechnerisch dazu, dass Ihre potenzielle Tabellensuche nicht für alle ganzen Zahlen implementiert werden kann. Das würde die übliche Endlichkeitsanforderung für Algorithmen zunichte machen (aber ist es so streng, wie oft dargestellt?).
Sie könnten sich für einen endlich definierten Axiomgenerator entscheiden, der alle Fälle behandelt. Dies würde mehr oder weniger bedeuten, das standardmäßige Fakultätsprogramm in Ihren Algorithmus aufzunehmen, um das Array nach Bedarf zu initialisieren. Das nennt man Memoisation von Programmierern. Dies ist tatsächlich der Wert, der dem Äquivalent einer vorberechneten Tabelle am nächsten kommt. Es kann verstanden werden, dass eine vorberechnete Tabelle vorhanden ist, mit der Ausnahme, dass die Tabelle tatsächlich im verzögerten Auswertungsmodus erstellt wird , wann immer dies erforderlich ist. Diese Diskussion würde wahrscheinlich ein bisschen formeller sein müssen.
Sie können Ihre primitiven Operationen nach Ihren Wünschen definieren (im Einklang mit Ihrem formalen System) und ihnen die Kosten zuweisen, die Sie bei der Verwendung in einem Algorithmus wählen, um eine Komplexitäts- oder Leistungsanalyse durchzuführen. Wenn jedoch die konkreten Systeme, die Ihren Algorithmus tatsächlich implementieren (z. B. ein Computer oder ein Gehirn), diese Kostenspezifikationen nicht einhalten können, ist Ihre Analyse möglicherweise intellektuell interessant, für die tatsächliche Verwendung in der realen Welt jedoch wertlos.
21000
Welche Programme sind interessant?
Diese Diskussion sollte besser mit Ergebnissen wie dem Curry-Howard-Isomorphismus zwischen Programmen und Beweisen verknüpft werden
. Wenn irgendein Programm tatsächlich ein Beweis für etwas ist, kann jedes Programm als interessantes Programm im Sinne der obigen Definition ausgelegt werden.
Nach meinem (eingeschränkten) Verständnis ist dieser Isomorphismus jedoch auf Programme beschränkt, die in einem geeigneten Typisierungssystem gut typisiert werden können, wobei Typen Aussagen der axiomatischen Theorie entsprechen. Daher können nicht alle Programme als interessante Programme eingestuft werden. Ich vermute, dass in diesem Sinne ein Algorithmus ein Problem lösen soll.
Dies schließt wahrscheinlich die meisten "zufällig generierten" Programme aus.
Es ist auch eine etwas offene Definition eines "interessanten Algorithmus". Jedes Programm, das als interessant angesehen werden kann, ist dies auf jeden Fall, da es ein identifiziertes Typensystem gibt, das es interessant macht. Aber ein Programm, das bisher nicht typisierbar war, könnte mit einem fortgeschritteneren Typsystem typisierbar und somit interessant werden. Genauer gesagt war es immer interessant, aber mangels Kenntnis des richtigen Typensystems konnten wir es nicht wissen.
Es ist jedoch bekannt, dass nicht alle Programme typisierbar sind, da bekannt ist, dass einige Lambda-Ausdrücke, z. B. die Implementierung des Y-Kombinators , nicht in ein Soundtyp- System eingegeben werden können .
Diese Ansicht gilt nur für Programmierformalismen, die einem bestimmten axiomatischen Beweissystem direkt zugeordnet werden können. Ich weiß nicht, wie es auf einfache Computerformalismen wie die Turing-Maschine ausgedehnt werden kann. Da Algorithmus und Berechenbarkeit jedoch häufig ein Spiel der Kodierung von Problemen und Lösungen sind (denken Sie an in Lambda-Kalkül kodierte Arithmetik ), kann man davon ausgehen, dass jede formal definierte Berechnung, die als Kodierung eines Algorithmus gezeigt werden kann, auch ein Algorithmus ist. Solche Kodierungen verwenden wahrscheinlich nur einen sehr kleinen Teil dessen, was sich in einem einfachen Formalismus wie Turing Machines ausdrücken lässt.
Ein Interesse dieses Ansatzes besteht darin, dass er einen Begriff eines Algorithmus liefert, der abstrakter und unabhängig von Problemen der tatsächlichen Codierung, der "physischen Repräsentierbarkeit" der Berechnungsdomäne ist. So kann man zum Beispiel Domänen mit unendlichen Objekten betrachten, solange es eine rechnerisch fundierte Möglichkeit gibt, sie zu verwenden.