Logik als Anfragesprache – Motivation (1) Kennenlernen einer weiteren Anfragesprache für das relationale Datenmodell, aber Unterschied hinsichtlich Ausdrucksmächtigkeit. Datalog, logikbasierte Anfragesprache. Kalküle und SQL – ähnlich; Betrachtung von Datalog wird dagegen unsere Perspektive verbreitern. Unterschied zu Kalkülen: Striktere Vorgaben bezüglich des Aufbaus von Anfragen, zieht diverse vorteilhafte Eigenschaften nach sich, formal nachweisbar. Andererseits: Erweiterungen problembehaftet. Einleitung Kapitel 3: Logik als Anfragesprache Rekursion Integritätsbedingung Datalog Negation SQL Schluß Datenbankeinsatz: Datalog – 1 Logik als Anfragesprache – Motivation (2) Rekursion Integritätsbedingung Datalog Negation Motivation, auf unterschiedlichen Ebenen (Forts.): Datalog hat wichtige Beschränktheit in der Ausdruckskraft der relationalen Algebra nicht (insbesondere ‚Berechnung transitive Hülle‘), trotzdem effizient. Einleitung Transitive Hülle Rekursion Integritätsbedingung Datalog Negation Schluß SQL Schluß Datenbankeinsatz: Datalog – 3 Illustration: Einleitung SQL Klemens Böhm Datenbankeinsatz: Datalog – 2 Klemens Böhm Klemens Böhm R A B 1 3 2 2 4 3 R+ A B 1 2 3 1 1 2 2 3 4 3 4 4 D. h. es muß endliche Folge von Tupeln geben, so daß [Tupel i].B=[Tupel i+1].A ∃ kein RA-Ausdruck zur Berechnung der transitiven Hülle. (Kann man beweisen.) Man kann lediglich – für festes n – Folgen mit Maximallänge n berechnen. Bedauerlich, da sinnvoll aus Anwendersicht. Klemens Böhm Datenbankeinsatz: Datalog – 4 Datalog – Übersicht Einleitung Datalog – Teilmenge von Prolog. Beispiele: Relation Person mit Attributen Name, Alter, Geschlecht → Person(X, Y, Z) Tupel mit Attributwerten Klemens, 28, m → Person(Klemens, 28, m) Ziel – wird bewiesen oder widerlegt. Anfrage – welche Tupel erfüllen sie? Rekursion Illustration Integritätsbedingung Datalog Negation SQL Elternteil Kind John Jeff Jeff Margaret Margaret Annie John Anthony Anthony Bill Einleitung Rekursion Integritätsbedingung Datalog Negation SQL Schluß Schluß Elternschaft Datenbankeinsatz: Datalog – 5 Extensionale vs. intensionale Datenbank. Extensionale Datenbank (EDB) – Basis-Daten, im Beispiel Elternschaft, Person, intentionale Datenbank (IDB) – mit (Deduktions-)Regeln ableitbare Relationen, „Sichten“. Beispiel: Vater(X, Y) :- Person(X, _, m), Elternschaft(X, Y) Mutter(X, Y) :- Person(X, _, w), Elternschaft(X, Y) Beispiel für Evaluierung einer Anfrage: ?- Mutter(X, Annie) Mutter(X, Y) :- Person(X, _, w), Elternschaft(X, Y) Person(Margaret, 32, w), Elternschaft(Margaret, Annie) Datalog Negation SQL Schluß Klemens Böhm Geschlecht m m m w w m m Zusammenhänge Datenbanken – Logik Rekursion Integritätsbedingung Alter 7 78 55 32 4 58 34 Datenbankeinsatz: Datalog – 6 Klemens Böhm Terminologie Einleitung Name Paul John Jeff Margaret Annie Anthony Bill Tupel: Logische Fakten bzw. mit Konstanten instanziierte Prädikate. Z. B. Elternschaft(John, Jeff) Beispiel für Anfrage: Wer sind die Kinder von John? ?- Elternschaft(John, X) Deklarativität: Wünschenswerte Eigenschaft, wird beibehalten. Klemens Böhm Person Datenbankeinsatz: Datalog – 7 Einleitung Rekursion Integritätsbedingung Datalog Negation SQL Schluß Enger Zusammenhang zur Logik: DatenbankKonzept Relation Attribut Tupel Attributwert View (Sicht) Anfrage Logik-Programmierung Konzept Prädikat Argument eines Prädikats, Variable Grundklausel Konstante Regel Ziel (Goal) z Klemens Böhm Datenbankeinsatz: Datalog – 8 Datalog Integritätsbedingung Negation SQL Schluß Klemens Böhm Einleitung Rekursion Integritätsbedingung Datalog Negation SQL Schluß Datenbankeinsatz: Datalog – 9 Rekursion Integritätsbedingung Datalog Negation SQL Schluß Klemens Böhm Datenbankeinsatz: Datalog – 11 Auswertung rekursiver Datalog Regeln – Illustration (1) Rundenweises Vorgehen. Ablauf: 1. IDB-Prädikaten entsprechen leere Relationen. 2. Alle Regeln anwenden auf Tupel, einer davon muß in vorangegangener Runde neu erzeugt worden sein. Illustration auf folgenden Folien. Datenbankeinsatz: Datalog – 10 Klemens Böhm Auswertung rekursiver Datalog Regeln (1) Einleitung Erläuterung: IDB Prädikat sowohl im Kopf als auch Rumpf der Regel. Berechnung des kleinsten Fixpunkts. D. h. minimale Menge der Tupel, die vorhanden sein müssen. Mit Datalog möglich. Vorfahre(X, Y) :- Elternschaft(X, Y). Vorfahre(X, Y) :- Elternschaft(X, Z), Vorfahre(Z, Y). In relationaler Algebra nicht formulierbar. Was ist Zusammenhang zwischen Rekursion in Datalog und transitiver Hülle? Einleitung Rekursion Rekursion (2) Relation sequelOf: Einleitung Rekursion Integritätsbedingung Datalog Negation SQL Schluß Rekursion (1) movie sequel Rocky Rocky II Rocky II Rocky III Rocky III Rocky IV Datalog-Regeln: 1. FollowOn(x, y) :- SequelOf(x, y) 2. FollowOn(x, y) :- SequelOf(x, z), FollowOn(z, y) Klemens Böhm Datenbankeinsatz: Datalog – 12 Auswertung rekursiver Datalog Regeln – Illustration (2) Relation sequelOf: Einleitung Rekursion Integritätsbedingung Negation Datalog SQL Schluß movie sequel Rocky Rocky II Rocky II Rocky III Rocky III Rocky IV x Rocky Rocky II Rocky III Rocky Rocky II y Rocky II Rocky III Rocky IV Rocky III Rocky IV Klemens Böhm Algorithmus terminiert offensichtlich. Warum ‚offensichtlich‘? Einleitung Rekursion Integritätsbedingung Rekursive Berechnung von FollowOn nach einer, zwei bzw. drei und mehr Runden: x y Rocky Rocky II Rocky II Rocky III Rocky III Rocky IV Auswertung rekursiver Datalog Regeln (2) x Rocky Rocky II Rocky III Rocky Rocky II Rocky y Rocky II Rocky III Rocky IV Rocky III Rocky IV Rocky IV Datalog Negation SQL Schluß Datenbankeinsatz: Datalog – 13 Klemens Böhm Negation Datalog SQL Schluß Klemens Böhm Rekursion lineare Rekursion Integritätsbedingung Festlegung von Integritätsbedingungen im gleichen sprachlichen Rahmen wie Anfragen und Sichten. Beispiel: inkorrekt(X) :- Elternschaft(X, X) Anfrage: ?- inkorrekt(X) Argument aus Vossen-Buch (s. b. Literatur) – gilt m. E. aber auch für SQL. Datalog Negation Integritätsbedingung Einleitung Einleitung Rekursion Rechts-rekursiv Beispiel: 1. FollowOn(x, y) :- SequelOf(x, y) 2. FollowOn(x, y) :- SequelOf(x, z), FollowOn(z, y) Links-rekursiv Beispiel: 1. FollowOn(x, y) :- SequelOf(x, y) 2. FollowOn(x, y) :- FollowOn(x, z), SequelOf(z, y) Nichtlineare Rekursion – Beispiel: 1. FollowOn(x, y) :- SequelOf(x, y) 2. FollowOn(x, y) :- FollowOn(x, z), FollowOn(z, y) Integritätsbedingungen SQL Schluß Rekursion in Datalog – Varianten Datenbankeinsatz: Datalog – 14 z Datenbankeinsatz: Datalog – 15 Klemens Böhm Datenbankeinsatz: Datalog – 16 Logik als Anfragesprache – Schwierigkeiten Einleitung Rekursion Integritätsbedingung Datalog Erfüllbarkeitsproblem der Aussagenlogik ist NP-vollständig. Prädikatenlogik erster Stufe – Problem ist nicht entscheidbar. SQL Atom – Ausdruck der Form P(X1, …, Xn) Literal – negiertes oder nicht negiertes Atom. Klausel – Disjunktion von Literalen. Horn-Klausel – höchstens ein positives Literal. Datalog-Programm – endliche Menge von Horn-Klauseln. Einleitung Rekursion Integritätsbedingung Datalog Negation Negation Datalog-Programm – Definition Schluß Macht Rahmen erforderlich, der effiziente Auswertbarkeit garantiert. (Beschränkung auf Horn-Klauseln – wird gleich erklärt.) Klemens Böhm SQL Schluß Beispiele für Horn-Klauseln: Vorfahre(X, Y) :- Elternschaft(X, Y). Vorfahre(X, Y) :- Elternschaft(X, Z), Vorfahre(Z, Y). Datenbankeinsatz: Datalog – 17 Einleitung Rekursion Beispiel (Fortsetzung): gamble(X) :- gotmoney(X),!. gamble(X) :- gotcredit(X). Wäre auch OK. Fehleranfällig. Einleitung Rekursion Integritätsbedingung Integritätsbedingung Abgrenzung zu Prolog (2) Abgrenzung zu Prolog (1) Datalog: Anordnung von Prädikaten und Fakten spielt keine Rolle. Beispiel aus Prolog (Beispiel stammt aus wikipedia): gamble(X) :- gotmoney(X). gamble(X) :- gotcredit(X), NOT gotmoney(X). gamble(X) :- gotcredit(X), NOT gotmoney(X). gamble(X) :- gotmoney(X). gamble(X) :- gotmoney(X),!. gamble(X) :- gotcredit(X), NOT gotmoney(X). Die letzte Variante ist int‘sant, wenn Aufruf von gotmoney() teuer. Cut-Operator: Höre auf, nach Alternativen zu suchen. Datenbankeinsatz: Datalog – 18 Klemens Böhm Datalog Negation SQL SQL Schluß Schluß Datalog Negation Klemens Böhm Datenbankeinsatz: Datalog – 19 Klemens Böhm Datenbankeinsatz: Datalog – 20 Einleitung Rekursion Regelanwendung reihenfolgeunabhängig (bei Datalog-Programm). Ergibt minimales Modell (Menge aller ableitbaren Fakten.) Zwei alternative Herangehensweisen: Modelltheoretisch: Berechnung der Menge aller Grundfakten, die logische Konsequenzen des Programms sind. Beweistheoretisch: Berechnung der Menge aller Grundfakten, die aus dem Programm (in endlich vielen Schritten) ableitbar sind. Ansätze liefern – für Horn-Klauseln – das gleiche Ergebnis. Einleitung Rekursion Integritätsbedingung Integritätsbedingung Semantik von Datalog-Programmen Evaluation Datalog Datalog Negation Negation SQL SQL Schluß Schluß Datenbankeinsatz: Datalog – 21 Klemens Böhm Datalog Negation SQL Schluß Semantik von Datalog-Programmen – beweistheoretisch Einleitung Rekursion Integritätsbedingung Datalog Negation SQL Schluß Klemens Böhm Datenbankeinsatz: Datalog – 23 Syntaktisches Konzept. Erläuterung am Beispiel: Nur ein Schritt, da keine Rekursion. Paare von Tupeln aus Person und Elternschaft nacheinander anfassen und versuchen, rechts einzusetzen. Rekursion Integritätsbedingung Welches Modell macht die Anfrage wahr? ?- Mutter(X, Annie) Mutter(X, Y) :- Person(X, _, w), Elternschaft(X, Y) Alle Tupel(-Kombinationen) aus Elternschaft und Person anschauen und überprüfen, ob sie Modell wahr machen. Datenbankeinsatz: Datalog – 22 Einleitung Semantik von Datalog-Programmen – modelltheoretisch Klemens Böhm Klemens Böhm Datenbankeinsatz: Datalog – 24 Einleitung Integritätsbedingung Rekursion Negation Datalog SQL Schluß Monotonie-Eigenschaft Datalog – Ausdruckskraft monoton := Vergrößerung des Inputs (einer Anfrage/eines Operators) verkleinert nicht den Output. Welcher Operator der relationalen Algebra ist nicht monoton? Datalog ist monoton. (Keine Negation in Rümpfen von Regeln erlaubt.) Relationale Algebra und Datalog sind unvergleichbar, d. h. Durchschnitt von RA und Datalog: Datalog ohne Rekursion ≡ relationale Algebra ohne diff-Operator. Wie würde man das zeigen? Rekursive Anfragen nicht in relationaler Algebra. Relationale Algebra mit diff-Operator nicht in Datalog ausdrückbar. Einleitung Rekursion Integritätsbedingung Datalog Negation SQL Schluß Datalog ist monoton. z Datenbankeinsatz: Datalog – 25 Negation in rekursiven Regeln (1) Illustration – Beispiel 1: Illustration – Beispiel 1: Anfrage: „Alle Paare von Städten (x, y), so daß UA von x nach y fliegt, nicht aber AA.“ Prädikate: – UAreaches(x, y) :- Flights(UA, x, y, d, r) UAreaches(x, y) :- UAreaches(x, z), UAreaches(z, y) – AAreaches(x, y) :- Flights(AA, x, y, d, r) AAreaches(x, y) :- AAreaches(x, z), AAreaches(z, y) – UAonly(x, y) :- UAreaches(x, y), NOT AAreaches(x, y) UA1500-1800 UA 930-1230 SF Datalog DEN UA 1400-1700 AA 900-1430 Negation SQL Schluß airline UA AA UA UA AA AA AA UA Klemens Böhm from SF SF DEN DEN DAL DAL CHI CHI NY AA 1530-1730 AA 1500-1930 CHI AA 1900-2200 UA 1830-2130 Einleitung Rekursion Integritätsbedingung Datalog Negation DAL SQL Schluß to departs arrives DEN 930 1230 DAL 900 1430 CHI 1500 1800 DAL 1400 1700 CHI 1530 1730 NY 1500 1930 NY 1900 2200 NY 1830 2130 Datenbankeinsatz: Datalog – 27 Integritätsbedingung Datenbankeinsatz: Datalog – 26 Negation in rekursiven Regeln (1) Einleitung Rekursion Klemens Böhm Klemens Böhm Klemens Böhm Datenbankeinsatz: Datalog – 28 Einleitung Integritätsbedingung Rekursion Datalog SQL Negation Negation in rekursiven Regeln (3) Negation in Regelrümpfen würde Ausdrucksmächtigkeit erhöhen. Auswertung ist nichtdeterministisch. Beispiel: P(X) :- R(X), ¬Q(X). Q(X) :- R(X), ¬P(X). Illustration – Beispiel 2: EDB Prädikat R enthält einen Tupel (0). Wo ist (0)? – Zwei Lösungen. Zwei minimale Fixpunkte. Anwendung des Algorithmus führt zu „Oszillieren.“ Führt modelltheoretische Betrachtung zu gleichem Ergebnis wie beweistheoretische Betrachtung? Wiederholung: Anfrage ist sicher := Anfrage hat stets endliches Ergebnis, unabhängig vom Datenbank-Zustand. Beispiele? Einleitung Rekursion Integritätsbedingung Datalog Negation SQL Schluß Schluß Negation in rekursiven Regeln (2) Klemens Böhm Datenbankeinsatz: Datalog – 29 Datalog Negation SQL Schluß Integritätsbedingung Einleitung Rekursion Stratifikation (1) Strukturgraph für Regelmenge: Einleitung Rekursion Integritätsbedingung P Datalog Q P(X) :- R(X), ¬Q(X). Q(X) :- R(X), ¬P(X). Negation SQL Schluß Negation in rekursiven Regeln (4) Verwendung von Negation in Rümpfen muß kontrolliert erfolgen. Stratifiziertes Programm := Programm in Ebenen zerlegbar, die der Reihe nach auswertbar sind. Beispiel: T(X, Y) :- R(X, Y). Stratum 1 T(X, Y) :- R(X, Z), T(Z, Y). C(X, Y) :- ¬T(X, Y) Stratum 2 Datenbankeinsatz: Datalog – 30 Klemens Böhm Zykel mit Negation – stoßend. Vorfahre(X, Y) :- Elternschaft(X, Y). Vorfahre(X, Y) :- Elternschaft(X, Z), Vorfahre(Z, Y). Klemens Böhm Datenbankeinsatz: Datalog – 31 Klemens Böhm Datenbankeinsatz: Datalog – 32 Integritätsbedingung Datalog Negation Zahl der ausgehenden Kanten mit Negation bestimmt Abarbeitungsreihenfolge. Erst Prädikate mit Stratum 0. (AAreaches und UAreaches) Dann Prädikate mit Stratum 1. (UAonly) Einleitung UAreaches(x, y) :- Flights(UA, x, y, d, r) UAreaches(x, y) :- UAreaches(x, z), UAreaches(z, y) AAreaches(x, y) :- Flights(AA, x, y, d, r) AAreaches(x, y) :- AAreaches(x, z), AAreaches(z, y) UAonly(x, y) :- UAreaches(x, y), NOT AAreaches(x, y) Rekursion Integritätsbedingung Einleitung Rekursion Stratifikation (3) Strukturgraph für Beispiel 1: Stratifikation (2) Datalog Negation SQL SQL UAonly Schluß AAreaches Schluß UAreaches Kein solcher Zykel. z Datenbankeinsatz: Datalog – 33 Klemens Böhm Klemens Böhm Einleitung SQL-99 ermöglicht Rekursion in SQL Queries. DB2 implementiert es. Rekursion in SQL – Illustration (1) Einleitung Rekursion Integritätsbedingung Integritätsbedingung Datalog Datalog Negation Negation Rekursion Rekursion in SQL SQL SQL Schluß Schluß Klemens Böhm Datenbankeinsatz: Datalog – 34 Datenbankeinsatz: Datalog – 35 Datalog Programm: Reaches(x, y) :- Flights(a, x, y, d, r) Reaches(x, y) :- Reaches(x, z), Reaches(z, y) Formulierung in SQL-99: WITH RECURSIVE Reaches(frm, to) AS (SELECT frm, to FROM Flights) UNION (SELECT R1.frm, R2.to FROM Reaches R1, Reaches R2 WHERE R1.to = R2.frm) SELECT * FROM Reaches; Klemens Böhm Datenbankeinsatz: Datalog – 36 Erläuterungen: Aufbau Anfrage entspricht in struktureller Hinsicht Regeln. Rekursion nicht linear; manche Systeme unterstützen nur lineare Rekursion. Hier wird nur eine Relation berechnet. Weiteres Beispiel – Stratifikation Anfrage – wie zuvor: „Alle Paare von Städten (x, y), so daß UA von x nach y fliegt, nicht aber AA.“ Integritätsbedingung Datalog Negation SQL Schluß Klemens Böhm Einleitung Rekursion Integritätsbedingung Einleitung Rekursion Rekursion in SQL – Illustration (3) Rekursion in SQL – Illustration (2) Datalog Negation SQL Schluß Datenbankeinsatz: Datalog – 37 WITH Triples AS SELECT airline, frm, to FROM Flights, RECURSIVE Reaches(airline, frm, to) AS (SELECT * FROM Triples) UNION (SELECT Triples.airline, Triples.frm, Reaches.to FROM Triples, Reaches WHERE Triples.to=Reaches.frm AND Triples.airline = Reaches.airline) (SELECT frm, to FROM Reaches WHERE airline = ‚UA‘) EXCEPT (SELECT frm, to FROM Reaches WHERE airline= ‚AA‘); SQL Schluß Negation Datalog Integritätsbedingung Klemens Böhm Datenbankeinsatz: Datalog – 39 Einleitung Rekursion Integritätsbedingung Datalog Einleitung Rekursion Monotonizität Negation SQL Schluß Wechselseitige Rekursion Mutual Recursion Zwei rekursive Definitionen, die voneinander abhängen (d. h. Definition von A hat B im Rumpf u. u.) Erkennen mit Hilfe des Abhängigkeitsgraphen: Knoten – Relationen, Kante – direkte Abhängigkeit, Zykel. Datenbankeinsatz: Datalog – 38 Klemens Böhm ‚Verwendung‘ einer wechselseitig rekursiven Relation S in R ist monoton := Hinzunahme eines Tupels in S führt dazu, daß Tupel in R hinzukommt, oder R bleibt unverändert. Gegenbeispiel: ‚Oszillieren‘ im Beispiel. P(X) :- R(X), ¬Q(X) Q(X) :- R(X), ¬P(X) Klemens Böhm Datenbankeinsatz: Datalog – 40 Datalog Negation SQL Schluß Datalog Negation SQL Schluß Klemens Böhm Datalog Negation SQL Schluß P {(12), (34)} {(12), (34)} {(12), (34), (46)} {(12), (34), (46)} {(12), (34), (92)} {(12), (34), (92)} Runde 1 2 3 4 5 6 Rekursion Einleitung Q ∅ {(46)} {(46)} {(92)} {(92)} {(138)} Rekursion Integritätsbedingung Datalog Negation SQL Schluß Erläuterung: Berechnung des neuen Aggregatwerts entfernt alten aus Relation Q. Klemens Böhm Datenbankeinsatz: Datalog – 43 Datenbankeinsatz: Datalog – 42 Aggregation kann zu NichtMonotonizität führen – Illustration (3) Fixpunkt-Berechnung: Integritätsbedingung Integritätsbedingung Aggregation kann zu NichtMonotonizität führen – Illustration (2) Einleitung Rekursion Datenbankeinsatz: Datalog – 41 Klemens Böhm Textuelle Beschreibung: P ist Vereinigung von Q und einer EDB Relation R. Q enthält einen Tupel, der die Summe der Elemente von P ist. Einleitung Textuelle Beschreibung: P ist Vereinigung von Q und einer EDB Relation R. Q enthält einen Tupel, der die Summe der Elemente von P ist. Umsetzung in SQL: Rekursion Integritätsbedingung WITH RECURSIVE P(x) AS (SELECT * FROM R) EXCEPT (SELECT * FROM Q), RECURSIVE Q(x) AS (SELECT * FROM R) EXCEPT (SELECT * FROM P) SELECT * FROM P; Erläuterungen: Nicht zulässig – wechselseitige Rekursion nicht erlaubt, wenn nicht monoton. Einleitung Aggregation kann zu NichtMonotonizität führen – Illustration (1) Rekursion in SQL – weiteres Beispiel WITH RECURSIVE P(x) AS (SELECT * FROM R) UNION (SELECT * FROM Q), RECURSIVE Q(x) AS SELECT SUM(x) FROM P SELECT * FROM P; Klemens Böhm Datenbankeinsatz: Datalog – 44 Datalog Negation SQL Schluß Klemens Böhm Datenbankeinsatz: Datalog – 45 Wie unterscheidet sich Datalog von relationalen Kalkülen, relationaler Algebra, Prolog, SQL? Warum beschäftigen wir uns mit Datalog, gegeben, daß wir relationale Kalküle schon kennen? Wie formuliert man Integritätsbedingungen in Datalog? Integritätsbedingung Gegenstand dieses Kapitels: Anfragesprache für das relationale Datenmodell, die sich aber von bekannten Sprachen unterscheidet. Auswertbarkeit garantiert, effizient. Rekursion – wichtiges Merkmal, das bisher gefehlt hat. Erweiterungen von Datalog (insbesondere Negation) bringen Probleme mit sich, die hier nur angedeutet wurden. Datenbankeinsatz: Datalog – 46 Klemens Böhm Mögliche Prüfungsfragen (2) Literatur Was bedeutet modelltheoretische/ beweistheoretische Semantik von Datalog Programmen? Unter welchen Umständen können diese Betrachtungsweisen sich im Ergebnis unterscheiden? Was ist Stratifikation? Warum ist dieses Konzept im Kontext von Datalog bedeutsam? Was ist Zusammenhang zwischen Aggregation und Nicht-Monotonizität? Gottfried Vossen. Datenmodelle, DatenbankSprachen und Datenbank-Managementsysteme. 4. Auflage. Oldenbourg-Verlag. Kapitel 12.3. Hector Garcia-Molina, Jeffrey D. Ullman, Jennifer Widom. Database Systems: The Complete Book. Prentice Hall. Kapitel 10. Klemens Böhm Datenbankeinsatz: Datalog – 47 Einleitung Rekursion Mögliche Prüfungsfragen (1) Schlußbemerkungen Klemens Böhm Datenbankeinsatz: Datalog – 48