Registermaschine/Programmbeispiele/Textabschnitt

Aus Wikiversity

Wir beschreiben einige Programme bzw. Programmabschnitte für Registermaschinen. Wenn man Programme aus schon entwickelten Programmabschnitten zusammensetzt, so ändern sich natürlich die absoluten Befehlsnummern im Programm, was wir aber ignorieren werden.


Beispiel  

Einen unbedingten Sprung (ein „Go to-Befehl“) zu einer bestimmten Programmzeile, der also nicht von einer Abfrage abhängt, kann man dadurch realisieren, dass man ein neues Register hinzunimmt, das von keiner anderen Programmzeile adressiert wird und dessen Inhalt auf gesetzt wird. Dann bewirkt der Befehl , dass zur -ten Programmzeile gewechselt wird, da der Inhalt des Registers im gesamten Programmverlauf gleich bleibt.



Beispiel  

Ein Programm soll sämtliche natürlichen Zahlen der Reihe nach ausdrucken. Dazu brauchen wir eine Registermaschine mit zwei Registern und , die zum Start beide leer sind. Das zweite Register bleibt unverändert und wird nur für den unbedingten Sprungbefehl verwendet. Die Haltezeile wird nie erreicht.

  1. Drucke
  2. Gehe zu
  3. Halte an


Beispiel  

Das Register soll geleert werden. Dies geschieht durch das folgende Programm.

  1. Gehe zu
  2. Halte an

Bemerkung  

Wir erlauben, dass bei einer Registermaschine die Anfangsbelegung der Register von außen festgelegt wird. Man könnte aber auch festlegen, dass die Anfangsbelegung stets die Nullbelegung ist, ohne die Berechnungsmöglichkeiten der Registermaschine einzuschränken. Dann kann man die eigentlich gewünschte Anfangsbelegung dadurch erreichen, dass man dem Programm ein „Belegungsprogramm“ voranstellt, das den einzelnen Registern durch die Befehle die gewünschte Belegung zuweist.

Man könnte auch erstmal ein „Entleerungsprogramm“ vorschalten, das alle Register leert und daran anschließend die Belegung durchführt, doch muss man für den Entleerungsvorgang, der nach Beispiel einen unbedingten Sprungbefehl verwendet, zumindest ein leeres Register zur Verfügung haben.


Wenn der Registerinhalt um eine natürliche Zahl erhöht werden soll, also -fach direkt hintereinander inkrementiert werden soll, so schreiben wir dafür auch mit Pluszeichen.


Beispiel  

Es soll mit einer Registermaschine festgestellt werden, ob der Inhalt des Registers größer oder gleich dem Inhalt des Registers ist. Dazu reserviert man das leere Register ( seien paarweise verschieden) und baut einen Programmabschnitt der folgenden Art.

  1. Gehe zu
  2. Halte an

Wenn dieser Programmabschnitt abgelaufen ist, so steht im Register der Wert oder , je nachdem, ob ist oder nicht, und zwar unabhängig davon, ob man damit die Eingangsdaten oder Zwischendaten, wenn das Programm den ersten Befehl abarbeitet, meint. Die Korrektheit dieses Programms beruht darauf, dass genau dann gilt, wenn ist. Dies ermöglicht einen Induktionsbeweis.



Beispiel  

Wir wollen überprüfen, ob die Inhalte von zwei Registern und übereinstimmen. Dazu kann man das Programm aus Beispiel einfach abändern zu

  1. Gehe zu
  2. Gehe zu
  3. Halte an

Bei Gleichheit erhält man , bei Ungleichheit .


In den obigen beiden Beispielen wurde die Antwort im Register (in der Form oder abgespeichert). Der Druckbefehl nimmt aber immer Bezug auf . Daher ist es nötig, Registerinhalte in andere Register zu verschieben.


Beispiel  

Wir wollen den Registerinhalt des Registers in das Register übertragen (unabhängig von dessen Inhalt). Dies leistet das folgende Programm.

  1. Leere
  2. Gehe zu
  3. Halte an

