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)