Datalog ist eine deklarative Logikprogrammiersprache, die Ende der 1970er-Jahre als Abfragesprache für deduktive Datenbanken entstand. Sie ist syntaktisch eine Teilmenge von Prolog, verwendet aber ein anderes Auswertungsmodell: Datalog arbeitet bottom-up (von den Fakten zu den abgeleiteten Aussagen) und garantiert Terminierung, weil Rekursion auf monotone Mengen beschränkt ist.

Programmstruktur: Fakten, Regeln, Abfragen

% Fakten (Extension)
elternteil(anna, ben).
elternteil(ben, carla).

% Regeln (Intension)
vorfahre(X, Y) :- elternteil(X, Y).
vorfahre(X, Z) :- elternteil(X, Y), vorfahre(Y, Z).

% Abfrage
vorfahre(anna, X)?

Ein Datalog-Programm besteht aus Fakten (grundlegende Beziehungen), Regeln mit Horn-Klauseln (Kopf :- Rumpf) und Abfragen. Das Beispiel berechnet den transitiven Abschluss der Elternbeziehung — ein klassisches Muster, das in SQL erst über rekursive Common Table Expressions möglich ist.

Werkzeuge

souffle program.dl            # Soufflé: Datalog zu nativem C++ kompilieren
souffle program.dl -F fakten/ -D ergebnis/   # Fakten-Eingabe, Ausgabe-Verzeichnis
python3 -m pip install pyDatalog   # pyDatalog: Datalog in Python

Soufflé ist die bekannteste moderne Implementierung: Es übersetzt Datalog in paralleles C++ und wird vor allem in der statischen Analyse eingesetzt (z. B. Points-to-Analyse für Java). pyDatalog bringt die Logikprogrammierung nach Python, Datalog-basierte Regeln stecken außerdem in Datenbank-Erweiterungen wie dem LogicBlox-System und in Analyseverfahren vieler Compiler.

Eigenschaften

  • Negation ist nur in stratifizierter Form erlaubt (keine Negation in Rekursionszyklen), damit das Ergebnis eindeutig bleibt.
  • Die Trennung in Extension (EDB: Fakten) und Intension (IDB: Regeln) erinnert an Views über Basistabellen.
  • Datalog ist deterministisch und terminierend — anders als Prolog gibt es keine Suchreihenfolge und kein Backtracking.

Verwandte Themen: Prolog-Befehle zeigen die Top-down-Variante der Logikprogrammierung, SQL-Befehle die klassische Datenbankabfrage, Python-Befehle die Einbindung über pyDatalog. In der Welt der deklarativen Datenverarbeitung ergänzt jq die JSON-Seite: Dort fragt man Datenstrukturen deklarativ ab, Datalog fragt Faktenmengen ab.