Chase Tree #
A ChaseTree is a special kind of TreeDerivation which is defined for a KnowledgeBase
and enforces the root of the TreeDerivation to be the database from the KnowledgeBase.
Compared to the TreeDerivation 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 ChaseTree is to the TreeDerivation what the ChaseBranch is to the ChaseDerivation.
The ChaseTree merely extends the TreeDerivation with the condition that the root is the database from the knowledge base.
- tree : FiniteDegreeTree N
- triggers_exist (t2 : FiniteDegreeTree N) : t2 <:+ self.tree → ∀ (before : N), before ∈ t2.root → ChaseNode.succ_list before t2.childNodes
Instances For
An element is a member of the tree iff it occurs at some address.
We can convert ChaseDerivations that are branches in the ChaseTree to ChaseBranches.
Equations
- ChaseTree.chaseBranch_for_branch branch_mem = { toChaseDerivation := branch, database_first := ⋯ }
Instances For
The root of the ChaseTree does not contain any function terms.
A node that has an origin must be in a child tree.
Each node that has an origin must be a child node of some other node in the tree.
RegularChaseTree #
Similar to the RegularTreeDerivation, we consider RegularChaseTrees as the special ChaseTrees where the node type is fixed to be RegularChaseNode (representing Skolem and restricted chase).
Equations
- RegularChaseTree obs kb = ChaseTree (RegularChaseNode obs kb.rules) obs kb
Instances For
Opposed to a TreeDerivation, 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.
We define a shortcut for RegularTreeDerivation.result.
Equations
Instances For
Each element of the result of a ChaseTree 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.