02.11.2013 Aufrufe

2. Imperative Programmierung und Berechenbarkeit ...

2. Imperative Programmierung und Berechenbarkeit ...

2. Imperative Programmierung und Berechenbarkeit ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>2.</strong> <strong>Imperative</strong> <strong>Programmierung</strong> <strong>und</strong><br />

<strong>Berechenbarkeit</strong><br />

- Registermaschinen -<br />

<strong>2.</strong>1 Definition<br />

<strong>2.</strong>2 Loop-Programme<br />

<strong>2.</strong>3 While Programme<br />

<strong>2.</strong>4 While Programme <strong>und</strong><br />

rekursive Funktionen<br />

Im Wesentlichen:<br />

Tafel!


Maschinenmodell<br />

Registermaschine<br />

- Register x1,…xn -- endlich viele Speicherregister<br />

- Ein Befehlsregister b<br />

Operationen werden durch die "Programmiersprache"<br />

festgelegt.<br />

Befehlssatz einer LOOP-RM:<br />

xi = xj + c<br />

xi = xj – c<br />

LOOP xi {}<br />

Konstanten c : natürliche Zahlen<br />

Semantik:<br />

- Addition wie üblich<br />

- Subtraktion:<br />

xi erhält den Wert<br />

xj – c, wenn xj – c ≥ 0<br />

sonst 0<br />

hs / fub - alp2-2 2


Beispiel: einfache Programme<br />

Multiplikation:<br />

x i = x j *x k<br />

LOOP x i {x i = x i -1}<br />

LOOP x j {x i = x i +x k }<br />

Und wie definiert man x i = x j + x k ??<br />

Welche Funktionen lassen sich mit LOOP-Programmen<br />

berechnen?<br />

hs / fub - alp2-2 3


LOOP-Programme<br />

Satz: Mit LOOP-Programmen kann man genau die<br />

primitiv rekursiven Funktionen f k :: N k → N<br />

berechnen.<br />

… aber das sind bekanntlich nicht alle berechenbaren<br />

Funktionen.<br />

Loop Programme terminieren immer!<br />

Warum?<br />

hs / fub - alp2-2 4


Primitiv rekursive Gr<strong>und</strong>funktionen (I)<br />

1. Konstante 0<br />

Wiederholung<br />

aus ALP1<br />

<strong>2.</strong> Nachfolgerfunktion succ<br />

succ (0), succ(succ(0)), ...<br />

succ(x) = x+1 (*)<br />

3. Projektionen<br />

proj m,i : N m -> N, m ∈ N<br />

proj m,i (x 1 ,…,x i ,…,x m ) = x i, i£m<br />

(*) Funktionen in math. Schreibweise: f (x,y,z)<br />

hs / fub - alp2-2 5


II. Einsetzungsschema (Komposition)<br />

g : N r -> N,<br />

h i : N k -> N , i=1..r, primitiv rekursiv, dann auch<br />

Wiederholung<br />

aus ALP1<br />

f(x 1 ,…x k ) = g(h 1 (x 1 ,..,x k ),…,h r (x 1 ,..,x k ))<br />

Beachte: typisches nichtrekursives Definitionsschema, z.B<br />

quad (x ) = x*x = (*) (proj 1,1 (x), proj 1,1 (x))<br />

Aber bisher nicht bewiesen, dass '*' primitiv rekursiv definierbar.<br />

hs / fub - alp2-2 6


III Rekursionsschema<br />

g : N k -> N, k ≥ 0<br />

h i : N k+2 -> N primitiv rekursiv, dann auch<br />

f : N k+1 -> N<br />

f(0,x 1 ,…x k ) = g (x 1 ,..,x k )<br />

f(m+1,x 1 ,…x k ) = h ( f(m,x 1 ,..,x k ), m, x 1 ,..,x k )<br />

Wiederholung<br />

aus ALP1<br />

Bsp.: fak 0 = 1<br />

fak (m+1) = h (fak (m), m)<br />

mit h(x,y) = x * (y+1)<br />

Schreibweise: oft x statt x 1 ,...,x k<br />

Bemerkung: In der Literatur oft f(m+1,x 1 ,…x k ) = h (x 1 ,..,x k ,m,f(m,x 1<br />

,..,x k )).<br />

Es gibt viele äquivalente Rekursionsschemata.<br />

hs / fub - alp2-2 7


Beschränkter μ-Operator<br />

Gesucht Operator, der kleinstes i < m findet,<br />

das eine Bedingung wahr macht.<br />

