Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz/Softwaretechnologie Fachbereich Informatik und Mathematik/ Institut für Informatik Goethe-Universität Frankfurt am Main Grundlagen der Programmierung 2 Sommersemester 2016 Aufgabenblatt Nr. 2 Abgabe: Mittwoch 27. April 2016 vor! der Vorlesung Aufgabe 1 (20 Punkte) Die Funktionen f1 bis f5 seien in Haskell definiert als: f1 f2 f3 f4 f5 x x x x x = = = = = f3 (f5 if (f5 if x < x*44 + if x > (if x > 1000 then x-100 else 100)) (x+20)) > 30 then f3 x else f1 x 0 then f3 1 else x*270416 f3 (x*88) 77 then f1 (f4 (x+1)) else f5 (x+20) a) Für welche Funktionen fi, fj (1 ≤ i, j ≤ 5) gilt: Die Funktion fi referenziert Funktion fj direkt? (4 Punkte) b) Für welche Funktionen fi, fj (1 ≤ i, j ≤ 5) gilt: Die Funktion fi referenziert die Funktion fj? (4 Punkte) c) Welche der Funktionen fi mit 1 ≤ i ≤ 5 sind direkt rekursiv? (4 Punkte) d) Welche der Funktionen fi mit 1 ≤ i ≤ 5 sind rekursiv? (4 Punkte) e) Welche Paare (fi, gj) mit 1 ≤ i < j ≤ 5 sind verschränkt rekursiv? (4 Punkte) Aufgabe 2 (10 Punkte) Die Funktionen f1, f2, f3 und f4 seien in Haskell definiert als: f1 x y z f2 x y z f3 x y z f4 x y z = if x > y then f1 (x+2) (y-1) z else y = if z /= 0 then y + x + f2 (x-1) (y-1) (z-2) else 1 = if y < 0 then True else (f3 (f3 (x-2) (y-4) (z-6)) (4*y) (z-2)) + (f3 6 (y-2) (z*2)) = if z > 0 then (f4 (x-y) (y+1) (x-z)) + (f4 2 x z) else y+x-(2*z) Vervollständigen Sie die folgende Tabelle: . . . ist iterativ . . . ist endrekursiv . . . ist linear rekursiv . . . ist Baum-rekursiv . . . ist geschachtelt Baum-rekursiv f1 ja / ja / ja / ja / ja / f2 ja / ja / ja / ja / ja / nein nein nein nein nein 1 nein nein nein nein nein f3 ja / ja / ja / ja / ja / nein nein nein nein nein f4 ja / ja / ja / ja / ja / nein nein nein nein nein Aufgabe 3 (50 Punkte) Die Funktion fun sei definert als fun i j = if i-j <= 30 then j*2 else i+(fun (i-5) (j+5)) Geben Sie für alle Teilaufgaben jeweils sämtliche Reduktionsschritte sowie die jeweils verwendete Regel als Buchstabe D, A oder I an (D = Definitionseinsetzung, A=Arithmetische Auswertung, I=if-Auswertung). a) Werten Sie fun (2*(24+1)) (13-3) in normaler Reihenfolge aus. (15 Punkte) b) Werten Sie fun (fun (2*20) (13-3)) (fun (2*3) (20-17)) in applikativer Reihenfolge aus. (15 Punkte) c) Werten Sie den Ausdruck fun (2*18) (2*2) in verzögerter Reihenfolge aus. (20 Punkte) Aufgabe 4 (20 Punkte) Eine Schlange von paarweise verschiedenen nicht-negativen ganzen Zahlen sei in Haskell durch die Funktionen anfang :: Integer dahinter :: Integer -> Integer modelliert, so dass • anfang die Zahl am Anfang der Schlange liefert. • dahinter i jene Zahl liefert, die sich direkt hinter der Zahl i in der Schlange befindet. Dabei kodiert −1 das Ende der Schlange. Ein Beispiel für eine solche Schlange und die passenden Funktionsdefinitionen in Haskell: anfang = 20 dahinter 20 = 10 dahinter 10 = 5 dahinter 5 = 30 dahinter 30 = 25 20 10 5 30 25 37 2 11 31 dahinter 25 = 37 dahinter 37 = 2 dahinter 2 = 11 dahinter 11 = 31 dahinter _ = -1 Implementieren Sie in Haskell die folgenden Funktionen für solche Schlangen. Die Funktionen müssen dabei für alle (korrekten) Implementierungen von anfang und dahinter korrekt arbeiten. a) Eine (0-stellige) Funktion letztes :: Integer, welche die letzte Zahl der Schlange berechnet. Für obiges Beispiel soll letzte den Wert 31 liefern. (5 Punkte) b) Eine Funktion ktes :: Integer -> Integer, welche die k-te Zahl der Schlange ausgibt. Dabei entspricht ktes 1 der Funktion anfang. Falls k echt größer als die Anzahl der Elemente ist, dann soll mithilfe der Funktion error eine Fehlermeldung ausgegeben werden, zum Beispiel error "Zu wenige Elemente". Für die obige Schlange soll ktes 3 den Wert 5 liefern. (7 Punkte) c) Eine endrekursive (0-stellige) Funktion summe :: Integer, welche die Summe der Zahlen einer Schlange berechnet. Für die obige Schlange sollte summe den Wert 171 liefern. (8 Punkte) 2