Bei diesem Programm wird im Laufe der Durchführung das Ausgangsregister der Übertragung leer gemacht. Dies ist nicht immer erwünscht, häufig möchte man den Inhalt eines Registers kopieren und sich den Inhalt zugleich merken.


Beispiel  

Wir wollen den Registerinhalt des Registers in das Register übertragen (unabhängig von dessen Inhalt), ohne zu leeren. Dazu brauchen wir ein drittes Register und das folgende Programm.

  1. Leere
  2. Leere
  3. Gehe zu
  4. Übertrage den Inhalt von nach
  5. Halte an

Hier wird zwar im Laufe des Programms der Inhalt von verändert, zum Schluss wird der ursprüngliche Inhalt aber wieder hergestellt.



Beispiel  

Die beiden Registerinhalte (von ) und (von ) sollen addiert werden, wobei die Summe zum Schluss in stehen soll (es seien paarweise verschieden). Dies leistet das folgende Programm.

  1. Leere
  2. Übertrage nach
  3. Gehe zu
  4. Halte an

Mit der Addition und der Kopie von Inhalten kann man auch den Inhalt eines Registers zu einem anderen Register dazuaddieren. Dies kann man natürlich auch einfach direkt realisieren.


Beispiel  

Die beiden Registerinhalte (von ) und (von ) sollen multipliziert werden, wobei das Produkt zum Schluss in stehen soll (es seien paarweise verschieden). Dies leistet das folgende Programm mit dem Hilfsregister .

  1. Leere
  2. Übertrage den Inhalt von nach ohne zu leeren
  3. Addiere den Inhalt von zu hinzu
  4. Gehe zu
  5. Halte an

Die Korrektheit dieses Programms beruht auf ; für das Produkt muss man -mal mit sich selbst addieren.



Beispiel  

Es soll überprüft werden, ob der Registerinhalt (von ) den Registerinhalt (von ) teilt. Falls ja soll das Programm ausgeben, andernfalls . Dies leistet das folgende Programm mit den Hilfsregistern und (für Teilprogramme braucht man noch weitere Hilfsregister). Das Ausgaberegister soll zu Beginn leer sein.

  1. Leere
  2. Berechne und schreibe das Ergebnis in (ohne zu verändern)
  3. Bei gehe zu 8
  4. Bei gehe zu 7
  5. Gehe zu 2
  6. Drucke
  7. Halte an


Beispiel  

Es soll überprüft werden, ob der Registerinhalt (von ) eine Primzahl ist. Falls ja soll das Programm ausgeben, andernfalls . Dies leistet das folgende Programm mit dem Hilfsregister (für Teilprogramme braucht man noch weitere Hilfsregister). Das Ausgaberegister soll zu Beginn leer sein.

  1. Leere
  2. Wenn , so gehe zu 8
  3. Wenn , so gehe zu 9[1]
  4. Wenn von geteilt wird, so gehe zu 9
  5. Gehe zu 3
  6. Drucke
  7. Halte an


Beispiel  

Es sollen die geraden Zahlen daraufhin überprüft werden, ob sie die Eigenschaft in der Goldbachvermutung erfüllen, also ob sie die Summe von zwei Primzahlen sind. Das Programm soll die Ausgabe machen, falls ein Gegenbeispiel gefunden wurde. Dies leistet das folgende Programm mit den Registern , und , die alle zu Beginn auf gesetzt seien. Auch das Ausgaberegister soll zu Beginn leer sein. Wir testen ab , um uns auf ungerade Primzahlen als Summanden beschränken zu können.

  1. Leere
  2. Wenn , so gehe zu 12
  3. Wenn eine Primzahl ist, so gehe zu 9
  4. Gehe zu 5
  5. Berechne , schreibe das Ergebnis in
  6. Wenn eine Primzahl ist, so gehe zu 2
  7. Gehe zu 5
  8. Drucke
  9. Halte an

  1. Die Programmzeile (5) ist nur für von Bedeutung.