• Keine Ergebnisse gefunden

Zentral¨ubung 27.06.2019: LOOP-, WHILE-, GOTO-Programme

N/A
N/A
Protected

Academic year: 2021

Aktie "Zentral¨ubung 27.06.2019: LOOP-, WHILE-, GOTO-Programme"

Copied!
41
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Formale Sprachen und Komplexit¨ at

Sommersemester 2019

Zentral¨ ubung 27.06.2019:

LOOP-, WHILE-, GOTO-Programme

Prof. Dr. David Sabel

LFE Theoretische Informatik

(2)

Wiederholung:

LOOP-Programme Syntax (informell)

x

i

:= x

j ±

c P

1

; P

2

LOOP x

i

DO P END LOOP-Berechenbarkeit

Totale Funktion f :

Nk→N

ist LOOP-berechenbar, wenn es ein

LOOP-Programm gibt, dass ausgef¨ uhrt mit Variablenbelegung

ρ =

{x1 7→

n

1

, . . . , x

k7→

n

k}

mit einer Variablenbelegung ρ

0

endet, sodass ρ

0

(x

0

) = f (n

1

, . . . , n

k

)

(3)

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

2

b) −(n1

, n

2

) = max{0, n

1

n

2} c) ∗(n1

, n

2

) = n

1

n

2

d) b

(n

1

, n

2

) = n

n12

e)

= (n

1

, n

2

) =

1, wenn n

1

= n

2

0, sonst

(4)

LOOP-Programme erstellen

a)

+(n

1

, n

2

) = n

1

+ n

2

Beachte: LOOP-Programm empf¨ angt n

1

¨ uber x

1

, n

2

¨ uber x

2

und muss n

1

+ n

2

in x

0

zur Verf¨ ugung stellen.

x

0

:= x

1

+ 0; LOOP x

2

DO

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}, ε)

(5)

LOOP-Programme erstellen

a)

+(n

1

, n

2

) = n

1

+ n

2

Beachte: LOOP-Programm empf¨ angt n

1

¨ uber x

1

, n

2

¨ uber x

2

und muss n

1

+ n

2

in x

0

zur Verf¨ ugung stellen.

Idee: Addiere

x2

mal 1 zum Wert von

x1

.

LOOP-Programm: x

0

:= x

1

+ 0; LOOP x

2

DO

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}, ε)

(6)

LOOP-Programme erstellen

a)

+(n

1

, n

2

) = n

1

+ n

2

Beachte: LOOP-Programm empf¨ angt n

1

¨ uber x

1

, n

2

¨ uber x

2

und muss n

1

+ n

2

in x

0

zur Verf¨ ugung stellen.

Idee: Addiere

x2

mal 1 zum Wert von

x1

. LOOP-Programm:

x

0

:= x

1

+ 0;

LOOP x

2

DO 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}, ε)

(7)

LOOP-Programme erstellen

a)

+(n

1

, n

2

) = n

1

+ n

2

Beachte: LOOP-Programm empf¨ angt n

1

¨ uber x

1

, n

2

¨ uber x

2

und muss n

1

+ n

2

in x

0

zur Verf¨ ugung stellen.

Idee: Addiere

x2

mal 1 zum Wert von

x1

. LOOP-Programm:

x

0

:= x

1

+ 0;

LOOP x

2

DO 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)

(8)

LOOP-Programme erstellen

b)−(n1

, n

2

) = max{0, n

1

n

2}

x

0

:= x

1

+ 0; LOOP x

2

DO

x

0

:= x

0

1//liefert 0 wenn

x0

schon 0

END

(9)

LOOP-Programme erstellen

b)−(n1

, n

2

) = max{0, n

1

n

2}

Idee: Subtrahiere

x2

mal 1 vom Wert von

x1

.

LOOP-Programm: x

0

:= x

1

+ 0; LOOP x

2

DO

x

0

:= x

0

1//liefert 0 wenn

x0

schon 0

END

(10)

b)−(n1

, n

2

) = max{0, n

1

n

2}

Idee: Subtrahiere

x2

mal 1 vom Wert von

x1

. LOOP-Programm:

x

0

:= x

1

+ 0;

LOOP x

2

DO

x

0

:= x

0

1//liefert 0 wenn

x0

schon 0

END

(11)

LOOP-Programme erstellen

c)∗(n1

, n

2

) = n

1

n

2

Idee: Addiere

x2

mal

x1

zur 0.

(12)

c)∗(n1

, n

2

) = n

1

n

2

Idee: Addiere

x2

mal

x1

zur 0.

(13)

LOOP-Programme erstellen

c)∗(n1

, n

2

) = n

1

n

2

Idee: Addiere

x2

mal

x1

zur 0.

LOOP-Programm:

LOOP x

2

DO

x

0

:= x

0

+ x

1

// noch kein LOOP-Programm

END

(14)

