Implemented a first and basic version of a Rete rule engine

This commit is contained in:
2021-02-09 16:06:32 +01:00
parent 821dbed189
commit a2a8d5c5e5
110 changed files with 7301 additions and 1654 deletions
+17 -3
View File
@@ -5,6 +5,7 @@ import core.utils
ACTION_TYPE_PRINT = "print"
ACTION_TYPE_EXEC = "exec"
ACTION_TYPE_TEST = "test"
@dataclass
@@ -30,17 +31,23 @@ class Rule:
rule_id=None,
is_enabled=None):
self.metadata = RuleMetadata(action_type, name, predicate, action, id=rule_id, is_enabled=is_enabled)
self.compiled_predicate = None
self.compiled_predicates = None
self.compiled_action = None
from core.sheerka.services.SheerkaComparisonManager import SheerkaComparisonManager
self.priority = priority if priority is not None else SheerkaComparisonManager.DEFAULT_COMPARISON_VALUE
self.error_sink = None
# from SheerkaRete, not quite sure one when it will be used
self.rete_net = None
self.rete_p_nodes = [] # list of production nodes for this rule
self.rete_disjunctions = None # list of list as it may be several interpretation for a rule
def __repr__(self):
rule_id = f"#{self.metadata.id}"
if self.name:
rule_id += f" ({self.metadata.name})"
return f"Rule({rule_id}, when '{self.metadata.predicate}' {self.metadata.action_type} '{self.metadata.action}', priority={self.priority})"
action_type = "print" if self.metadata.action_type == "print" else "then"
return f"Rule({rule_id}, when '{self.metadata.predicate}' {action_type} '{self.metadata.action}', priority={self.priority})"
def __eq__(self, other):
if id(other) == id(self):
@@ -69,8 +76,12 @@ class Rule:
self.priority,
self.id,
self.metadata.is_enabled)
copy.compiled_predicate = self.compiled_predicate
copy.compiled_predicates = self.compiled_predicates
copy.compiled_action = self.compiled_action
copy.metadata.is_compiled = self.metadata.is_compiled
copy.metadata.id_is_unresolved = self.metadata.id_is_unresolved
# copy.error_sink = self.error_sink # Uncomment this line if necessary
return copy
@@ -102,3 +113,6 @@ class Rule:
def short_str(self):
return f"Rule(#{self.metadata.id}, '{self.metadata.predicate}', priority={self.priority})"
def get_rete_disjunctions(self):
return self.rete_disjunctions