Wie funktionieren Registrierkassen

Registrierkasse

Das Berechenbarkeitskonzept

Herbert B. Enderton, in Computability Theory, 2011
1.2.4 Register-Maschinen

Hier ist eine weitere Programmiersprache. Einerseits ist sie extrem einfach – sogar einfacher als die Sprache für Schleifen-While-Programme. Andererseits ist die Sprache „unstrukturiert“; sie enthält (faktisch) Go-to-Befehle. Diese Formalisierung wurde von Shepherdson und Sturgis in einem Artikel von 1963 vorgestellt.

Eine Registermaschine muss man sich als ein Rechengerät mit einer endlichen Anzahl von „Registern“ vorstellen, die mit 0,1,2,…,K nummeriert sind. Jedes Register ist in der Lage, eine natürliche Zahl beliebiger Größe zu speichern – es gibt keine Begrenzung für die Größe dieser Zahl. Die Arbeitsweise der Maschine wird durch ein Programm bestimmt. Ein Programm ist eine endliche Folge von Befehlen, die aus der folgenden Liste stammen:

  • • „Inkrement r“, I r (wobei 0 ≤ r ≤ K): Diese Anweisung bewirkt, dass der Inhalt des Registers r um 1 erhöht wird. Die Maschine fährt dann mit der nächsten Anweisung im Programm fort (falls vorhanden).
  • • „Dekrement r“, D r (wobei 0 ≤ r ≤ K): Die Auswirkung dieser Anweisung hängt vom Inhalt des Registers r ab. Wenn diese Zahl ungleich Null ist, wird sie um 1 verringert, und die Maschine fährt nicht mit der nächsten Anweisung fort, sondern mit der folgenden. Wenn die Zahl im Register r jedoch Null ist, fährt die Maschine einfach mit der nächsten Anweisung fort. Zusammengefasst versucht die Maschine, das Register r zu dekrementieren, und wenn sie erfolgreich ist, überspringt sie eine Anweisung.
  • • „Sprung q“, J q (wobei q eine ganze Zahl ist – positiv, negativ oder Null): Alle Register werden unverändert gelassen. Die Maschine nimmt als nächste Anweisung die q-te Anweisung, die dieser im Programm folgt (wenn q ≥ 0), oder die |q|-te Anweisung, die dieser vorausgeht (wenn q < 0). Die Maschine hält an, wenn es keine solche Anweisung im Programm gibt. Eine Anweisung von J 0 führt zu einer Schleife, wobei die Maschine diese eine Anweisung immer wieder ausführt.

Und das ist alles. Die Sprache hat nur diese drei Typen von Anweisungen. (Streng genommen sind r und q in diesen Anweisungen Ziffern und keine Zahlen. Das heißt, eine Anweisung sollte eine Folge von Symbolen sein. Wenn wir Ziffern zur Basis 10 verwenden, dann lautet das Alphabet {I, D, J, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -}. Eine Anweisung ist ein korrekt gebildetes Wort über diesem Alphabet).
Beispiele

1.

CLEAR 7: ein Programm zum Löschen von Register 7.

D 7 Versuch, 7 zu dekrementieren.

J 2 Zurückgehen und wiederholen.

J -2 Halt.

2.

MOVE von r nach s: ein Programm zum Verschieben einer Zahl von Register r nach Register s (mit r ≠ s).

CLEAR s. Verwenden Sie das Programm des ersten Beispiels.

 D r Nimm 1 von r.

 J 3 Halt bei Null.

 I s Addiere 1 zu s.

 J -3 Wiederholen Sie.

Dieses Programm hat insgesamt sieben Anweisungen. Es hinterlässt eine Null im Register r.

3.

ADD 1 to 2 and 3: Ein Programm zum Addieren von Register 1 zu den Registern 2 und 3.

D 1

J 4

I 2

I 3

J −4

Dieses Programm lässt eine Null in Register 1 stehen. Es ist klar, wie man das Programm anpassen kann, um Register 1 zu mehr (oder weniger) als zwei Registern zu addieren.

4.

COPY von r nach s (mit t): Ein Programm zum Kopieren einer Zahl von Register r nach Register s (wobei Register r unverändert bleibt). Wir kombinieren die vorherigen Beispiele.

CLEAR s. Verwenden Sie das erste Beispiel.

MOVE von r nach t. Verwenden Sie das zweite Beispiel.

ADD t zu r und s. Verwenden Sie das dritte Beispiel.

Dieses Programm hat 15 Anweisungen. Es verwendet ein drittes Register, das Register t. Am Ende wird der Inhalt von Register r wiederhergestellt. Aber während der Ausführung muss das Register r gelöscht werden; nur so kann sein Inhalt ermittelt werden. (Es wird hier davon ausgegangen, dass r, s und t verschieden sind.)

5.

(Addition) Nehmen wir an, dass x und y in den Registern 1 und 2 stehen. Wir wollen x + y in Register 0, und wir wollen x und y am Ende noch in den Registern 1 und 2 belassen.

 Registerinhalte

CLEAR 0. 0 x y

MOVE von 1 nach 3. 0 0 y x

ADD 3 zu 1 und 0. x x y 0

MOVE von 2 nach 3. x x 0 y

ADD 3 nach 2 und 0. x + y x y 0

Dieses Programm hat 27 Anweisungen, wie es geschrieben ist, aber drei davon sind unnötig. (In der vierten Zeile beginnen wir mit dem Löschen von Register 3, das bereits frei ist.)

Nehmen wir nun an, f sei eine n-stellige Teilfunktion auf ℕ. Möglicherweise gibt es ein Programm P, so dass, wenn wir eine Registermaschine (mit allen Registern, auf die sich P bezieht) mit x1, …, xn in den Registern 1, …, n und 0 in den anderen Registern starten und wir das Programm P anwenden, dann gelten die folgenden Bedingungen:

  • • Wenn f(x1, …, xn) definiert ist, dann endet die Berechnung schließlich mit f(x1, …, xn) in Register 0. Außerdem endet die Berechnung, indem ein (p + 1)-ter Befehl gesucht wird, wobei p die Länge von P ist.
  • • Wenn f(x1, …, xn) undefiniert ist, dann wird die Berechnung nie beendet.

Wenn es ein solches Programm P gibt, sagen wir, dass P f berechnet.

Welche Funktionen sind durch Register-Maschinen-Programme berechenbar? Die Sprache ist so einfach – sie scheint eine Spielzeugsprache zu sein -, dass der erste Eindruck sein könnte, dass nur sehr einfache Funktionen berechenbar sind. Dieser Eindruck ist irreführend. Am Ende wird das Ergebnis dann auf einer Thermorolle ausgegeben.