c)∗(n1

, n

2

) = n

1

n

2

Idee: Addiere

x2

mal

x1

zur 0.

LOOP-Programm (durch ¨ Ubernehmen des Codes f¨ ur + mit Umbenen- nung):

LOOP x

2

DO

x

3

:= x

0

+ 0; // Hilfsvariable

x3

soll

x0+x1

werden LOOP x

1

DO//

x1

-mal 1 addieren

x

3

:= x

3

+ 1 END;

x

0

:= x

3

+ 0//

x0

aktualisieren

END

(15)

LOOP-Programme erstellen

c)∗(n1

, n

2

) = n

1

n

2

Idee: Addiere

x2

mal

x1

zur 0.

LOOP-Programm (optimiert):

LOOP x

2

DO //

x2

-mal

x1

addieren LOOP x

1

DO//

x1

-mal 1 addieren

x

0

:= x

0

+ 1 END

END

(16)

LOOP-Programme erstellen

d)b

(n

1

, n

2

) = n

n12

(17)

LOOP-Programme erstellen

d)b

(n

1

, n

2

) = n

n12

Idee: Multipliziere

x2

mal

x1

zur 1, d.h.

1·x1· · ·x1

| {z }

x2-mal

(18)

d)b

(n

1

, n

2

) = n

n12

Idee: Multipliziere

x2

mal

x1

zur 1, d.h.

1·x1· · ·x1

| {z }

x2-mal

LOOP-Programm:

x

0

:= x

0

+ 1; // da

x0 := 1

nicht erlaubt LOOP x

2

DO

x

0

:= x

0

x

1

// noch kein LOOP-Programm

END

(19)

LOOP-Programme erstellen

d)b

(n

1

, n

2

) = n

n12

Idee: Multipliziere

x2

mal

x1

zur 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

(20)

LOOP-Programme erstellen

e)

= (n

1

, n

2

) =

1, wenn n

1

= n

2

0, sonst

(21)

LOOP-Programme erstellen

e)

= (n

1

, n

2

) =

1, wenn n

1

= n

2

0, sonst

Idee: Berechne

−(n1, n2)

und

−(n2, n1)

und pr¨ ufe, dass beides mal 0 raus

kommt.

(22)

e)

= (n

1

, n

2

) =

1, wenn n

1

= n

2

0, 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

2

DO x

3

:= x

3

1 END;

LOOP x

1

DO x

4

:= x

4

1 END;

LOOP x

3

DO x

0

:= x

5

+ 0 END;

LOOP x

4

DO x

0

:= x

5

+ 0 END

(23)

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

i

den Konstantenwert c zuweist

x

i

:= x

j

x

k

f¨ ur das Programm, das x

i

das Produkt der Werte von x

j

und x

k

zuweist

x

i

:= x

j

== x

k

f¨ ur das Programm,das x

i

den Wert 0 oder 1

zuweist, jenachdem ob die Werte von x

j

und x

k

verschieden

oder gleich sind.

(24)

F¨ ur x

1

> 2, teste, ob es x

3

, x

4

gibt mit x

3

x

4

= x

1

und x

3

, x

4

> 1

F¨ alle x

1

2 werden extra behandelt Obere Grenze f¨ ur x

3

, x

4

ist eigentlich

d√

x

1e

Wir nehmen zuviel: x

1

, funktioniert immer noch

(25)

Programm, dass prime(x

1

) berechnet

LOOP-Programm:

x

0

:= 0;

x

2

:= x

1

1;

LOOP x

2

DO x

0

:= 1 END; // setzt

x0

auf 1, wenn

x1>1

x

3

:= 2;

LOOP x

1

DO x

4

:= 2;

LOOP x

1

DO x

5

:= x

3

x

4

; x

6

:= x

1

== x

5

;

LOOP x

6

DO x

0

:= 0 END; // Produkt gefunden

x

4

:= x

4

+ 1

(26)

WHILE-Programme, Syntax informell x

i

:= x

j ±

c

P

1

; P

2

LOOP x

i

DO P END WHILE x

i 6= 0

DO P END GOTO-Programme, Syntax informell Programm M

1

: A

1

; . . . ; M

n

: A

n

mit A

i

x

i

:= x

j ±

c GOTO M

j

IF x

i

= 0 THEN GOTO M

j

(27)

Einfache 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

2

b)

f (n

1

, n

2

) = n

1

n

2

c)

f (n

1

, n

2

) =

n

1

n

2

, wenn n

1

n

2

undefiniert, sonst

(28)

Einfache Programme

a)

f (n

1

, n

2

) = n

1

+ n

2

x

3

:= x

2

+ 0; WHILE x

3 6= 0

DO

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

(29)

Einfache Programme

a)

f (n

1

, n

2

) = n

1

+ n

2

WHILE-Programm:

x

0

:= x

1

+ 0;

x

3

:= x

2

