14.02.2013 Aufrufe

TU Kaiserslautern - AG Softwaretechnik

TU Kaiserslautern - AG Softwaretechnik

TU Kaiserslautern - AG Softwaretechnik

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Aufgabe 3 Terminierung (Präsenzaufgabe)<br />

In dieser Aufgabe wollen wir die Terminierung von Funktionen mit dem Verfahren aus der Vorlesung beweisen.<br />

Wir betrachten wieder einmal die Fibonacci Funktion, implementiert durch:<br />

f :: Integer -> Integer<br />

f 0 = 0<br />

f 1 = 1<br />

f n = f (n - 1) + f (n - 2)<br />

Beweisen Sie, dass diese Funktion terminiert, denken Sie aber daran, dass wir uns nur für Parameter aus den<br />

natürlichen Zahlen interessieren.<br />

Aufgabe 4 Terminierung (Einreichaufgabe)<br />

a) Beweisen Sie, dass die Funktion divConstZero, die wir im Rahmen der Expressions-Aufgabe geschrieben<br />

haben, terminiert:<br />

data Expr =<br />

Const Integer<br />

| Binary Op Expr Expr<br />

deriving (Eq, Ord , Show)<br />

data Op = Mult | Div | Plus | Minus<br />

deriving (Eq, Ord , Show)<br />

divConstZero :: Expr -> Bool<br />

divConstZero (Const _) = False<br />

divConstZero (Binary Div _ (Const 0)) = True<br />

divConstZero (Binary _ a b) = divConstZero a || divConstZero b<br />

Hinweis: Betrachten Sie ausschließlich endliche Ausdrücke und machen Sie dies im Beweis klar.<br />

b) Wir betrachten folgende Implementierung der Primfaktorzerlegung (für Zahlen ≥ 2) und wollen beweisen,<br />

dass sie für jede Eingabe terminiert:<br />

primfaktoren :: Integer -> [Integer]<br />

primfaktoren c = if c < 2 then [c] else faktor (c, 2)<br />

faktor :: (Integer , Integer) -> [Integer]<br />

faktor (c, x) =<br />

if c == x then [x] else<br />

if c �mod� x /= 0 then faktor (c, x + 1) else<br />

x : faktor (c �div� x, 2)<br />

Da die Funktion primfaktoren nicht rekursiv ist, terminiert sie, wenn alle von ihr aufgerufenen Funktionen<br />

terminieren. Wir müssen also beweisen, dass die Funktion faktor terminiert, zumindest auf dem<br />

Parameter-Bereich, der von primfaktoren oder faktor aufgerufen wird. Sei also P der zulässige Parameterbereich:<br />

P = � (c, x) | 2 ≤ x ≤ c � ⊂ N × N<br />

Beweisen Sie, dass es durch einen Aufruf von primfaktoren (und die Folgeaufrufe durch faktor selbst)<br />

nur zulässige Aufrufe von faktor mit einem Parameter aus P geben wird: G(n) ∈ P.<br />

c) Um die Terminierung nun zu beweisen, verwenden wir das Verfahren aus der Vorlesung. Als noethersche<br />

Ordnung verwenden wir die Menge der Paare aus natürlichen Zahlen (N × N, ≤) mit der komponentenweisen<br />

Ordnung, d.h. ist die erste Komponente gleich wird nach der zweiten geordnet, wie auf<br />

natürlichen Zahlen, ansonsten wird nach der ersten Komponente geordnet. Das kleinste Element ist dann<br />

einfach (0, 0).

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!