Ich möchte auf die Idee eingehen, die viele Plakate gegeben haben, dass eine solche Sprache "nutzlos" wäre. Vielleicht wäre es für Menschen nutzlos, manuell zu schreiben, um eine bestimmte Aufgabe zu lösen. Dies ist jedoch sicherlich nicht der einzige Anwendungsfall, obwohl er in der Mehrzahl der Fälle für Programmiersprachen verwendet wird. Einige Anwendungsfälle kommen in den Sinn, wenn eine solche Sprache nützlich ist, und wir können diese Felder nach Beispielen für solche Sprachen durchsuchen.
Erstens ist Cort Ammons Anspielung auf die Genetik genau richtig : Die Programmtransformation in der Frage (als Ersatz )
für 5
) kann als Mutation angesehen werden . Diese Art der Manipulation ist auf dem Gebiet der Evolutionsberechnung üblich ; insbesondere genetische Algorithmen führen solche Transformationen auf Saiten , während die genetische Programmierung Transformationen Programme . In beiden Fällen möchten wir normalerweise jeder Möglichkeit eine Bedeutung zuweisen, da dies den kompaktesten Suchraum ergibt.
Genetische Algorithmen basieren auf einer Art Bewertungsfunktion für Zeichenfolgen. Wenn wir einen Programmiersprachen-Interpreter als Auswertungsfunktion verwenden, haben wir ein Szenario, in dem eine Programmiersprache nützlich ist, die allen möglichen Zeichenfolgen eine Bedeutung zuweist. In der genetischen Programmierung wird angenommen, dass unsere Bewertungsfunktion ein Programmierspracheninterpreter ist, wir können jedoch verschiedene Darstellungen für unsere Programme auswählen . Beispielsweise arbeiten viele Systeme mit abstrakten Syntaxbäumen. Wenn wir Zeichenfolgen als Repräsentation auswählen, stellen wir dasselbe Szenario wieder her wie bei genetischen Algorithmen.
Eine andere Situation, in der jeder String ein gültiges Programm sein soll, ist die Aufzählung von Programmen. Dies hängt mit der von CodesInChaos erwähnten Bijektion zusammen, aber wir ziehen es aus mehreren Gründen möglicherweise vor, Zeichenfolgen anstelle von natürlichen Zahlen zu verarbeiten:
- Wenn die Sprache eine gewisse Struktur aufweist, z. Unterstrings können Bedeutungen zugewiesen werden, die bei der Übersetzung in Natural-Zahlen verloren gehen können. In diesem Fall bevorzugen wir möglicherweise die Verwendung von Zeichenfolgen, um Teilzeichenfolgen lokal zu analysieren und zu transformieren, anstatt das gesamte Programm als Zahl darzustellen. Dies ist analog zu der Vorgehensweise, bei der wir bitweise Operationen für ein Int anstelle von arithmetischen Ausdrücken bevorzugen, wenn jedes Bit eine individuelle Bedeutung hat. Dies ist im Grunde eine Verallgemeinerung des Evolutionsszenarios.
- Möglicherweise möchten wir die Programme nach Bedarf generieren. Beispielsweise könnten wir mit der Ausführung eines Programms beginnen, das völlig unbestimmt ist, und die einzelnen Anweisungen (z. B. Zeichen) nur dann (z. B. zufällig) generieren, wenn der Anweisungszeiger sie erreicht. Dies ist in der algorithmischen Informationstheorie üblich, wo das Programm ein Turing-Maschinenband ist, und das Ziel ist, das Verhalten von zufällig erzeugten Programmen zu charakterisieren. Beispielsweise können wir den Solomonoff-Wert vor beliebigen Zeichenfolgen als die Wahrscheinlichkeit formulieren, dass eine universelle Turing-Maschine mit einem zufälligen Band diese Zeichenfolge ausgibt.
In Bezug auf Beispielsprachen basieren viele evolutionäre Rechensysteme auf Stack-Sprachen wie der Push- Familie. Diese neigen dazu, beliebige Ströme von Token zuzulassen (die wir als einzelne Zeichen darstellen könnten). Manchmal (wie im BrainSlugs83-Beispiel für Brainfuck) gibt es Einschränkungen beim Ausgleichen von Klammern. jedoch können wir dies in Beziehung zu sich selbst begrenzenden Programme , dass ein String wie [
kein gültiges sein Programm , aber es ist ein gültiges Programm Präfix . Wenn wir uns einen Compiler / Interpreter vorstellen, der den Quellcode von stdin liest, dann lehnt er einen String nicht ab[
, sondern wartet einfach auf weitere Eingaben, bevor er fortfährt.
Sprachen wie Binary Combinatory Logic und Binary Lambda Calculus sind direkt aus der Arbeit an algorithmischer Informationstheorie entstanden, z. von http://tromp.github.io/cl/cl.html
Dieses Design eines minimalistischen Universalcomputers wurde von meinem Wunsch motiviert, eine konkrete Definition der Kolmogorov-Komplexität zu entwickeln, die die Zufälligkeit einzelner Objekte untersucht.
You are a bimbo.