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 2015 Aufgabenblatt Nr. 2 Abgabe: Mittwoch 29. April 2015 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 = = = = = if x > 10 then 20 else f2 (x+1) (f3 (x+1)) * (f4 (x+2)) if x == 0 then 0 else 42+(f3 (x-1)) if (f1 x) > 100 then f2 (x+1) else f2 (x-1) if x < 10 then 0 else 100*x 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 (50 Punkte) Die Funktion fun sei definert als fun x y = if x+y <= 5 then x else x*(fun (x-1) (y-2)) 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*(1+1)) (5-3) in normaler Reihenfolge aus. b) Werten aus. Sie fun (fun (1+1) (4-1)) (fun 2 (2+1)) in (15 Punkte) applikativer Reihenfolge (15 Punkte) c) Werten Sie den Ausdruck fun (2*2) (1*4) in verzögerter Reihenfolge aus. (20 Punkte) 1 Aufgabe 3 (10 Punkte) Die Funktionen g1, g2, g3 und g4 seien in Haskell definiert als: g1 a b c g2 a b c g3 a b c g4 a b c = if c > 0 then (g1 2 a c) + (g1 (a-b) (b+1) (a-c)) else a+b-(2*c) = if a > b then g2 (a+2) (b-1) c else b = if b < 0 then True else (g3 6 (b-2) (c*2)) + (g3 (g3 (a-2) (b-4) (c-6)) (4*b) (c-2)) = if c == 0 then 1 else a + b + g4 (a-1) (b-1) (c-2) Vervollständigen Sie die folgende Tabelle: . . . ist iterativ . . . ist endrekursiv . . . ist linear rekursiv . . . ist Baum-rekursiv . . . ist geschachtelt Baum-rekursiv g1 ja / ja / ja / ja / ja / g2 ja / ja / ja / ja / ja / nein nein nein nein nein nein nein nein nein nein g3 ja / ja / ja / ja / ja / nein nein nein nein nein g4 ja / ja / ja / ja / ja / nein nein nein nein nein Aufgabe 4 (20 Punkte) Ein Tresor habe 3 Zahlenschlösser. Jedes Schloss kann auf eine Zahl zwischen 1 und 100 eingestellt werden. Bei der richtigen Zahlenkombination öffnet sich der Tresor. In Haskell seien Tresore als Funktion vom Typ Integer -> Integer -> Integer -> Bool dargestellt, die dann True liefert, wenn die drei eingegebenen Zahlen die richtige Zahlenkombination darstellt, und ansonsten False liefert. Implementieren Sie in Haskell eine Funktion knacke :: (Integer -> Integer -> Integer -> Bool) -> Integer die einen Tresor (als Funktion) erwartet und die richtige Zahlenkombination zum Öffnen des Tresors als 10-stellige Integer-Zahl 1XXXY Y Y ZZZ liefert, die aus einer führenden 1 gefolgt von den drei Zahlen der richtigen Kombination besteht. Dabei wird jede der drei Zahlen jeweils durch (Auffüllen mit 0en) durch 3 Ziffern dargestellt. Zum Beispiel liefert knacke tresor die Zahl 1045066078 für die Definition tresor 45 66 78 = True tresor _ _ _ = False Auf der Webseite zur Veranstaltung finden Sie fünf verschiedene Tresore. Knacken Sie alle Tresore und notieren Sie die Codes auf Ihrer Abgabe. 2