Es ist leicht zu verwechseln, was es bedeutet, eine reelle Zahl "darzustellen" oder "umzusetzen". In der Tat erleben wir eine Diskussion in den Kommentaren, in denen die Darstellung umstritten ist. Also lassen Sie mich zuerst darauf eingehen.
Woher wissen wir, dass eine Implementierung korrekt ist?
Die Theorie, die erklärt, wie man Dinge in einem Computer darstellt, ist Realisierbarkeit . Die Grundidee ist, dass wir für eine Menge einen Datentyp τ und für jedes x ∈ X eine Menge von Werten vom Typ τ auswählen, die dies realisieren . Wir schreiben v ⊢ x ∈ X, wenn v ein Wert ist, der x realisiert . Zum Beispiel (ich werde Haskell ohne guten Grund verwenden), könnte eine sinnvolle Implementierung von N der Datentyp sein, bei dem v ⊢ k ∈ N ist, wenn vXτx ∈ Xτv ⊢ x ∈ XvxNInteger
v ⊢ k ∈ NvErgibt die Ziffer (also insbesondere nicht eine natürliche Zahl darstellen, und auch nicht ein divergierendes Programm). Aber einige Joker konnten zu Fuß durch und legen nahe , dass wir verwenden natürliche Zahlen mit vertreten zu T r u e ⊢ 42 ∈ N und F ein l s e ⊢ n ∈ N für n ≠ 42 . Warum ist das falsch? Wir brauchen ein Kriterium .k¯¯¯-42
Bool
T r u e ⊢42∈ NF eine l s e ⊢n∈ Nn ≠ 42
Im Fall von "Joker-Nummern" besteht die einfache Beobachtung darin, dass die Addition nicht implementiert werden kann. Angenommen, ich sage Ihnen, ich habe zwei Zahlen, die beide durch . Können Sie einen Realisator für ihre Summe geben? Nun, das hängt davon ab, ob die Summe 42 ist, aber Sie können es nicht sagen. Da die Addition ein "wesentlicher Bestandteil der natürlichen Zahlen" ist, ist dies nicht akzeptabel. Mit anderen Worten, bei der Implementierung geht es nicht um Mengen, sondern um Strukturen , dh wir müssen Mengen so darstellen, dass es möglich ist, auch die relevante Struktur zu implementieren. Lassen Sie mich das betonen:F a l s e
Wir implementieren Strukturen, keine bloßen Mengen. Daher müssen wir in der Lage sein, die gesamte Struktur zusammen mit Operationen und allen Axiomen zu implementieren, damit die Implementierung korrekt ist.
Wenn Sie sich nicht an diesen Grundsatz halten, müssen Sie ein alternatives mathematisches Kriterium für die Richtigkeit vorschlagen . Ich kenne keinen.
Beispiel: Darstellung natürlicher Zahlen
Für natürliche Zahlen wird die relevante Struktur durch Peano-Axiome beschrieben, und das entscheidende Axiom, das implementiert werden muss, ist Induktion (aber auch , Nachfolger, + und × ). Wir können anhand der Realisierbarkeit berechnen, was die Implementierung der Induktion bewirkt. Es stellt sich heraus, dass es sich um eine Karte handelt (wobei es sich um den noch unbekannten Datentyp handelt, der natürliche Zahlen darstellt)0+×nat
induction : 'a -> (nat -> 'a -> 'a) -> 'nat -> 'a
befriedigend induction x f zero = x
und induction x f (succ n) = f n (induction x f n)
. All dies kommt aus der Realisierbarkeit. Wir haben ein Kriterium: Eine Implementierung von natürlichen Zahlen ist korrekt, wenn sie eine Implementierung von Peano-Axiomen erlaubt. Ein ähnliches Ergebnis würde erhalten, wenn wir die Charakterisierung von Zahlen als Anfangsalgebra für den Funktor .X↦ 1 + X
Richtige Implementierung von reellen Zahlen
Lasst uns die Aufmerksamkeit auf die reellen Zahlen und die vorliegende Frage lenken. Die erste Frage lautet: "Wie ist die relevante Struktur der reellen Zahlen?" Die Antwort lautet: Archimedischer Cauchy füllt das bestellte Feld aus . Dies ist die gängige Bedeutung von "reellen Zahlen". Sie können es nicht ändern, es wurde von anderen für Sie repariert (in unserem Fall erweisen sich die alternativen Dedekind-Reals als isomorph zu den Cauchy-Reals, die wir hier betrachten.). Sie können keinen Teil davon wegnehmen. Sie dürfen nicht sagen: "Es ist mir egal, ob Sie Additionen implementieren" oder "Die Reihenfolge ist mir egal". Wenn Sie das tun, dürfen Sie es nicht als "reelle Zahlen" bezeichnen, sondern als "reelle Zahlen, bei denen wir die lineare Reihenfolge vergessen".
Ich werde nicht auf alle Details eingehen, sondern nur erläutern, wie die verschiedenen Teile der Struktur verschiedene Operationen für Real ergeben:
- Im archimedischen Axiom geht es darum, rationale Approximationen von Realwerten zu berechnen
- Die Feldstruktur liefert die üblichen arithmetischen Operationen
- Die lineare Reihenfolge gibt uns ein halbentscheidbares Verfahren zum Testen von x < y
lim : (nat -> real) -> real
( xn)n m , n| xn- xm| ≤ 2min ( n , m )m , n
Was wir nicht bekommen, ist eine Testfunktion für Gleichheit. Es gibt nichts in den Axiomen für Reals , die das fragt sein entscheidbar. (Im Gegensatz dazu implizieren die Peano-Axiome, dass die natürlichen Zahlen bestimmbar sind, und Sie können dies beweisen, indem Sie sie nur als unterhaltsame Übung implementieren .)=eq : nat -> nat -> Bool
induction
Es ist eine Tatsache, dass die übliche Dezimaldarstellung von Realwerten, die die Menschheit verwendet, schlecht ist, weil wir damit nicht einmal Addition implementieren können. Fließkomma mit unendlicher Mantisse versagt ebenfalls (Übung: Warum?). Was jedoch funktioniert, ist eine vorzeichenbehaftete Zifferndarstellung, dh eine, bei der sowohl negative als auch positive Ziffern zulässig sind. Oder wir könnten Rationalisierungssequenzen verwenden, die den oben genannten Cauchy-Schnelltest erfüllen.
Die Tsuyoshi-Darstellung implementiert auch etwas, aber nichtR
Betrachten wir die folgende Darstellung von Real: Ein Real wird durch ein Paar wobei eine schnelle Cauchy-Folge ist, die zu konvergiert, und ein Boolescher ist, der angibt, ob eine ganze Zahl ist. Damit dies eine Repräsentation der Realwerte ist, müssten wir eine Addition implementieren, aber wie sich herausstellt, können wir die Booleschen Flags nicht berechnen. Das ist also keine Repräsentation der Realitäten. Aber es repräsentiert immer noch etwas, nämlich die Teilmenge des Reals( q , b ) ( q n ) n x b x Z ≤ ( R ≤ Z ) Z ≤ ( R ≤ Z ) Rx( q,b)(qn)nxbxZ∪(R∖Z). In der Tat, nach der Realisierbarkeit Auslegung wird eine Vereinigung mit einem Flag implementiert angibt , welcher Teil der Union sind wir in. Im Übrigen ist ein nicht gleich zu , es sei denn , Sie in ausgeschlossenen glauben, die nicht umgesetzt werden können , und ist daher durchaus für diese Diskussion nicht relevant. Wir werden von Computern gezwungen , Dinge intuitiv zu tun.Z∪(R∖Z)R
Wir können nicht testen, ob ein Real eine ganze Zahl ist
Lassen Sie mich zum Schluss die gestellte Frage beantworten. Wir wissen jetzt, dass eine akzeptable Repräsentation der Realitäten eine durch schnelle Cauchy-Sequenzen von Rationals ist. (Ein wichtiger Satz besagt, dass zwei beliebige Darstellungen von Real, die akzeptabel sind, tatsächlich rechnerisch isomorph sind.)
Satz: Das Testen, ob ein Real eine ganze Zahl ist, ist nicht entscheidbar.
Beweis. Angenommen, wir könnten testen, ob ein Real eine ganze Zahl ist (natürlich wird der Real durch eine schnelle Cauchy-Sequenz realisiert). Die Idee, mit der Sie einen viel allgemeineren Satz beweisen können, besteht darin, eine schnelle Cauchy-Folge von Nicht-Ganzzahlen zu konstruieren, die zu einer ganzen Zahl konvergiert. Das ist einfach, nimm einfach . Lösen Sie als Nächstes das Halteproblem wie folgt. Definieren Sie bei gegebener Turing-Maschine eine neue Folge durch
Das heißt, die neue Sequenz sieht aus wie die Sequenz , solangex n = 2 - n T ( y n ) n y n = { x n, wenn T nicht innerhalb von n Schritten gestoppt hat x m, wenn T in Schritt m gestoppt hat und m ≤ n ( x n ) n T x m T m T z = lim n y n z 0(xn)nxn=2−nT(yn)n
yn={xnxmif T has not stopped within n stepsif T stopped in step m and m≤n
(xn)nTläuft, aber dann bleibt es bei " wenn in Schritt anhält . Sehr wichtig ist, dass die neue Sequenz auch eine schnelle Cauchy-Sequenz ist (und wir können dies beweisen, ohne zu wissen, ob anhält). Daher können wir seine Grenze berechnen , da unsere Darstellung von korrekt ist. Testen Sie, ob eine Ganzzahl ist. Wenn dies der Fall ist, muss es und dies geschieht nur, wenn für immer ausgeführt wird. Andernfalls ist keine ganze Zahl, daher muss aufgehört haben. QED.
xmTmTz=limnynz0z TTzT
Aufgabe: Passen Sie den obigen Beweis an, um zu zeigen, dass wir nicht auf rationale Zahlen testen können. Passen Sie es dann an, um zu zeigen, dass wir nichts Nicht-Triviales testen können (dies ist etwas schwieriger).
Manchmal sind die Leute verwirrt über all dieses Testgeschäft. Sie denken, wir haben bewiesen, dass wir niemals testen können, ob ein Real eine ganze Zahl ist. Aber sicher ist 42 ein Real und wir können erkennen, ob es eine ganze Zahl ist. Tatsächlich können wir mit jedem bestimmten Real, das wir uns einfallen lassen, , , usw., sehr gut sagen, ob es sich um ganze Zahlen handelt. Wir können genau sagen, weil wir zusätzliche Informationen haben: Diese Reals werden uns nicht als Sequenzen gegeben, sondern als symbolische Ausdrücke, aus denen wir das Tsuyoshi-Bit berechnen können. Sobald die einzige Information, die wir über das Reale haben, eine Folge rationaler Annäherungen ist, die sich diesem annähern (und ich auch)88 ln 89 e π √sin1188ln89 nneπ163√bedeutet nicht einen symbolischen Ausdruck, der die Sequenz beschreibt, sondern eine Blackbox, die den ten Term bei Eingabe von ) ausgibt, dann sind wir genauso hilflos wie Maschinen.nn
Die Moral der Geschichte
Es macht keinen Sinn, über die Implementierung eines Sets zu sprechen, wenn wir nicht wissen, welche Art von Operationen wir darauf ausführen möchten.