μ i < m (g(i,x)) = ∧ ∀j < i 0<br />

i 0<br />

, wenn g(i 0 ,x) = 0<br />

g(j,x) ≠ 0 ∧ 0 § i 0 < m<br />

0 falls m=0 ∨ ∀ 0§j g erfüllt<br />

Satz: Beschränkter μ-Operator kann durch ein<br />

LOOP-Programm realisiert werden.<br />

hs / fub - alp2-2 8


Loop-Algorithmus: beschränkter μ-Operator<br />

x res = 0; i = 0: x m =m-1;<br />

loop x m { wenn g(i,x) > 0 dann i=i+1;<br />

sonst {wenn schon i 0 mit g(i 0 ,x) gef<strong>und</strong>en<br />

dann ignoriere aktuelles i<br />

sonst x res = i}<br />

}<br />

hs / fub - alp2-2 9


μ-Rekursion<br />

Erst mit dem unbeschränkten μ-Operator erhält man<br />

alle berechenbaren Funktionen.<br />

Sei g: N k+1 -> N partielle Funktion.<br />

i 0 , wenn g(i 0 ,x) = 0 ∧ ∀j < i 0 ( g(j,x) ≠ 0<br />

f(x) = μ (g(i,x)) = ∧ g(j,x) definiert)<br />

<strong>und</strong>efiniert sonst<br />

hs / fub - alp2-2 10


While-Programme<br />

Unbeschränkter μ-Operator lässt sich nicht durch ein<br />

LOOP-Programm realisieren.<br />

⇒ Echte Spracherweiterung der Registermaschine<br />

erforderlich<br />

While-Befehl:<br />

WHILE (xi ≠ o) {P}<br />

Semantik: führe P solange aus bis x i den Wert 0 hat.<br />

hs / fub - alp2-2 11


<strong>Berechenbarkeit</strong><br />

LOOP-Programme sind WHILE-berechenbar. <br />

Satz:<br />

Die Klasse der μ-rekursiven Funktionen ist gleich der<br />

durch WHILE-Programme berechenbaren Funktionen.<br />

Mit Church'scher These heißt das:<br />

Alle berechenbaren Funktionen können durch<br />

imperative Programme mit WHILE-Befehl <strong>und</strong><br />

Zuweisung xi = xj+c, xi = xj -1 berechnet werden,<br />

sofern sie terminieren.<br />

hs / fub - alp2-2 12


GOTO-Registermaschine<br />

Befehle haben Marken:<br />

M i :B i<br />

Zuweisungen:<br />

xi = xj + c<br />

xi = xj – c<br />

Sprungbefehle:<br />

if xi=c then GOTO Mj<br />

GOTO Mj<br />

bedingter Sprung: wenn Bedingung erfüllt<br />

nächster Befehl der mit Marke Mj, sonst<br />

der Folgebefehl.<br />

unbedingter Sprung, nächster Befehl ist<br />

der mit Marke Mj<br />

beendet Programm<br />

HALT<br />

Marken, die nie Sprungziel sind, können weggelassen werden.<br />

hs / fub - alp2-2 13


Satz: Die Klasse der GOTO-Programme ist gleich<br />

der Klasse der WHILE-Programme (<strong>und</strong> damit gleich<br />

der Klasse der μ-rekursiven Funktionen)<br />

Beweis ("⇒")<br />

Konstruktiv: Konstruiere für beliebiges GOTO-Programm P<br />

WHILE-Programm P', das P emuliert.<br />

P sei: M 1 :B 1 ,…,M n :B n<br />

P':<br />

zaehl=1;<br />

while (zaehl ≠ 0) {<br />

if (zaehl = 1) then A 1 ' ;<br />

.<br />

if (zaehl = n) then A n ';<br />

}<br />

wobei…<br />

… Sie erst selbst<br />

versuchen sollten, die<br />

Ai' zu definieren <strong>und</strong><br />

dann mit der Lösung auf der<br />

folgenden Folie vergleichen<br />

sollten.<br />

hs / fub - alp2-2 14


A i ' ≡ {x i =x j +/- c; count=count+1}<br />

wenn A i = x i =x j +/- c<br />

A i ' ≡ if x j =c then count=k else count=count+1<br />

wenn A i ≡ if x j =c then GOTO M k<br />

Ai' ≡ if x j =x j then GOTO k<br />

wenn A i ≡ GOTO M k<br />

Ai' ≡ count=0 wenn A i ≡ HALT<br />

Beweis in Richtung "

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!