Dies ist eine Herausforderung für Polizisten und Räuber, die darauf basiert, Sprachen zu definieren und zu beweisen, dass sie vollständig sind.
Dies ist der Thread der Polizei. Der Räuberfaden ist hier .
Cops
Als Polizist bereiten Sie zwei Dinge vor:
Eine formale Spezifikation einer Programmiersprache oder eines anderen Computersystems. (Computersysteme sind unten definiert.)
Ein Beweis dafür, dass Ihr System vollständig ist, gemäß der etwas strengen Definition unten.
Sie werden Ihre Spezifikation Ihrer Sprache veröffentlichen und die Räuber werden versuchen, sie zu "knacken", indem sie ihre Turing-Vollständigkeit beweisen. Wenn Ihre Einreichung nicht innerhalb einer Woche geknackt wird, können Sie sie als sicher markieren und Ihren Beweis veröffentlichen. (Ihre Antwort kann ungültig werden, wenn jemand einen Fehler in Ihrem Beweis findet, es sei denn, Sie können ihn beheben.)
Dies ist ein Beliebtheitswettbewerb , daher ist der Gewinner die Antwort, die die meisten Stimmen hat und die nicht geknackt oder ungültig ist. Die Herausforderung ist offen - ich werde keine Antwort annehmen.
Für diese Herausforderung wird ein Rechensystem als vier Dinge definiert:
Ein "Programmsatz"
P
. Dies ist eine zählbar unendliche Menge, z. B. Zeichenfolgen, Ganzzahlen, Binärbäume, Konfigurationen von Pixeln in einem Raster usw. (siehe jedoch die technische Einschränkung unten.)Eine "Eingabemenge"
I
, die ebenfalls eine zählbar unendliche Menge sein wird und nicht dieselbe Menge sein muss wieP
(obwohl dies möglich ist).Ein „output set“
O
, das wird in ähnlicher Weise eine countably unendliche Menge sein , und kann oder kann nicht die gleiche sein wieP
oderI
Eine deterministische, mechanistische Prozedur zum Erzeugen einer Ausgabe
o
von Programmp
und Eingabei
, wop
,i
undo
sind MitgliederP
,I
undO
jeweils. Dieses Verfahren sollte so beschaffen sein, dass es im Prinzip auf einer Turing-Maschine oder einem anderen abstrakten Berechnungsmodell implementiert werden kann. Abhängig vom Programm und seiner Eingabe kann die Prozedur natürlich nicht angehalten werden.
Die Sets P
, I
und O
muss so beschaffen sein , dass man sie als Zeichenkette in einer berechenbaren Weise ausdrücken kann. (Für die meisten vernünftigen Entscheidungen spielt dies keine Rolle. Diese Regel verhindert, dass Sie seltsame Sätze auswählen, z. B. den Satz von Turing-Maschinen, die nicht anhalten.)
Die Vollständigkeit wird wie folgt definiert:
- Für jede berechenbare Teilfunktion
f
vonI
bisO
gibt es ein Programm,p
inP
dem gegebenp
und eingegeben wirdi
, die Ausgabe ist,f(i)
wennf(i)
sie einen Wert hat. (Andernfalls wird das Programm nicht angehalten.)
Das Wort "berechenbar" in der obigen Definition bedeutet "kann mit einer Turing-Maschine berechnet werden".
Beachten Sie, dass weder Regel 110 noch bitweise zyklische Tags nach dieser Definition Turing-vollständig sind, da sie nicht die erforderliche Eingabe-Ausgabe-Struktur haben. Der Lambda-Kalkül ist Turing vollständig, solange wir die Kirchenzahlen definieren I
und O
sein sollen . (Es ist nicht Turing-vollständig, wenn wir Lambda-Ausdrücke im Allgemeinen nehmen und sein.)I
O
Beachten Sie, dass Sie keine Implementierung Ihrer Sprache bereitstellen müssen, aber Sie können gerne eine in Ihre Antwort aufnehmen, wenn Sie möchten. Sie sollten sich jedoch nicht auf die Implementierung verlassen, um die Sprache in irgendeiner Weise zu definieren - die Spezifikation sollte an sich vollständig sein, und wenn es einen Widerspruch zwischen der Spezifikation und der Implementierung gibt, sollte dies als Fehler in der Implementierung behandelt werden.
Antworten:
Arithmetik mit verbundenen Augen
Möglicherweise eine relativ einfache Sprache, relativ gesehen. (Es gibt Grenzen, wie schwierig eine Sprache sein kann, weil ich sie selbst beweisen muss!)
Für diese Sprache ist der Programmsatz der Satz von Arithmetikprogrammen mit verbundenen Augen, wie im Abschnitt "Programm" unten angegeben, der Eingabesatz ist der Satz positiver Ganzzahlen und der Ausgabesatz ist der Satz von Ganzzahlen (der gesamte Satz, nicht nur die positiven ganzen Zahlen).
Diese Sprache ist ziemlich interessant - vielleicht sogar praktisch nützlich -, da sie einen mehr oder weniger vollständigen Mangel an Kontrollfluss aufweist und vollständig auf Berechnungen von Zahlen basiert, die Sie nicht sehen können. Dies macht es möglicherweise als Sprache für die Implementierung von Programmen in homomorphen Verschlüsselungssystemen nützlich .
Spezifikation
Arithmetik mit verbundenen Augen ist eine esoterische Programmiersprache mit den folgenden Spezifikationen:
Datenspeicher
Ein Status eines laufenden Arithmetikprogramms mit verbundenen Augen besteht aus sechs Variablen, von denen jede eine Ganzzahl speichern kann. (Es gibt keine Grenzen, wie groß oder klein diese Zahlen bekommen können, insbesondere können sie negativ werden .) Die Variablen werden genannt
a
,b
,c
,d
,e
, undi
.Zu Beginn des Programms werden
a
toe
inclusive jeweils auf 0 undi
auf eine positive Ganzzahl aus Benutzereingaben initialisiert. (Wenn keine Eingabe verfügbar ist,i
wird diese auf 1 initialisiert.)Wenn das Programm die Ausführung beendet (dies kann nur aufgrund der Division durch Null erfolgen), wird der Wert
i
unmittelbar vor dem Versuch der Division als Ausgabe des Programms verwendet.Programm
Ein Arithmetikprogramm mit verbundenen Augen ist eine Liste von Befehlen, von denen jeder eine der folgenden Formen hat (wobei v durch einen beliebigen Variablennamen ersetzt werden kann, möglicherweise bei jeder Verwendung durch einen anderen Namen):
=
v+
v=
v-
v=
v*
v=
v/
vMan beachte , dass jeder Operand der Befehle muss eine Variable sein; Diese Sprache erlaubt nicht die Verwendung von Literal-Ganzzahlen.
Die Ausführung des Programms erfolgt durch Ausführen der einzelnen Befehle nacheinander, anschließendes Zurückschleifen zum Start und erneutes Ausführen der Befehle nacheinander ad infinitum (oder bis versucht wird, durch Null zu teilen, wodurch das Programm beendet wird). .
Jeder Befehl hat die gleiche Semantik, die Sie von der Notation erwarten würden, die sich nicht von der unterscheidet, die von den meisten praktischen Programmiersprachen verwendet wird: Die Werte der zweiten und dritten Variablen, die im Befehl angegeben sind, werden als arithmetische Operation (Addieren / Subtrahieren) verwendet / multiplizieren / dividieren jeweils für die vier Befehlsformen) wird auf sie angewendet und der resultierende Wert in der ersten Variablen gespeichert. Division ist hier eine ganzzahlige Division, die auf 0 gerundet wird.
Es gibt keinen anderen Kontrollfluss als den Programmausgang. Die Befehle werden immer nacheinander ausgeführt, bis eine Division durch Null (falls vorhanden) erfolgt und das Programm beendet wird. Insbesondere gibt es keine Möglichkeit, Variablen direkt zu lesen, sondern sie nur als Berechnungsquelle zu verwenden, deren Ergebnisse sich auf die Werte auswirken, die anderen Variablen zugewiesen wurden.
quelle
i
- die immer "halt" ist - nicht funktioniert Teil der Ausgabe sein), aber es ist nah genug, dass ich dies nicht als sicher markieren werde, da Sie bei ausreichender Zeit und ausreichender Klärung der Regeln eindeutig einen vollständigen Riss bekommen würden. Ich möchte diese technische Herausforderung nicht gewinnen.