Grundlagen der Programmierung 2 Aufgabenblatt Nr. 2 Aufgabe 1

Werbung
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
Herunterladen