Universität Würzburg Deduktive Datenbanken Institut für Informatik Prof. Dr. Dietmar Seipel Florian Stefan Sommersemester 2012 Aufgabenblatt 4 Aufgabe 5 (Erreichbarkeit in Graphen) (4 + 2 Punkte) a) Implementieren Sie ein Prolog–Prädikat, das beim Aufruf reachable node(Edges, V, W) einen – und bei Backtracking alle – von einem Knoten V aus erreichbaren Knoten W eines gerichteten Graphen bestimmt. b) Implementieren Sie auf der Basis von reachable node/3 ein weiteres Prolog– Prädikat, das beim Aufruf reachable nodes(Edges, V, Ws) mittels findall/3 die Liste Ws aller von einem Knoten V aus erreichbaren Knoten W bestimmt. Der gerichtete – und möglicherweise zyklische – Graph soll dabei in Form einer Liste Edges von Kanten der Art X-Y gegeben sein. Aufgabe 6 (Rotation für Suchbäume) (4 Punkte) Implementieren Sie ein Prolog–Prädikat, das beim Aufruf binary tree rotate(left, Tree 1, Tree 2) einen vorgegebenen Suchbaum Tree 1 um die Wurzel nach links rotiert, so daß der neue Suchbaum Tree 2 ist. Verwenden Sie zum Zerlegen des Suchbaums und zum Aufbau des neuen Suchbaums – wiederholt – das Prädikat binary tree parse/4. Aufgabe 7 (Symbolisches Differenzieren) (5 + 5 Punkte) Betrachten Sie folgendes Prolog–Programm diff.pl zum Differenzieren: diff(X, X, 1) :!. diff(C, X, 0) :atomic(C). diff(X^N, X, N*X^M) :N > 0, M is N - 1. diff(sin(X), X, cos(X)). diff(e^X, X, e^X). diff(F+G, X, DF+DG) :diff(F, X, DF), diff(G, X, DG). diff(C*F, X, C*DF) :atomic(C), !, diff(F, X, DF). a) Geben Sie die Zwischenschritte bei der Auswertung des folgenden Ausdrucks an: diff(e^x + 4 * x^3 + 2, x, DF) b) Wie kann man diff.pl erweitern, damit folgender Term korrekt differenziert wird ? 5 * e^x * log(x) + sin(x) * x^6 Beachten Sie unbedingt, daß bei den Aufrufen des Prädikats diff/3 die Unbekannte x durch eine Konstante – d.h. beginnend mit einem Kleinbuchstaben – repräsentiert sein muß. Abgabe: bis Freitag, den 25. Mai 2012, in der Vorlesung Abgabe in 3er–Gruppen möglich