Skip to content
Snippets Groups Projects
Commit 56305031 authored by Michael Leuschel's avatar Michael Leuschel
Browse files

Merge branch 'master' into 'master'

Master

See merge request !1
parents bcb84193 3047fa72
No related branches found
No related tags found
1 merge request!1Master
Showing
with 2643 additions and 373 deletions
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
%% Cell type:markdown id: tags:
# GOTO-Programme
Die letzte Programmiersprache, die wir betrachten ist GOTO.
Die Syntax eines GOTO-Programms ist wie folgt definiert:
* Ein GOTO-Programm besteht aus Markierten Anweisungen $M_1: A_1; M_2: A_2; ... M_m: A_m;$
* Die Markierungen beginnen bei 1 und steigen immer um 1 an.
* Jede Anweisung wird durch 1 Semicolon abgeschlossen (ein GOTO-Programm endet immer mit einem Semicolon)
* Anweisungen $A_i$ dürfen dabei sein:
* Zuweisung $x_i:=x_j+c$, $x_i:=x_j-c$ und $x_i:=c$ für $c\in\mathbb{N}$
* Unbedingter Sprung $GOTO\ M_i$
* Bedingter Sprung $IF\ x_i=c\ THEN\ GOTO\ M_j$
* Abbruchanweisung $HALT$
%% Cell type:markdown id: tags:
Die Semantik eines GOTO-Programms lässt sich wie folgt verstehen:
Das Programm startet an der mit $M_1$ markierten Anweisung und führt diese aus.
Ist diese eine Zuweisung oder ein bedingter Sprung, dessen Bedingung nicht erfüllt ist, so wird mit der nächsten Anweisung weiter gemacht.
Wenn ein unbedingter Sprung oder ein bedingter Sprung miterfüllter Bedingung ausgeführt wird, wird an der entsprechenden Markierung fortgefahren.
Bei einer Abbruchanweisung hält das Programm sofort an und der Wert von $x_0$ wird zurück gegeben.
Da ein GOTO-Programm stets von einem $HALT$ beendet wird, ist die letze Anweisung in einem GOTO-Programm immer $HALT$ oder $GOTO$.
%% Cell type:markdown id: tags:
Eine Funktion heißt GOTO-berechenbar, falls es ein GOTO-Programm gibt, das mit $n_1,...,n_k$ in den Variablen $x_1,...,x_k$ gestartet wird und mit $f(n_1,n_2,...,n_k)$ in der Variablen $x_0$ endet, falls $f(n_1,n_2,...,n_k)$ definiert ist. Andernfalls stoppt das GOTO-Programm nicht.
Ein Beispiel dafür ist die 2er-Potenz $f(n) = 2^n$:
%% Cell type:code id: tags:
``` python
%run ./Interpreter/gotointerpreter.py
```
%% Output
Help on function interpret in module __main__:
interpret(program, value_list=None, timeout=60)
Funktion zum Ausführen eines GOTO-Programms.
:param program: GOTO-Programm als String 'M1: A1; M2: A2; ... Mn: An;'
:param value_list: Array von Integern ([v1, ..., vn]).
Das GOTO-Programm startet mit diesen Werten in x1, ..., xn.
:param timeout: Zeit nach der die Ausführung eines Programms pausiert wird.
Gibt eine Möglichkeit zum Abbrechen bei einer Endlosschleife.
Ein Wert von 0 deaktiviert den Timeout.
:returns integer: Gibt bei Abbruch -1 und sonst den Wert von x0 nach dem GOTO-Programm zurück.
:usage interpret('M1: x0 := x0 + 1; M2: IF x0 = 10 THEN GOTO M4; M3: GOTO M1; M4: HALT;')
%% Cell type:code id: tags:
``` python
interpret('''
M1:x0:=1;
M2: IF x1=0 THEN GOTO M10;
M3:x2:=x0+0;
M4:IF x2=0 THEN GOTO M8;
M5:x0:=x0 + 1;
M6:x2:=x2 − 1;
M7:GOTO M4;
M8: x1:=x1-1;
M9:GOTO M2;
M10: HALT;''', [8])
```
%% Output
256
%% Cell type:markdown id: tags:
Mit GOTO- und WHILE-Programmen kann man auch partielle Funktionen berechnen.
das folgende GOTO-Programm berechnet die Funktion f(x)=x, falls x>5 und undefiniert sonst:
%% Cell type:code id: tags:
``` python
interpret('''
M1: x2 := x1 -5;
M2: IF x2 = 0 THEN GOTO M2;
M3: x0:=x1+0;
M4: HALT;''', [5])
```
%% Output
Die Funktion rechnet relativ lange.
Vielleicht liegt eine Endlosschleife vor.
Möchten sie abbrechen? [J,n]:Ja
Die Ausführung des Programms wurde unterbrochen.
Daher ist der Rückgabewert des Programms nicht definiert.
-1
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment