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 (ChaseNode obs kb.rules)
- triggers_exist (ns : List Nat) (before : ChaseNode obs kb.rules) : before ∈ (self.tree.drop ns).root → let after := (self.tree.drop ns).childNodes; exists_trigger_list obs kb.rules before after ∨ not_exists_trigger_list obs kb.rules before after
Instances For
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
We restate the database_first condition in terms of the TreeDerivation vocabulary.
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.
The root of the ChaseTree does not contain any function terms.
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.