Klausur Paradigmen der Programmierung
Transcription
Klausur Paradigmen der Programmierung
Paradigmen der Programmierung Beispiel Prof. Dr. E. Ehses _________________________________________________________________________________________ Name: Matr.Nr.: Studiengang: _________________________________________________________________________________________ Vorbemerkungen: • Die Bearbeitungszeit beträgt 60 Minuten. Sie können maximal 50 Punkte erreichen. Hilfsmittel sind nicht zugelassen! • Die Klausur umfasst insgesamt 7 Seiten. Überprüfen Sie bitte sofort die Vollständigkeit! • Geben Sie die Lösung auf dem jeweiligen Aufgabenblatt an. Bei Platzmangel können Sie auch die dazugehörige Rückseite verwenden. • Lesen Sie die Aufgabenstellung jeweils gut und in Ruhe durch. An sich richtige Lösungen, die nicht der Aufgabenstellung entsprechen, werden nicht gewertet. • Im Anhang stehen ein paar Hinweise (bei Bedarf bitte fragen!) • Viel Erfolg! _________________________________________________________________________________________ Punktzahl: Aufgabe 1: /12 = /4+ /4+ /4 Aufgabe 2 /13 = /3+ /6+ /4 ________________________________________________________________________________________ Summe: Note: /25 Aufgabe 1: Logikprogrammierung a) Wir haben das Prädikat s(X, [X|Xs]). s(X, [Y|Xs]):- s(X, Xs). und die Anfrage ?- s(X, [1,2,3]). Geben Sie alle Lösungen für X an. b) Unter einer Teilliste versteht man eine Liste, die Teil einer anderen Liste ist. ([1,2,3] ist Teilliste von [a,b,1,2,3,c]. [1,2,3] ist nicht Teilliste von [3,2,1]). Schreiben Sie das Prolog-Prädikat teilliste! Hinweis: Verwenden Sie das Prädikat append (s.Anhang). c) Erläutern Sie den Begriff Unifikation! Aufgabe 2: Funktionale Programmierung a) Geben Sie 3 wichtige Merkmale der funktionalen Programmierung an. b Implementieren Sie die Funktion filter, die die Liste derjenigen Elemente einer Liste xs zurückgibt, für die das mitgegebenen Prädikat p erfüllt ist. Verwenden Sie die Funktion anschließend um aus einer Liste von Zahlen die Liste die ungeraden Zahlen zu filtern.. def filter[T](xs: List[T], p: T=>Boolean): List[T] = { val zahlen = List(17, 3, 4, 1, 18) val ungerade = .............. c) Drücken Sie das folgende Programmstück durch monadische Funktionen (s. Anhang) aus: val ergebnis = for { x ← liste if x %2 == 0 } yield x*x Anhang / Hilfestellung Listennotation Prolog: a) Aufzählung: [1,2,3] b) Head/Tail: [Head|Tail] c) leere Liste: [] member(X, Xs) append(Xs, Ys, Zs) // X ist in der Liste Xs enthalten // Zs ist Ys angehängt an Xs. Scala-Listenoperationen: a) Aufzählung: List(1,2,3) b) Head/Tail: head::tail, oder liste.head, liste.tail c) leere Liste: List[T](), Nil; Test: liste.isEmpty xs ::: xs xs.contains(x) // append-Verknüpfung // x ist in xs enthalten Monadische Funktionen (für Listen) abstract class List[+A] def flatMap[B](f: A def map[B] (f: A def filter (p: A … } { => List[B]): List[B] => B): List[B] => Boolean): List[A] Lambda-Ausdruck (anonyme Funktion, Closure, Funktionsobjekt): (x: Double, y: Double) => x + y (Der Typ des Ausdrucks ist (Double,Double) => Double) Beim Aufruf einer Funktion höherer Ordnung, kann der Typ für die Parameter einer anonymen Funktion wegfallen. liste.foldLeft(0)((x,y) => x + y)