Jede Sprache, die nicht vollständig ist, kann keinen Dolmetscher für sich selbst schreiben. Ich habe keine Ahnung, wo ich das gelesen habe, aber ich habe es einige Male benutzt. Es scheint, als ob dies zu einer Art "ultimativer" nicht-Turing-vollständiger Sprache führt; die, die nur könnenvon einer Turingmaschine interpretiert werden. Diese Sprachen wären nicht notwendigerweise in der Lage, alle Gesamtfunktionen von Naturmenschen zu Naturmenschen zu berechnen, noch wären sie notwendigerweise isomorph (das sind möglicherweise die letzten Sprachen A und B, so dass es eine Funktion F gibt, die A berechnen kann, B jedoch nicht). Agda kann Gödels System T interpretieren und Agda ist total, so dass eine solche ultimative Sprache strikt mächtiger sein sollte, als es scheint, als ob Gödels System T. Mir scheint, dass eine solche Sprache mindestens so mächtig ist wie Agda (obwohl ich keine Beweise habe, nur eine Ahnung).
Wurde in dieser Richtung geforscht? Welche Ergebnisse sind bekannt (ist nämlich eine solche "ultimative" Sprache bekannt)?
Bonus: Ich mache mir Sorgen, dass es einen pathologischen Fall gibt, bei dem Funktionen, die Godels System T noch nicht berechnen konnte, nur von einer Turing-Maschine interpretiert werden können, weil damit einige wirklich merkwürdige Funktionen berechnet werden können. Ist dies der Fall oder können wir wissen, dass eine solche Sprache alles berechnen kann, was Godels System T berechnen könnte?
Antworten:
Dies ist eine schlecht formulierte Frage. Lassen Sie uns zunächst einen Sinn daraus ziehen. Ich werde es im Stil der Berechenbarkeitstheorie machen. Daher werde ich Zahlen anstelle von Zeichenfolgen verwenden: Ein Teil des Quellcodes ist eine Zahl und keine Zeichenfolge. Es spielt eigentlich keine Rolle, Sie können unten durch s t r i n g ersetzen .N string
Lassen Sie sein , Pairing - Funktion .⟨ M , n ⟩
Nehmen wir an, dass eine Programmiersprache durch die folgenden Daten gegeben ist:L = ( P, E v )
Die Tatsache, dass entscheidbar ist, bedeutet, dass es eine vollständig berechenbare Abbildung v a l i d gibt : N → { 0 , 1 }, so dass v a l i d ( n ) = 1P v a l i d: N → { 0 , 1 } . Informell sagen wir, dass es möglich ist, festzustellen, ob eine bestimmte Zeichenfolge ein gültiger Code ist. Die Funktion e v ist im Wesentlichen ein Interpreter für unsere Sprache: e v ( m , n ) führtbei Eingabe n denCode m aus- das Ergebnis kann undefiniert sein.v a l i d( n ) = 1⟺n∈P ev ev(m,n) m n
Wir können nun einige Begriffe einführen:
Andere Definitionen von " interpretiert L 2 " sind möglich, aber lassen Sie mich jetzt nicht darauf eingehen.L1 L2
Wir sagen, dass und L 2 äquivalent sind, wenn sie sich gegenseitig interpretieren.L1 L2
Es gibt die "mächtigste" Sprache von Turingmaschinen (die Sie als "Turingmaschine" bezeichnen), in der n ∈ N eine Kodierung einer Turingmaschine ist und φ ( n , m ) ist die partielle berechenbare Funktion, die "die mit n codierte Turing-Maschine bei Eingabe m ausführt ". Diese Sprache kann alle anderen Sprachen interpetieren, da wir vorausgesetzt haben, dass e v berechenbar ist.T= ( N , φ ) n ∈ N φ ( n , m ) n m e v
Unsere Definition von Programmiersprachen ist sehr entspannt. Damit das Folgende durchgehen kann, benötigen wir drei weitere Bedingungen:
Ein klassisches Ergebnis ist folgendes:
Satz: Wenn eine Sprache sich selbst interpretieren kann, ist sie nicht vollständig.
Beweis. Angenommen , ist das Universalprogramm für insgesamt Langauge L in realisiert L , das heißt für all m ∈ P und n ∈ N , E v ( u , ⟨ m , n ⟩ ) ≃ e v ( m , n ) . Als Nachfolger werden Diagonale und e v ( u , - ) in L implementiert , ebenso wie ihre Zusammensetzung k ↦u L L m∈P n∈N
Beachten Sie, dass wir die Nachfolgekarte durch eine andere Karte ohne Fixpunkte ersetzen können.
Hier ist ein kleiner Satz, von dem ich denke, dass er ein Missverständnis beseitigen wird.
Satz: Jede Gesamtsprache kann von einer anderen Gesamtsprache interpretiert werden.
Beweis. Sei eine Gesamtsprache. Wir erhalten eine Summe L ', die L interpretiert, indem wir an L seinen Bewerter e v anschließen . Genauer gesagt, lassen P ' = { ⟨ 0 , n ⟩ | n ∈ P } ∪ { ⟨ 1 , 0 ⟩ } und definieren e v ' als e v ' ( ⟨ b , n ⟩ , mL L′ L L e v P′= { ⟨ 0 , n ⟩ | n ∈ P}∪{⟨1,0⟩} ev′
Offensichtlich L ' istweil insgesamt L total. Um diesesehen L ' können simulieren L nur nehmen u = ⟨ 1 , 0
Aufgabe: [hinzugefügt am 27.06.2014] Die oben konstruierte Sprache ist nicht kompositorisch abgeschlossen. Fixiere den Beweis des Theorems so, dass L ' die zusätzlichen Anforderungen erfüllt, wenn L dies tut.L′ L′ L
Mit anderen Worten, Sie brauchen nie die volle Leistung von Turing-Maschinen, um eine Gesamtsprache zu interpretieren - eine etwas leistungsstärkere Gesamtsprache L ' reicht aus. Die Sprache L ' ist strikt mächtiger als L, weil sie L interpretiert , aber L sich selbst nicht interpretiert.L L′ L′ L L L
quelle
is_total
, was ansonsten nicht zurechenbar ist, aber keine Auswertung implementieren (da Sie auch das Bit der resultierenden Funktion berechnen müssten). Im Allgemeinen würde ich sagen, dass es keine Programmiersprache ist, wenn Sie nicht einmal einen Parser dafür implementieren können.Diese Aussage ist falsch. Betrachten Sie die Programmiersprache, in der die Semantik jedes Strings "Ignoriere deine Eingabe und halte sofort an" lautet. Diese Programmiersprache ist nicht vollständig, aber jedes Programm ist ein Dolmetscher für die Sprache.
quelle