13. Übung Informatik A Klaus Kriegel WS 09/10 Abgabe: 03.02.2010, 10:00 Uhr Das ist der letzte abgabepflichtige Übungszettel, mit dem man seinen Punktestand noch einmal verbessern kann. Korrigiert werden die Aufgaben 2.b, 2.c, 3 und 4 (insgesamt 13 Punkte) aber auf das Soll werden nur 6 Punkte angerechnet. Aufgabe 1: Polymorphe Typbestimmung: (0 Punkte) Führen Sie für die folgenden Definitionen eine Typprüfung durch. Natürlich kann man das auch von hugs erledigen lassen, aber Sie sollten üben, es selbst zu machen. Stellen Sie fest, ob die Definitionen konsistent sind, und geben Sie bei positivem Ergebnis die Signatur an: f1 x | x > 0 | otherwise = True = 12 f2 n | ord n >= 6 | otherwise = [n] = "n"++[n] f3 x y = show (div x 3) ++ y f4 (x,y,z) = (x,[’1’..y],x++[z]) f5 x y z = [(x, mod x y)]++z Aufgabe 2: Lazy Evaluation (0 + 1 + 2 Punkte) a) Welche Liste von Zahlen ergibt der Aufruf [ 10*x + y | x <- [0..9], y <- [0..9], z <- [2,5..17], x + y == z] ? Geben Sie eine einfache Beschreibung dieser Liste und begründen Sie Ihre Antwort. b) Wieviele Aufrufe des Operators == aus der letzten Bedingung erfolgen bei der Berechnung der gesamten Liste? c) Wieviele Aufrufe des Operators == erfolgen bei der Berechnung von head [ 10*x + y | x <- [0..9], y <- [0..9], z <- [2,5..17], x + y == z] und bei der Berechnung von head [ 10*x + y | x <- [1..9], y <- [1..9], z <- [2,5..17], x + y == z] ? Aufgabe 3: Goldbachsche Vermutung (3 + 2 Punkte) Die Goldbachsche Vermutung besagt, dass jede gerade Zahl k ≥ 4 als Summe von zwei Primzahlen dargestellt werden kann (1 ist keine Primzahl!). a) Definieren Sie eine Funktion prim :: Integer -> Bool mit der man testet, ob der Eingabewert eine Primzahl ist. Beschreiben Sie danach mit List-Comprehension eine Funktion goldbachSumme :: Integer -> [(Integer,Integer)] , die für jeden geraden Eingabewert alle Zerlegungen dieser Zahl in die Summe aus zwei Primzahlen berechnet, wobei jedes Paar (a,b) aus der Liste die Ungleichung a ≤ b erfüllen soll. Was bei ungeraden Eingabewerten passiert ist egal. b) Definieren Sie (möglichst in einer Zeile, d.h. ohne Rekursion und nur mit prim als Hilfsfunktion) die Funktionen golbachListe :: [(Integer,Integer)] und golbachMax :: Integer -> Integer . Die erste Funktion soll eine unendliche Liste von Primzahlpaaren erzeugen deren Summe die Zahlen 4, 6, 8, . . . ergibt (nur ein Paar pro Zahl). Die zweite Funktion soll bei Eingabe n die maximale Anzahl k von Primzahlpaaren (a1 , b1 ), (a2 , b2 ), . . . (ak , bk ) angeben, so dass a1 ≤ b1 , a2 ≤ b2 , . . . , ak ≤ bk und a1 + b1 = a2 + b2 = . . . = ak + bk ≤ n. Aufgabe 4: Strukturelle Induktion (5 Punkte) Die Funktionen average, magic :: Float -> Float -> Float sind wie folgt definiert: average x y = (x + y)/2 -- (1) magic x y = x + 0.5 * y -- (2) Beweisen Sie mit vollständiger Induktion, dass für beliebige Float-Listen xs die Aufrufe 2* foldr average 0 xs und foldr magic 0 xs den gleichen Wert berechnen. Die Zeilennummerierung in der Definition kann zur Begründung der Schritte herangezogen werden.