Warum können wir annehmen, dass ein Algorithmus als Bitfolge dargestellt werden kann?

17

Ich beginne ein Buch über Computational Complexity und Turing Machines zu lesen. Hier ist Zitat:

Ein Algorithmus (dh eine Maschine) kann als Bitfolge dargestellt werden, sobald wir uns für eine kanonische Codierung entschieden haben.

Diese Behauptung ist eine einfache Tatsache, aber ich kann es nicht verstehen.

Zum Beispiel, wenn ich einen Algorithmus habe, der als Eingabe nimmt und berechnet oder:x(x+1)2

int function (int x){
   x = x + 1; 
   return x**2; 
}

Wie kann dies mit dem Alphabet als Zeichenfolge dargestellt werden ?{0,1}

Kenenbek Arzymatov
quelle
38
Sie kennen nicht die absoluten Mindestanforderungen, um zu verstehen, wie Text codiert wird. Heute ist ein großartiger Tag zum Lernen! joelonsoftware.com/2003/10/08/…
Eric Lippert
1
Ich denke, OP könnte dies aus einem anderen Blickwinkel betrachten, der auf einer Mehrdeutigkeit im zitierten Text beruht. Ich denke, OP bedeutet "wie kann die gesamte Maschine und der Algorithmus als Bit-String aufgebaut werden", nicht die Eingabe in die Turing-Maschine selbst. Der zitierte Text impliziert, dass der gesamte Algorithmus selbst ausgeführt werden kann, aber ein utf-codiertes Bit der Sprache c sagt nichts darüber aus, wie eine Maschine tatsächlich auf diese Zeichenfolge reagieren würde.
Sentinel
3
... Ich denke, jeder hier versteht die Quelle falsch und nimmt den Witz zu weit, auf Kosten von Romas Unerfahrenheit. In den meisten Kommentaren und Antworten geht es um die Codierung des Texts für die willkürliche Übertragung, während im Zitat der Algorithmus für den Verbrauch durch eine Turing-Maschine codiert wird. Die (derzeit) akzeptierte Antwort berührt sie zumindest im zweiten Satz.
Izkata
2
@Izkata Ich bin mir nicht sicher, ob Ihnen bewusst ist, dass diese beiden Aussagen aufgrund der Universalität gleichwertig sind.
Konrad Rudolph
15
Das Lustige ist, dass ich, um Ihren codierten Algorithmus lesen zu können, ihn unbedingt in eine Folge von Bits umwandeln musste, sobald Sie ihn eingegeben haben. Es wurde nie anders dargestellt - von Ihrer Tastatur bis zu meinem Monitor. Es hatte eine nicht-binäre Darstellung nur in unseren Köpfen; und auf der physiologischen Ebene ist, wenn man sich Synapsen ansieht, sogar das umstritten.
Peter - Reinstate Monica

Antworten:

45

Die naivste und einfachste Antwort auf Ihre Frage ist, dass der bereitgestellte Code (und der kompilierte Maschinencode) tatsächlich als syntaktische Zeichenfolgen von {0,1} * dargestellt werden. Da es sich bei den von Ihnen ausgeführten Programmen um Turing-Maschinen handelt, handelt es sich um eine lineare Liste von Operationen / Anweisungen. Es gibt keinen Grund, warum diese nicht als Bits / Bytes dargestellt werden können.

Daniel F
quelle
Wie genau stellen Sie Turing machine als Anweisungsliste dar? Die übliche Definition ist so etwas .
Svick
@svick Wie in meiner Antwort unten erwähnt, verwenden Sie ein universelles TM, das die Beschreibung eines TM als Eingabe (in geeigneter Weise codiert) verwendet
dseuss
@svick Eine Programmiersprache mit einfachen Anweisungen zum Bewegen eines Zeigers über ein Band? Ich glaube, ein Beispiel dafür könnte die esoterische Programmiersprache Brainfuck sein . Beispielcode
LukStorms
@ LukStorms Ich glaube nicht, dass man das mehr eine "Turing-Maschine" nennen kann.
Svick
52

Sie haben bereits eine Darstellung dieser Funktion als Text. Konvertieren Sie jedes Zeichen mithilfe der ASCII-Codierung in einen Ein-Byte-Wert. Das Ergebnis ist dann eine Folge von Bytes, dh eine Folge von Bits, dh eine Zeichenkette über dem Alphabet . Das ist ein Beispiel für eine Codierung.{0,1}

