Institut fur Informatik der Universitat Munchen Dr. Jan Johannsen Jan Homann WS 2007/08 8. Januar 2008 Ubungen zum Repetitorium Informatik 1 Blatt 8 Aufgabe H-19 (6 Punkte): Die Addition zweier ganzer Zahlen kann wie folgt rekursiv in SML implementiert werden: val rec add = fn (a,0) => a | (a,b) => add (a+1,b-1); (a) Geben Sie ein Paar (a,b) von ganzen Zahlen an fur das add(a,b) nicht terminiert. Begrunden Sie Ihre Antwort. (b) Beweisen Sie, dass der Aufruf add(a,b) fur alle Zahlen a, b ≥ 0 terminiert. (c) Beweisen Sie, die Korrektheit von add fur naturliche Zahlen. Also zeigen Sie, dass fur alle a, b ≥ 0 gilt: add(a,b) = a+b. Geben Sie Ihre Losung als Textdatei mit dem Namen h-19.sml ab. Aufgabe H-20 (6 Punkte): Gegeben ist die SML-Funktion recursion: ’a -> (int * ’a -> ’a) -> int -> ’a, die Sie in der Datei auf der Homepage nden. 8-2.sml fun recursion base step = let fun g 0 = base | g n = step(n,g(n-1)); in g end; val f1 = recursion 1 op*; val f2 = recursion 1 (fn (a,b) => 2*b); val f3 = recursion [] (fn (a,b) => b@[a-1]); val f4 = fn f => recursion [] (fn (a,b) => b@[f (a-1)]); (a) Um welche Funktionen handelt es sich bei f1, . . ., f4? (Hinweis: Die Funktionen sind bekannt oder lassen sich einfach beschreiben.) (b) Beschreiben Sie kurz das Ergebnis, das der Funktionsaufruf recursion base step liefert. Erlautern Sie insbesondere welche Rolle die Argumente base und step dabei spielen. (c) Die Funktion g, die von einem Aufruf recursion base step berechnet wird ist ein rekursive Funktion, die nicht ist. Verbessern Sie die Funktion recursion, indem Sie eine Funktion recursion2: ’a -> (int * ’a -> ’a) -> int -> ’a implementieren, die ein solches g berechnet, das endrekursiv ist. endrekursiv Geben Sie Ihre Losung als Textdatei mit dem Namen h-20.sml ab. Aufgabe P-18: Die folgende rekursive Funktion f sei auf Paaren von nat urlichen Zahlen deniert wie folgt: f(n,m) = if n=m then n n+m else f(n,b n+m 2 c) * f(d 2 e,m) Zeigen Sie, dass f fur alle Eingaben (n, m) mit n ≤ m terminiert. Abgabe der Hausaufgaben u ber UniWorx bis spatestens Dienstag, 15.01.2008, 14 Uhr. Besprechung am Dienstag, 15.01.2008.