+ 0;

WHILE x

3 6= 0

DO 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

(30)

a)

f (n

1

, n

2

) = n

1

+ n

2

WHILE-Programm:

x

0

:= x

1

+ 0;

x

3

:= x

2

+ 0;

WHILE x

3 6= 0

DO 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

(31)

Einfache Programme

b)

f (n

1

, n

2

) = n

1

n

2

(32)

b)

f (n

1

, n

2

) = n

1

n

2

WHILE-Programm:

x

0

:= x

0

+ 0;

x

3

:= x

2

+ 0;

WHILE x

3 6= 0

DO

x0 :=x0+x1;

x

3

:= x

3

1;

END

(33)

Einfache Programme

b)

f (n

1

, n

2

) = n

1

n

2

WHILE-Programm:

x

0

:= x

0

+ 0;

x

3

:= x

2

+ 0;

WHILE x

3 6= 0

DO

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

(34)

WHILE-Programm:

x

0

:= x

0

+ 0;

x

3

:= x

2

+ 0;

WHILE x

3 6= 0

DO x

4

:= x

1

+ 0 : WHILE x

4 6= 0

DO

x

0

:= x

0

+ 1;

x

4

:= x

4

1;

END

x

3

:= x

3

1;

END

(35)

Einfache Programme

b)

f (n

1

, n

2

) = n

1

n

2

WHILE-Programm:

x

0

:= x

0

+ 0;

x

3

:= x

2

+ 0;

WHILE x

3 6= 0

DO x

4

:= x

1

+ 0 : WHILE x

4 6= 0

DO

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

;

(36)

Einfache Programme

c)

f(n

1

, n

2

) =

n

1

n

2

, wenn n

1

n

2

undefiniert, sonst

x

3

:= x

2

+ 0; WHILE x

3 6= 0

DO

x

0

:= x

0

1;

x

3

:= x

3

1

(37)

Einfache Programme

c)

f(n

1

, n

2

) =

n

1

n

2

, wenn n

1

n

2

undefiniert, sonst WHILE-Programm:

x

0

:= x

1

+ 0;

x

3

:= x

2

+ 0;

WHILE x

3 6= 0

DO

IF x0 = 0THEN loop forever:

x

0

:= x

0

1;

x

3

:= x

3

1

(38)

c)

f(n

1

, n

2

) =

n

1

n

2

, wenn n

1

n

2

undefiniert, sonst WHILE-Programm:

x

0

:= x

1

+ 0;

x

3

:= x

2

+ 0;

WHILE x

3 6= 0

DO

x

4

:= x

5

+ 1;

//x4 := 1

LOOP x

0

DO x

4

:= x

5

+ 0 END;

//IFx06= 0 THEN x4:= 0

WHILE x

4 6= 0

DO x

4

:= x

4

+ 0 END;

x

0

:= x

0

1;

x

3

:= x

3

1

(39)

Einfache Programme

c)

f(n

1

, n

2

) =

n

1

n

2

, wenn n

1

n

2

undefiniert, 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

(40)

c)

f(n

1

, n

2

) =

n

1

n

2

, wenn n

1

n

2

undefiniert, 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

(41)

Einfache Programme

c)

f(n

1

, n

2

) =

n

1

n

2

, wenn n

1

n

2

undefiniert, 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

: IF x

0

= 0 THEN GOTO M

9

; M

5

: x

0

:= x

0

1;

M

6

: x

3

:= x

3

1;

M

7

: GOTO M

3

;

M : HALT;

Referenzen

ÄHNLICHE DOKUMENTE

[r]

I Das Symbol unterm Kopf erhalten wir durch den Befehl UntermKopf := BandAbKopf MOD 10. BuK/WS 2017 VL-11: LOOP und WHILE Programme

Wir betrachten eine einfache Programmiersprache namens LOOP, deren Programme aus den folgenden syntaktischen Komponenten aufgebaut sind:.. I Variablen: x 1 x 2

TECHNISCHE UNIVERSIT ¨ AT BERLIN WS 2007-2008 Fakult¨at II – Institut f ¨ur Mathematik..

Wir sagen, dass eine Menge M (algorithmisch) entscheidbar (oder rekursiv) ist, wenn die zugeh¨ orige charakteristische Funktion ϕ M Turing -berechenbar ist. Anderenfalls heißt

Wir sagen, dass eine Menge M (algorithmisch) entscheidbar (oder rekursiv) ist, wenn die zugeh¨ orige charakteristische Funktion ϕ M Turing -berechenbar ist. Anderenfalls heißt

• Es gibt totale und (intuitiv) berechenbare Funktionen, die nicht LOOP- berechenbar sind.... Jede WHILE-berechenbare Funktion

• Es gibt totale und (intuitiv) berechenbare Funktionen, die nicht LOOP- berechenbar sind.... Jede WHILE-berechenbare Funktion