Formale Sprachen und Komplexit¨ at
Sommersemester 2019
Zentral¨ ubung 27.06.2019:
LOOP-, WHILE-, GOTO-Programme
Prof. Dr. David Sabel
LFE Theoretische Informatik
Wiederholung:
LOOP-Programme Syntax (informell)
x
i:= x
j ±c P
1; P
2LOOP x
iDO P END LOOP-Berechenbarkeit
Totale Funktion f :
Nk→Nist LOOP-berechenbar, wenn es ein
LOOP-Programm gibt, dass ausgef¨ uhrt mit Variablenbelegung
ρ =
{x1 7→n
1, . . . , x
k7→n
k}mit einer Variablenbelegung ρ
0endet, sodass ρ
0(x
0) = f (n
1, . . . , n
k)
LOOP-Programme erstellen
Aufgabe
Zeige, dass die folgenden Funktionen LOOP-berechenbar sind.
Gebe dabei das bezeugende LOOP-Programm vollst¨ andig und ohne Abk¨ urzungen an.
a)
+(n
1, n
2) = n
1+ n
2b) −(n1
, n
2) = max{0, n
1−n
2} c) ∗(n1, n
2) = n
1∗n
2d) b
(n
1, n
2) = n
n12e)
= (n
1, n
2) =
1, wenn n
1= n
20, sonst
LOOP-Programme erstellen
a)
+(n
1, n
2) = n
1+ n
2Beachte: LOOP-Programm empf¨ angt n
1¨ uber x
1, n
2¨ uber x
2und muss n
1+ n
2in x
0zur Verf¨ ugung stellen.
x
0:= x
1+ 0; LOOP x
2DO
x
0:= x
0+ 1 END
Dieses Programm berechnet +, da
({x17→n1, x27→n2}, x0:=x1+ 0;LOOPx2DOx0:=x0+ 1END)
−−−→
LOOP
({x17→n1, x27→n2, x07→n1},LOOPx2DOx0:=x0+ 1END)
−−−→
LOOP
({x17→n1, x27→n2, x07→n1}, x0:=x0+ 1;. . .;x0:=x0+ 1
| {z }
n2-mal
)
−−−→
LOOP
n2({x07→n1+ 1 +. . .+ 1
| {z }
n2-mal
}, ε) = ({x07→n1+n2}, ε)
LOOP-Programme erstellen
a)
+(n
1, n
2) = n
1+ n
2Beachte: LOOP-Programm empf¨ angt n
1¨ uber x
1, n
2¨ uber x
2und muss n
1+ n
2in x
0zur Verf¨ ugung stellen.
Idee: Addiere
x2mal 1 zum Wert von
x1.
LOOP-Programm: x
0:= x
1+ 0; LOOP x
2DO
x
0:= x
0+ 1 END
Dieses Programm berechnet +, da
({x17→n1, x27→n2}, x0:=x1+ 0;LOOPx2DOx0:=x0+ 1END)
−−−→
LOOP
({x17→n1, x27→n2, x07→n1},LOOPx2DOx0:=x0+ 1END)
−−−→
LOOP
({x17→n1, x27→n2, x07→n1}, x0:=x0+ 1;. . .;x0:=x0+ 1
| {z }
n2-mal
)
−−−→
LOOP
n2({x07→n1+ 1 +. . .+ 1
| {z }
n2-mal
}, ε) = ({x07→n1+n2}, ε)
LOOP-Programme erstellen
a)
+(n
1, n
2) = n
1+ n
2Beachte: LOOP-Programm empf¨ angt n
1¨ uber x
1, n
2¨ uber x
2und muss n
1+ n
2in x
0zur Verf¨ ugung stellen.
Idee: Addiere
x2mal 1 zum Wert von
x1. LOOP-Programm:
x
0:= x
1+ 0;
LOOP x
2DO x
0:= x
0+ 1 END
−−−→
LOOP
({x17→n1, x27→n2, x07→n1}, x0:=x0+ 1;. . .;x0:=x0+ 1
| {z }
n2-mal
)
−−−→
LOOP
n2({x07→n1+ 1 +. . .+ 1
| {z }
n2-mal
}, ε) = ({x07→n1+n2}, ε)
LOOP-Programme erstellen
a)
+(n
1, n
2) = n
1+ n
2Beachte: LOOP-Programm empf¨ angt n
1¨ uber x
1, n
2¨ uber x
2und muss n
1+ n
2in x
0zur Verf¨ ugung stellen.
Idee: Addiere
x2mal 1 zum Wert von
x1. LOOP-Programm:
x
0:= x
1+ 0;
LOOP x
2DO x
0:= x
0+ 1 END
Dieses Programm berechnet +, da
({x17→n1, x27→n2}, x0:=x1+ 0;LOOPx2DOx0:=x0+ 1END)
−−−→ ({x 7→n, x 7→n, x 7→n},LOOPx DOx :=x + 1END)
LOOP-Programme erstellen
b)−(n1
, n
2) = max{0, n
1−n
2}x
0:= x
1+ 0; LOOP x
2DO
x
0:= x
0−1//liefert 0 wenn
x0schon 0
END
LOOP-Programme erstellen
b)−(n1
, n
2) = max{0, n
1−n
2}Idee: Subtrahiere
x2mal 1 vom Wert von
x1.
LOOP-Programm: x
0:= x
1+ 0; LOOP x
2DO
x
0:= x
0−1//liefert 0 wenn
x0schon 0
END
b)−(n1
, n
2) = max{0, n
1−n
2}Idee: Subtrahiere
x2mal 1 vom Wert von
x1. LOOP-Programm:
x
0:= x
1+ 0;
LOOP x
2DO
x
0:= x
0−1//liefert 0 wenn
x0schon 0
END
LOOP-Programme erstellen
c)∗(n1
, n
2) = n
1∗n
2Idee: Addiere
x2mal
x1zur 0.
c)∗(n1
, n
2) = n
1∗n
2Idee: Addiere
x2mal
x1zur 0.
LOOP-Programme erstellen
c)∗(n1
, n
2) = n
1∗n
2Idee: Addiere
x2mal
x1zur 0.
LOOP-Programm:
LOOP x
2DO
x
0:= x
0+ x
1// noch kein LOOP-Programm
END
c)∗(n1
, n
2) = n
1∗n
2Idee: Addiere
x2mal
x1zur 0.
LOOP-Programm (durch ¨ Ubernehmen des Codes f¨ ur + mit Umbenen- nung):
LOOP x
2DO
x
3:= x
0+ 0; // Hilfsvariable
x3soll
x0+x1werden LOOP x
1DO//
x1-mal 1 addieren
x
3:= x
3+ 1 END;
x
0:= x
3+ 0//
x0aktualisieren
END
LOOP-Programme erstellen
c)∗(n1
, n
2) = n
1∗n
2Idee: Addiere
x2mal
x1zur 0.
LOOP-Programm (optimiert):
LOOP x
2DO //
x2-mal
x1addieren LOOP x
1DO//
x1-mal 1 addieren
x
0:= x
0+ 1 END
END
LOOP-Programme erstellen
d)b
(n
1, n
2) = n
n12LOOP-Programme erstellen
d)b
(n
1, n
2) = n
n12Idee: Multipliziere
x2mal
x1zur 1, d.h.
1·x1· · ·x1| {z }
x2-mal
d)b
(n
1, n
2) = n
n12Idee: Multipliziere
x2mal
x1zur 1, d.h.
1·x1· · ·x1| {z }
x2-mal
LOOP-Programm:
x
0:= x
0+ 1; // da
x0 := 1nicht erlaubt LOOP x
2DO
x
0:= x
0∗x
1// noch kein LOOP-Programm
END
LOOP-Programme erstellen
d)b
(n
1, n
2) = n
n12Idee: Multipliziere
x2mal
x1zur 1, d.h.
1·x1· · ·x1| {z }
x2-mal
LOOP-Programm (durch ¨ Ubernehmen des Codes f¨ ur
∗):x0:=x0+ 1;// dax0:= 1nicht erlaubt LOOPx2DO
x3:=x4+ 0;// Hilfsvariablex3sollx0∗x1 werden LOOP x1DO
LOOPx0DO x3:=x3+ 1 END
LOOP-Programme erstellen
e)
= (n
1, n
2) =
1, wenn n
1= n
20, sonst
LOOP-Programme erstellen
e)
= (n
1, n
2) =
1, wenn n
1= n
20, sonst
Idee: Berechne
−(n1, n2)und
−(n2, n1)und pr¨ ufe, dass beides mal 0 raus
kommt.
e)
= (n
1, n
2) =
1, wenn n
1= n
20, sonst
Idee: Berechne
−(n1, n2)und
−(n2, n1)und pr¨ ufe, dass beides mal 0 raus kommt.
LOOP-Programm:
x
0:= x
0+ 1;
x
3:= x
1+ 0;
x
4:= x
2+ 0;
LOOP x
2DO x
3:= x
3−1 END;
LOOP x
1DO x
4:= x
4−1 END;
LOOP x
3DO x
0:= x
5+ 0 END;
LOOP x
4DO x
0:= x
5+ 0 END
LOOP-Programme
Aufgabe
Zeige, dass die Funktion prime(x) =
1, wenn x Primzahl 0, wenn x keine Primzahl LOOP-berechenbar ist. Sie d¨ urfen die Abk¨ urzungen
x
i:= c f¨ ur das Programm, das x
iden Konstantenwert c zuweist
x
i:= x
j ∗x
kf¨ ur das Programm, das x
idas Produkt der Werte von x
jund x
kzuweist
x
i:= x
j== x
kf¨ ur das Programm,das x
iden Wert 0 oder 1
zuweist, jenachdem ob die Werte von x
jund x
kverschieden
oder gleich sind.
F¨ ur x
1> 2, teste, ob es x
3, x
4gibt mit x
3∗x
4= x
1und x
3, x
4> 1
F¨ alle x
1 ≤2 werden extra behandelt Obere Grenze f¨ ur x
3, x
4ist eigentlich
d√x
1eWir nehmen zuviel: x
1, funktioniert immer noch
Programm, dass prime(x
1) berechnet
LOOP-Programm:
x
0:= 0;
x
2:= x
1−1;
LOOP x
2DO x
0:= 1 END; // setzt
x0auf 1, wenn
x1>1x
3:= 2;
LOOP x
1DO x
4:= 2;
LOOP x
1DO x
5:= x
3∗x
4; x
6:= x
1== x
5;
LOOP x
6DO x
0:= 0 END; // Produkt gefunden
x
4:= x
4+ 1
WHILE-Programme, Syntax informell x
i:= x
j ±c
P
1; P
2LOOP x
iDO P END WHILE x
i 6= 0DO P END GOTO-Programme, Syntax informell Programm M
1: A
1; . . . ; M
n: A
nmit A
ix
i:= x
j ±c GOTO M
jIF x
i= 0 THEN GOTO M
jEinfache Programme
Aufgabe
Zeigen, dass die folgenden Funktionen WHILE- und
GOTO-berechenbar sind, indem Sie sowohl ein WHILE- als auch ein GOTO-Programm angeben, welche die Berechenbarkeit bezeugen.
a)
f (n
1, n
2) = n
1+ n
2b)
f (n
1, n
2) = n
1∗n
2c)
f (n
1, n
2) =
n
1−n
2, wenn n
1≥n
2undefiniert, sonst
Einfache Programme
a)
f (n
1, n
2) = n
1+ n
2x
3:= x
2+ 0; WHILE x
3 6= 0DO
x
0:= x
0+ 1; x
3:= x
3−1 END
M
2: x
3:= x
2+ 0;
M
3: IF x
3= 0 THEN GOTO M
7; M
4: x
0:= x
0+ 1;
M
5: x
3:= x
3−1;
M
6: GOTO M
3;
M
7: HALT
Einfache Programme
a)
f (n
1, n
2) = n
1+ n
2WHILE-Programm:
x
0:= x
1+ 0;
x
3:= x
2+ 0;
WHILE x
3 6= 0DO x
0:= x
0+ 1;
x
3:= x
3−1 END
GOTO-Programm: M
1: x
0:= x
1+ 0; M
2: x
3:= x
2+ 0;
M
3: IF x
3= 0 THEN GOTO M
7; M
4: x
0:= x
0+ 1;
M
5: x
3:= x
3−1;
M
6: GOTO M
3;
M
7: HALT
a)
f (n
1, n
2) = n
1+ n
2WHILE-Programm:
x
0:= x
1+ 0;
x
3:= x
2+ 0;
WHILE x
3 6= 0DO x
0:= x
0+ 1;
x
3:= x
3−1 END
GOTO-Programm:
M
1: x
0:= x
1+ 0;
M
2: x
3:= x
2+ 0;
M
3: IF x
3= 0 THEN GOTO M
7; M
4: x
0:= x
0+ 1;
M
5: x
3:= x
3−1;
M
6: GOTO M
3;
M
7: HALT
Einfache Programme
b)
f (n
1, n
2) = n
1∗n
2b)
f (n
1, n
2) = n
1∗n
2WHILE-Programm:
x
0:= x
0+ 0;
x
3:= x
2+ 0;
WHILE x
3 6= 0DO
x0 :=x0+x1;x
3:= x
3−1;
END
Einfache Programme
b)
f (n
1, n
2) = n
1∗n
2WHILE-Programm:
x
0:= x
0+ 0;
x
3:= x
2+ 0;
WHILE x
3 6= 0DO
x0 :=x0+x1;x
3:= x
3−1;
END
GOTO-Programm:
M
1: x
0:= x
0+ 0;
M
2: x
3:= x
2+ 0;
M
3: IF x
3= 0 THEN GOTO M
7; M
4:
x0 :=x0+x1;M
5: x
3:= x
3−1;
M
6: GOTO M
3;
M
7: HALT
WHILE-Programm:
x
0:= x
0+ 0;
x
3:= x
2+ 0;
WHILE x
3 6= 0DO x
4:= x
1+ 0 : WHILE x
4 6= 0DO
x
0:= x
0+ 1;
x
4:= x
4−1;
END
x
3:= x
3−1;
END
Einfache Programme
b)
f (n
1, n
2) = n
1∗n
2WHILE-Programm:
x
0:= x
0+ 0;
x
3:= x
2+ 0;
WHILE x
3 6= 0DO x
4:= x
1+ 0 : WHILE x
4 6= 0DO
x
0:= x
0+ 1;
x
4:= x
4−1;
END
x
3:= x
3−1;
END
GOTO-Programm:
M
1: x
0:= x
0+ 0;
M
2: x
3:= x
2+ 0;
// Aeussere Berechnung fuer * M
3: IF x
3= 0 THEN GOTO M
11; M
4: GOTO M
7;
M
5: x
3:= x
3−1;
M
6: GOTO M
3;
// Innere Berechnung fuer + M
7: x
4:= x
1;
M
8: IF x
4= 0 THEN GOTO M
5;
Einfache Programme
c)
f(n
1, n
2) =
n
1−n
2, wenn n
1 ≥n
2undefiniert, sonst
x
3:= x
2+ 0; WHILE x
3 6= 0DO
x
0:= x
0−1;
x
3:= x
3−1
Einfache Programme
c)
f(n
1, n
2) =
n
1−n
2, wenn n
1 ≥n
2undefiniert, sonst WHILE-Programm:
x
0:= x
1+ 0;
x
3:= x
2+ 0;
WHILE x
3 6= 0DO
IF x0 = 0THEN loop forever:
x
0:= x
0−1;
x
3:= x
3−1
c)
f(n
1, n
2) =
n
1−n
2, wenn n
1 ≥n
2undefiniert, sonst WHILE-Programm:
x
0:= x
1+ 0;
x
3:= x
2+ 0;
WHILE x
3 6= 0DO
x
4:= x
5+ 1;
//x4 := 1LOOP x
0DO x
4:= x
5+ 0 END;
//IFx06= 0 THEN x4:= 0WHILE x
4 6= 0DO x
4:= x
4+ 0 END;
x
0:= x
0−1;
x
3:= x
3−1
Einfache Programme
c)
f(n
1, n
2) =
n
1−n
2, wenn n
1 ≥n
2undefiniert, sonst
GOTO-Programm: M
1: x
0:= x
1+ 0; M
2: x
3:= x
2+ 0;
M
3: IF x
3= 0 THEN GOTO M
8; M
4: M
5: x
0:= x
0−1;
M
6: x
3:= x
3−1;
M
7: GOTO M
3;
M
8: HALT
c)
f(n
1, n
2) =
n
1−n
2, wenn n
1 ≥n
2undefiniert, sonst GOTO-Programm:
M
1: x
0:= x
1+ 0;
M
2: x
3:= x
2+ 0;
M
3: IF x
3= 0 THEN GOTO M
8; M
4:
IFx0= 0 THEN loop forever;M
5: x
0:= x
0−1;
M
6: x
3:= x
3−1;
M
7: GOTO M
3;
M
8: HALT
Einfache Programme
c)