Chase Branch #
A ChaseBranch is a special kind of ChaseDerivation which is defined for a KnowledgeBase
and enforces the head of the ChaseDerivation to be the database from the KnowledgeBase.
This is arguably the most common way for defining chase sequences/derivations in the literature.
We call this branch here, since we consider rules with disjunctions that would actually create a chase tree (see TreeDerivation and ChaseTree)
and intuitively the ChaseBranch is a branch in such a tree. However, it can be defined outside the tree, which is what we do here (and mostly did for the `ChaseDerivation already).
Compared to the ChaseDerivation some new theorems can be shown or some existing ones strengthened. For example, we know now that functional terms can never occur in a database so every functional term must originate as a fresh term from some trigger that is used in the chase.
The ChaseBranch merely extends the ChaseDerivation with the condition that the head is the database from the knowledge base.
- branch : PossiblyInfiniteList (ChaseNode obs kb.rules)
- fairness (trg : RTrigger { cond := obs.cond, monotone := ⋯ } kb.rules) : ∃ (i : Nat), (∃ (node : ChaseNode obs kb.rules), node ∈ (self.branch.drop i).head ∧ ¬trg.val.active node.facts) ∧ ∀ (j : Nat) (node2 : ChaseNode obs kb.rules), node2 ∈ (self.branch.drop i).tail.get? j → ¬trg.val.active node2.facts
Instances For
We restate the database_first condition in terms of the ChaseDerivation vocabulary.
Opposed to a ChaseDerivation, we know that each node in a ChaseBranch has a finite set of facts. This is because the database is finite and each trigger only adds finitely many new facts.
The head of the ChaseBranch does not contain any function terms.
The result of a ChaseBranch not only models the rule set but the whole KnowledgeBase.
Constants in the chase must be in the database or in some rule.
Each functional term in the chase originates as a fresh term from a trigger.
If a functional term occurs in the chase, then the trigger that introduces this term must have been used in the chase.
If a functional term occurs in the chase, then the result of the trigger that introduces this term is contained in the current node.