DW
quelle
Genau. Und wie ich oben sagte, geschah es, während Roma es schrieb. Sogar die Glyphen, die ich auf meinem Monitor sehe, sind s / w-Pixel, dh Binärinformationen, die über eine Binärdatenverbindung von einem Binärspeicher gesendet werden, der über Binärsteuerungen mit einem Binärnetzwerk verbunden ist. Ist es möglich , jeden Algorithmus als Bitfolge darzustellen? Mehr als das: Es ist unvermeidlich, wenn Sie sich nicht auf analoge Medien und persönliche Kommunikation beschränken.
Peter - Reinstate Monica
@ PeterA.Schneider Die Verwendung analoger Medien oder von Angesicht zu Angesicht bedeutet nicht unbedingt, dass keine diskrete Codierung eingebettet ist. Die Verwendung einer natürlichen Sprache ist nicht weit von der Verwendung einer diskreten Codierung entfernt, nicht wahr?
Jean-Baptiste Yunès
32

Ich kann nicht widerstehen ...

⡂⡀⣀⢀⣄⡀⣰⡉⡀⠀⡀⡀⣀⠀⢀⣀⢀⣄⡀⡂⢀⣀⡀⢀⢀⡀⠀⡰⣀⠀⣀⠀⡂⡀⣀⢀⣄⡰⡀⢠⠂
⡇⡏⠀⡇⡇⠀⢸⠀⡇⢀⡇⡏⠀⡇⣏⠀⠀⡇⠀⡇⣏⠀⣹⢸⠁⢸⠀⡇⢈⠷⡁⠀⡇⡏⠀⡇⡇⠀⡇⢼⠀
⠁⠁⠀⠁⠈⠁⠈⠀⠈⠁⠁⠁⠀⠁⠈⠉⠀⠈⠁⠁⠈⠉⠁⠈⠀⠈⠀⠱⠉⠀⠉⠀⠁⠁⠀⠁⠈⠱⠁⠘⠄
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢤⡀⡤⠀⣀⣀⣀⠀⢤⡀⡤⠀⠀⢰⠀⠀⢹⠠⠀
⠀⠀⠀⣠⠛⣄⠀⠒⠒⠒⠀⣠⠛⣄⠀⠉⢹⠉⠁⢸⢀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀
⠀⠀⠀⣄⢄⠤⢄⢴⠤⢠⠀⢠⢠⡠⢠⡠⢄⠀⢤⡀⡤⢺⡖⠐⣷⠂⠊⢉⡆
⠀⠀⠀⡇⠸⣍⣉⠸⣀⠸⣀⢼⢸⠀⢸⠀⢸⠀⣠⠛⣄⠀⠀⠀⠀⠀⣴⣋⡀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

⢱⠀
⢸⠁
⠊

(Die obigen Punkte stehen für Einsen, die Leerzeichen für Nullen).

links herum
quelle
5
Amüsant (+1), aber es dient dazu, die im Wesentlichen willkürliche Natur der Codierung zu unterstreichen.
John Coleman
4
Viel Spaß beim Schreiben des Compilers dafür :)
Barmar
Erinnert mich an stackoverflow.com/questions/5508110/…
MSalters
1
@Barmar Klingt nach einer Herausforderung für codegolf.stackexchange.com
IMSoP
1
@ RomaKarageorgievich hier ist die Funktion , die das Rendern auf Braillezeichen macht. Hier ist ein einfacher Wrapper , mit dem Sie ihn über die Befehlszeile aufrufen können.
Leftaroundabout
13

Ihr Computer speichert alles als Sequenzen von 0und 1, einschließlich der Frage, die Sie eingegeben haben, um zu fragen, wie es funktioniert. Zum Beispiel wird jeder Buchstabe und jedes Symbol durch 8 Bit dargestellt (ich spreche davon, wie es früher war, heute sind es 16 Bit und es ist komplizierter). Sie können sie hier sehen . Nun, sie zeigen nicht die Bits, sondern die hexadezimalen und oktalen Codes. Wissen Sie, wie man eine Zahl in ihre digitale Darstellung umwandelt?

Andrej Bauer
quelle
6
Es sind nur 16 Bytes unter Windows und in einigen Bibliotheken wie Qt oder ICU, die UTF-16 verwenden. Und nicht einmal alle Buchstaben haben im Allgemeinen eine einzige Code-Einheit, selbst in UTF-32, sodass sie möglicherweise länger sind. Ich denke, es ist besser, in dieser Diskussion an ASCII festzuhalten, da es eine ziemliche Komplikation darstellt, Unicode hierher zu bringen.
Ruslan
8

