.. index:: single: datalog_protocol
.. _datalog_protocol/0:

.. rst-class:: right

**protocol**

``datalog_protocol``
====================

Datalog and incremental rule engine protocol (stratified negation subset).

| **Availability:** 
|    ``logtalk_load(datalog(loader))``

| **Author:** Paulo Moura
| **Version:** 0:1:0
| **Date:** 2026-02-13

| **Compilation flags:**
|    ``static``


| **Dependencies:**
|   (none)


| **Remarks:**

   - Rules: Rules are represented as ``rule(Id, Head, Body)`` where ``Body`` is a list of literals using ``Term`` for positive, ``neg(Term)`` for negative, and ``agg(Op, Template, Goals, Result)`` for aggregates where ``Op`` is one of ``count``, ``sum``, ``min``, or ``max``.
   - Facts: EDB facts are represented by callable and ground terms.
   - Limitations: Current version requires aggregate dependencies to be in lower strata.

| **Inherited public predicates:**
|    (none)

.. contents::
   :local:
   :backlinks: top

Public predicates
-----------------

.. index:: clear/0
.. _datalog_protocol/0::clear/0:

``clear/0``
^^^^^^^^^^^

Clears all loaded rules, base facts, derived facts, and explanation supports.

| **Compilation flags:**
|    ``static``

| **Mode and number of proofs:**
|    ``clear`` - ``one``


------------

.. index:: load_program/1
.. _datalog_protocol/0::load_program/1:

``load_program/1``
^^^^^^^^^^^^^^^^^^

Loads a full program represented as a list of ``rule(Id,Head,Body)`` and ``fact(Fact)`` terms, replacing current engine state.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``load_program(Program)``
| **Mode and number of proofs:**
|    ``load_program(+list)`` - ``one``


------------

.. index:: add_rule/3
.. _datalog_protocol/0::add_rule/3:

``add_rule/3``
^^^^^^^^^^^^^^

Adds or replaces a rule. Rule safety is checked.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``add_rule(Id,Head,Body)``
| **Mode and number of proofs:**
|    ``add_rule(+nonvar,+callable,+list(callable))`` - ``one``


------------

.. index:: remove_rule/1
.. _datalog_protocol/0::remove_rule/1:

``remove_rule/1``
^^^^^^^^^^^^^^^^^

Removes all rules matching a rule identifier.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``remove_rule(Id)``
| **Mode and number of proofs:**
|    ``remove_rule(+nonvar)`` - ``one``


------------

.. index:: begin/0
.. _datalog_protocol/0::begin/0:

``begin/0``
^^^^^^^^^^^

Starts a transaction by saving the current engine state snapshot.

| **Compilation flags:**
|    ``static``

| **Mode and number of proofs:**
|    ``begin`` - ``one``


------------

.. index:: commit/0
.. _datalog_protocol/0::commit/0:

``commit/0``
^^^^^^^^^^^^

Commits a transaction by discarding the saved state snapshot.

| **Compilation flags:**
|    ``static``

| **Mode and number of proofs:**
|    ``commit`` - ``one``


------------

.. index:: rollback/0
.. _datalog_protocol/0::rollback/0:

``rollback/0``
^^^^^^^^^^^^^^

Rolls back a transaction by restoring the saved state snapshot.

| **Compilation flags:**
|    ``static``

| **Mode and number of proofs:**
|    ``rollback`` - ``one``


------------

.. index:: assert_fact/1
.. _datalog_protocol/0::assert_fact/1:

``assert_fact/1``
^^^^^^^^^^^^^^^^^

Asserts a ground EDB fact if not already present.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``assert_fact(Fact)``
| **Mode and number of proofs:**
|    ``assert_fact(+callable)`` - ``one``


------------

.. index:: retract_fact/1
.. _datalog_protocol/0::retract_fact/1:

``retract_fact/1``
^^^^^^^^^^^^^^^^^^

Retracts an EDB fact if present.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``retract_fact(Fact)``
| **Mode and number of proofs:**
|    ``retract_fact(+callable)`` - ``one``


------------

.. index:: materialize/0
.. _datalog_protocol/0::materialize/0:

``materialize/0``
^^^^^^^^^^^^^^^^^

Computes rule closure from current EDB facts and loaded rules using a fixpoint algorithm.

| **Compilation flags:**
|    ``static``

| **Mode and number of proofs:**
|    ``materialize`` - ``one``


------------

.. index:: update/3
.. _datalog_protocol/0::update/3:

``update/3``
^^^^^^^^^^^^

Applies incremental EDB updates and propagates derivation additions/removals; returns the resulting truth delta.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``update(Inserts,Deletes,Delta)``
| **Mode and number of proofs:**
|    ``update(+list(callable),+list(callable),-compound)`` - ``one``


------------

.. index:: query/1
.. _datalog_protocol/0::query/1:

``query/1``
^^^^^^^^^^^

Enumerates currently true facts (EDB + IDB).

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``query(Goal)``
| **Mode and number of proofs:**
|    ``query(?callable)`` - ``zero_or_more``


------------

.. index:: query/2
.. _datalog_protocol/0::query/2:

``query/2``
^^^^^^^^^^^

Same as ``query/1`` while returning the unified goal as the second argument.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``query(Goal,Bindings)``
| **Mode and number of proofs:**
|    ``query(?callable,?callable)`` - ``zero_or_more``


------------

.. index:: explain/2
.. _datalog_protocol/0::explain/2:

``explain/2``
^^^^^^^^^^^^^

Returns one explanation for a currently true fact.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``explain(Fact,Explanation)``
| **Mode and number of proofs:**
|    ``explain(+callable,-nonvar)`` - ``zero_or_more``


------------

.. index:: (rules)/1
.. _datalog_protocol/0::(rules)/1:

``(rules)/1``
^^^^^^^^^^^^^

Returns the loaded rules.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``rules Rules``
| **Mode and number of proofs:**
|    ``rules-list`` - ``one``


------------

.. index:: facts/1
.. _datalog_protocol/0::facts/1:

``facts/1``
^^^^^^^^^^^

Returns all currently true facts as a sorted list.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``facts(Facts)``
| **Mode and number of proofs:**
|    ``facts(-list(callable))`` - ``one``


------------

.. index:: predicate_stratum/3
.. _datalog_protocol/0::predicate_stratum/3:

``predicate_stratum/3``
^^^^^^^^^^^^^^^^^^^^^^^

Enumerates predicate strata as functor, arity, and stratum number.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``predicate_stratum(Functor,Arity,Stratum)``
| **Mode and number of proofs:**
|    ``predicate_stratum(?atom,?integer,?integer)`` - ``zero_or_more``


------------

.. index:: strata/1
.. _datalog_protocol/0::strata/1:

``strata/1``
^^^^^^^^^^^^

Returns all strata grouped by stratum number and contained predicates.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``strata(Strata)``
| **Mode and number of proofs:**
|    ``strata(-list)`` - ``one``


------------

Protected predicates
--------------------

(none)

Private predicates
------------------

(none)

Operators
---------

(none)

