Die Sprache der whileProgramme kann die rechnerisch aufzählbaren Funktionen ausdrücken. (Dies gilt auch dann, wenn die einzigen arithmetischen Operationen für Variablen beispielsweise Inkrementierung und Dekrementierung sind.)
Wenn whiledurch ersetzt wird forund Schleifen immer begrenzt werden, kann die Sprache nur die primitiven rekursiven Funktionen ausdrücken.
Vor kurzem wurde mir die Klasse der Elementarfunktionen bewusst , die streng unter den primitiven rekursiven Funktionen liegen, aber immer noch streng über der exponentiellen Hierarchie.
Offensichtlich wäre es möglich, eine zwingende Programmiersprache zu definieren, die genau die Elementarfunktionen erfasst, beispielsweise durch Einführung von Operatoren für begrenzte Summe und Produkt. Meine Frage ist jedoch:
Gibt es eine syntaktische Änderung der
whileProgrammsprache, die sie auf die Elementarfunktionen beschränkt und die so einfach wie die (while->for) Beschränkung auf primitive rekursive Funktionen angegeben werden kann?
forStattdessen würde natürlich auch eine Einschränkung der Programme ausreichen, und vielleicht sollte ich klarstellen, dass ich nicht nach etwas suche, das absolut so einfach ausgedrückt ist, sondern nur nach etwas mit vergleichbarer Einfachheit, bei dem keine zusätzlichen Operatoren oder ähnliches hinzugefügt werden müssen .
Bearbeiten : Ein Beispiel für eine repräsentative forSprache ist PL- {GOTO} aus Brainerd und Landwebers "Theory of Computation" (1974), in der jedes Programm eine endliche, aber uneingeschränkte Anzahl von Variablen hat, von denen jede eine natürliche Zahl enthalten kann, und Dies besteht im Wesentlichen aus den folgenden Befehlen:
X <- 0(einer Variablen 0 zuweisen)X <- Y(weisen Sie den Wert vonYzuX)X <- Y + 1(weisen Sie den Nachfolger des Wertes vonYzuX)LOOP X; ... END;(Wiederholen Sie den enthaltenen Block von CodezeitenX; ändert sich nichtX)
Die Autoren geben einen Beweis dafür, dass dies genau die primitiven rekursiven Funktionen ausdrücken kann. Die Sprache PL stimmt nicht perfekt mit der Frage überein, da sie GOTOstattdessen verwendet wird while, und PL- {GOTO} wird durch Entfernen GOTOvon PL abgeleitet . PL-Programme sind jedoch genauso leistungsfähig wie whileProgramme, und diese GOTOEntfernungstransformation wird genauso einfach angegeben wie das Ersetzen whiledurch for. (Wohl vielleicht sogar ein bisschen einfacher.)
Edit 2 : http://en.wikipedia.org/wiki/Total_Turing_machine schlägt vor, dass dieses Ergebnis auf Folgendes zurückgeht: Meyer, AR, Ritchie, DM (1967), Die Komplexität von Schleifenprogrammen , Proc. der ACM National Meetings, 465.
LOOP(wie ich es genannt habe for) als GOTOauch Turing-vollständig ist, aber ohne GOTOsie nur die pr-Funktionen ausdrücken kann. Ich werde die Frage bearbeiten, um eine kurze Beschreibung dieser Sprache aufzunehmen.
forSchleifen entsprechen , aber ich habe nie einen Beweis gesehen. Hast du?