Die grundlegende Hypothese hinter diesem Konzept ist die Church-Turing-These . Es ist möglicherweise schwer zu erkennen, dass ein Algorithmus als Bitfolge dargestellt werden kann, da der Begriff "Algorithmus" sehr informell verstanden werden kann. In der Church-Turing-These verwenden sie ein sehr genau definiertes Konzept, was ein Algorithmus ist (und selbst dann gab es einige Fragen zu Wörtern). Allerdings hat ihre Terminologie so viel Einfluss bekommen , dass es manchmal , dass diese Definitionen für Begriffe wie „Algorithmus“ argumentiert wird , sind so effektiv , dass wir sie einfach als akzeptieren die Definition.

Church-Turing gibt an, dass jeder Algorithmus als Berechnung auf einer Turing-Maschine implementiert werden kann. Da die Beschreibung einer Turing-Maschine eine endliche Menge von Werten ist, ist es trivial zu sehen, wie diese Beschreibung in eine Folge von Zahlen und dann in eine Folge von Nullen und Einsen abgebildet wird.

Wie in den anderen Antworten bereits erwähnt, ist es trivial, Ihren Beispielalgorithmus mithilfe von ASCII-Codierung oder anderen Codierungen darzustellen.

Ich denke, der Grund, warum Ihr Buch diese Aussage als Tatsache darstellt, liegt in der Tatsache begründet, dass viele einfach die Church-Turing-These als Grundlage für die Definition eines Algorithmus verwenden. Wenn Sie eine solche Definition verwenden, ist dies ebenso offensichtlich wie "5 ist eine Zahl", da Sie sie im Grunde genommen als solche definiert haben.

Cort Ammon - Setzen Sie Monica wieder ein
quelle
9
Die Church-Turing-These ist kein Theorem und enthält keine Definition für das Konzept des Algorithmus, das informell ist. Ich sehe auch nicht die Notwendigkeit, die Church-Turing-These dafür anzuführen. Der "tiefe" Grund, warum einige Objekte als endliche Zeichenfolgen dargestellt werden können und andere nicht, ist, dass einige Mengen abzählbar sind und andere nicht.
Quicksort
Ich sehe "ein Algorithmus kann als Zeichenfolge codiert werden, wenn wir eine Einfügung zwischen den Komponenten der Maschinenspezifikation und dem Satz von Zeichenfolgen in einer Sprache angeben." OP tut dies in seinem Beispiel, indem es die Maschine, die durch " $ (x + 1) ^ 2 $ " dargestellt wird, als Zeichenkette in der Sprache wohlgeformter C- (oder BCPL-, C ++ -, et al.) Funktionen wiedergibt .
Eric Towers
1
@EricTowers Dafür ist die Church-Turing-These erforderlich. Ansonsten kann man nicht sicher sein, dass für alle Algorithmen eine Maschinenspezifikation eines Algorithmus existiert.
Cort Ammon - Reinstate Monica
1
Ich behaupte, dass ein "Algorithmus [der] eine unzählige Anzahl von Symbolen zum Ausdrücken benötigt" nicht ausgedrückt werden kann. Ein solcher Ausdruck muss unzählige Symbole enthalten, ansonsten kann er in einer kleineren Subsprache ausgedrückt werden. Außerdem hat jeder (nicht dumme) Ausdruck über einem unendlichen Alphabet in fast allen Symbolen eine unendliche Menge an Entropie, sodass er sich dem Ausdruck entzieht (dh nicht wirklich mit einem Empfänger kommunizieren kann). Alle finitären Logiken lehnen es ab, mit solchen unendlichen Zeichenfolgen zu arbeiten, und mir ist keine infinitäre Logik bekannt, die es ermöglicht, mit unzähligen Zeichenfolgen zu arbeiten.
Eric Towers
1
Kommentare sind nicht für längere Diskussionen gedacht. Diese Unterhaltung wurde in den Chat verschoben .
DW
4

Diese Aussage basiert auf der Existenz universeller TMs . Dies sind im Grunde programmierbare TMs, die jedes andere TM mit höchstens Poly-Overhead simulieren können. Daher ist Ihr Programm einfach Teil der Eingabe, die als Nullen und Einsen codiert ist.

