Lably
Skip to content

Datalog

Declarative logic programming language

  • 15 min read
  • 12 chapters

Related on Lably

Through Logic programming, Query language and Computer network

Example

A Datalog program consists of facts, which are statements that are held to be true, and rules, which say how to deduce new facts from known facts. For example, here are two facts that mean xerces is a parent of brooke and brooke is a parent of damocles:

<span id="mwGw"></span><span class="nf" id="mwHA">parent</span><span class="p" id="mwHQ">(</span><span class="s s-Atom" id="mwHg">xerces</span><span class="p" id="mwHw">,</span> <span class="s s-Atom" id="mwIA">brooke</span><span class="p" id="mwIQ">).</span> <span class="nf" id="mwIg">parent</span><span class="p" id="mwIw">(</span><span class="s s-Atom" id="mwJA">brooke</span><span class="p" id="mwJQ">,</span> <span class="s s-Atom" id="mwJg">damocles</span><span class="p" id="mwJw">).</span>

The names are written in lowercase because strings beginning with an uppercase letter stand for variables. Here are two rules:

<span id="mwKw"></span><span class="nf" id="mwLA">ancestor</span><span class="p" id="mwLQ">(</span><span class="nv" id="mwLg">X</span><span class="p" id="mwLw">,</span> <span class="nv" id="mwMA">Y</span><span class="p" id="mwMQ">)</span> <span class="p" id="mwMg">:-</span> <span class="nf" id="mwMw">parent</span><span class="p" id="mwNA">(</span><span class="nv" id="mwNQ">X</span><span class="p" id="mwNg">,</span> <span class="nv" id="mwNw">Y</span><span class="p" id="mwOA">).</span> <span class="nf" id="mwOQ">ancestor</span><span class="p" id="mwOg">(</span><span class="nv" id="mwOw">X</span><span class="p" id="mwPA">,</span> <span class="nv" id="mwPQ">Y</span><span class="p" id="mwPg">)</span> <span class="p" id="mwPw">:-</span> <span class="nf" id="mwQA">parent</span><span class="p" id="mwQQ">(</span><span class="nv" id="mwQg">X</span><span class="p" id="mwQw">,</span> <span class="nv" id="mwRA">Z</span><span class="p" id="mwRQ">),</span> <span class="nf" id="mwRg">ancestor</span><span class="p" id="mwRw">(</span><span class="nv" id="mwSA">Z</span><span class="p" id="mwSQ">,</span> <span class="nv" id="mwSg">Y</span><span class="p" id="mwSw">).</span>

The :- symbol is read as "if", and the comma is read "and", so these rules mean:

  • X is an ancestor of Y if X is a parent of Y.
  • X is an ancestor of Y if X is a parent of some Z, and Z is an ancestor of Y.

The meaning of a program is defined to be the set of all of the facts that can be deduced using the initial facts and the rules. This program's meaning is given by the following facts:

<span id="mwVg"></span><span class="nf" id="mwVw">parent</span><span class="p" id="mwWA">(</span><span class="s s-Atom" id="mwWQ">xerces</span><span class="p" id="mwWg">,</span> <span class="s s-Atom" id="mwWw">brooke</span><span class="p" id="mwXA">).</span> <span class="nf" id="mwXQ">parent</span><span class="p" id="mwXg">(</span><span class="s s-Atom" id="mwXw">brooke</span><span class="p" id="mwYA">,</span> <span class="s s-Atom" id="mwYQ">damocles</span><span class="p" id="mwYg">).</span> <span class="nf" id="mwYw">ancestor</span><span class="p" id="mwZA">(</span><span class="s s-Atom" id="mwZQ">xerces</span><span class="p" id="mwZg">,</span> <span class="s s-Atom" id="mwZw">brooke</span><span class="p" id="mwaA">).</span> <span class="nf" id="mwaQ">ancestor</span><span class="p" id="mwag">(</span><span class="s s-Atom" id="mwaw">brooke</span><span class="p" id="mwbA">,</span> <span class="s s-Atom" id="mwbQ">damocles</span><span class="p" id="mwbg">).</span> <span class="nf" id="mwbw">ancestor</span><span class="p" id="mwcA">(</span><span class="s s-Atom" id="mwcQ">xerces</span><span class="p" id="mwcg">,</span> <span class="s s-Atom" id="mwcw">damocles</span><span class="p" id="mwdA">).</span>

Some Datalog implementations don't deduce all possible facts, but instead answer queries:

<span id="mweQ"></span><span class="s s-Atom" id="mweg">?-</span> <span class="nf" id="mwew">ancestor</span><span class="p" id="mwfA">(</span><span class="s s-Atom" id="mwfQ">xerces</span><span class="p" id="mwfg">,</span> <span class="nv" id="mwfw">X</span><span class="p" id="mwgA">).</span>

This query asks: Who are all the X that xerces is an ancestor of? For this example, it would return brooke and damocles.

Sign in to keep reading

11 more chapters are free with a Lably account.

More in Computing and communication