TU Kaiserslautern - AG Softwaretechnik
TU Kaiserslautern - AG Softwaretechnik
TU Kaiserslautern - AG Softwaretechnik
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).