dseuss
quelle
1
@ Discretelizard, ich folge dir nicht. Jeder Algorithmus kann als Eingabe für ein universelles TM ausgedrückt werden. Sprachen können berechenbar oder nicht berechenbar sein. Ich kenne keinen Standardbegriff für die Berechenbarkeit von Algorithmen, daher bin ich mir nicht sicher, worauf du hinaus willst. Was würde es bedeuten, einen nicht berechenbaren Algorithmus zu haben? Vielleicht denken Sie an Algorithmen, die nicht unbedingt enden müssen? Ein universelles TM kann jedoch solche Algorithmen ausführen.
DW
@Discretelizard Ich folge dir auch nicht. Auf einer Turing-Maschine lauffähig zu sein, ist im Wesentlichen die Definition eines Algorithmus. Ich nehme an, Sie könnten von einem "Algorithmus" für beispielsweise eine Turing-Maschine mit einem Orakel für das Stopp-Problem sprechen, aber normalerweise bedeutet "Algorithmus" "das, was Sie auf einer Turing-Maschine tun können".
David Richerby
@DavidRicherby Richtig, die tatsächliche Definition des Algorithmus ist vermutlich strenger. Bei dieser Frage geht es jedoch darum, warum wir eine viel mildere Einschränkung verhängen und zu sagen, dass es eine noch stärkere Einschränkung gibt, ist meiner Meinung nach nicht sehr aufschlussreich.
Diskrete Eidechse
4

Nun, lassen Sie uns über Algorithmen sprechen, die für keine Art von Codierung als endliche Bitfolge dargestellt werden können.

Lassen Sie mich einen solchen Algorithmus für Sie eingeben ... Ah, aber wenn ich das tue, kann ich diesen Algorithmus mit der Kodierung meines eingegebenen Textes darstellen.

Wie wäre es, wenn Sie meinen Algorithmus mit 'analogen Mitteln' darstellen, etwa durch die Position einiger Münzen auf meinem Schreibtisch. Obwohl die Position dieser Münzen durch einige reelle Zahlen modelliert werden kann (die in einigen Codierungen möglicherweise nicht endgültig darstellbar sind), kann diese gesamte Beschreibung wiederum als Darstellung meines Algorithmus betrachtet und wieder zu einer Bitfolge codiert werden!

Ich hoffe, dass diese Beispiele deutlich machen, dass wir, wenn ein Algorithmus nicht durch eine endliche Bitfolge dargestellt werden kann, überhaupt keine Möglichkeit haben, diesen Algorithmus zu beschreiben!

Warum sollten wir also die Existenz von etwas in Betracht ziehen, von dem wir nicht sprechen können? Vielleicht interessant für die Philosophie, aber nicht für die Wissenschaft. Daher definieren wir den Begriff des Algorithmus so, dass er durch eine Bitfolge dargestellt werden kann, da wir dann zumindest wissen, dass wir über alle Algorithmen sprechen können.


Obwohl die oben gestellte Frage beantwortet wurde, ist die Verwirrung über das angegebene Beispiel meines Erachtens hauptsächlich auf die Tatsache zurückzuführen, dass eine Darstellung nur einen bestimmten Algorithmus eindeutig darstellen muss. Die Art der Darstellung muss nicht die tatsächlichen Berechnungen beinhalten, die vom Algorithmus aufgerufen werden! Dies ist sehr nützlich, da wir damit auch nicht berechenbare Algorithmen darstellen können!

Diskrete Eidechse
quelle
rAr
1
ArR
1
Ja! Schön! Wittgenstein! "Wovon man kann nicht sprechen, darüber muss man schweigen."
Peter - Reinstate Monica
r
@Raphael Ja und? Es ist nicht verwunderlich, dass es nicht möglich ist, unzählige Algorithmen aufzuschreiben. Und wieder behaupten Sie, dass Sie einige Algorithmen "ausdrücken", die nicht aufgeschrieben werden können. Ich verstehe nicht, was Sie unter "ausdrücken" verstehen, aber es scheint zumindest eine Repräsentation zu implizieren. Da meine Behauptung mit der Annahme beginnt, dass ein Algorithmus nicht dargestellt wird, verstehe ich nicht, inwiefern dies meiner Behauptung widerspricht.
Diskrete Eidechse
2

Eine andere Möglichkeit, dies zu sehen, ist die Informationstheorie. Alle Kodierungen von sinnvollen / nützlichen Informationen / Fragen können in binäre 'Sequenzen' umgewandelt werden.

Ein großer Teil des Fachgebiets beschäftigt sich mit der Frage: "Wie kann man die geringste durchschnittliche Anzahl von Fragen stellen, um eine aussagekräftige Information zu vermitteln?" In der Praxis ist dies dasselbe wie "Was ist der optimale Ansatz, um die geringste Anzahl von Ja / Nein-Fragen zu stellen, um zu verstehen, was kommuniziert oder gesagt wurde?"

eSurfsnake
quelle