diff --git a/experta/engine.py b/experta/engine.py index 108859b..45d3751 100644 --- a/experta/engine.py +++ b/experta/engine.py @@ -75,12 +75,12 @@ def modify(self, declared_fact, **modifiers): >>> ke.modify(my_fact, _0="hello", _1="world", other_key="!") """ - self.retract(declared_fact) + idx = self.retract(declared_fact) newfact = declared_fact.copy() newfact.update(dict(self._get_real_modifiers(**modifiers))) - return self.declare(newfact) + return self.declare(newfact, idx=idx) def duplicate(self, template_fact, **modifiers): """Create a new fact from an existing one.""" @@ -121,11 +121,12 @@ def retract(self, idx_or_declared_fact): .. note:: This updates the agenda """ - self.facts.retract(idx_or_declared_fact) + idx = self.facts.retract(idx_or_declared_fact) if not self.running: added, removed = self.get_activations() self.strategy.update_agenda(self.agenda, added, removed) + return idx def run(self, steps=float('inf')): """ @@ -209,7 +210,7 @@ def reset(self, **kwargs): self.running = False - def __declare(self, *facts): + def __declare(self, *facts, idx=None): """ Internal declaration method. Used for ``declare`` and ``deffacts`` """ @@ -222,7 +223,7 @@ def __declare(self, *facts): else: last_inserted = None for fact in facts: - last_inserted = self.facts.declare(fact) + last_inserted = self.facts.declare(fact, idx=idx) if not self.running: added, removed = self.get_activations() @@ -230,7 +231,7 @@ def __declare(self, *facts): return last_inserted - def declare(self, *facts): + def declare(self, *facts, idx=None): """ Declare from inside a fact, equivalent to ``assert`` in clips. @@ -241,4 +242,4 @@ def declare(self, *facts): if not self.facts: watchers.ENGINE.warning("Declaring fact before reset()") - return self.__declare(*facts) + return self.__declare(*facts, idx=idx) diff --git a/experta/factlist.py b/experta/factlist.py index 287c01e..62f339e 100644 --- a/experta/factlist.py +++ b/experta/factlist.py @@ -47,7 +47,7 @@ def _get_fact_id(fact): for k, v in fact.items() if not fact.is_special(k)]) - def declare(self, fact): + def declare(self, fact, idx=None): """ Assert (in clips terminology) a fact. @@ -73,7 +73,10 @@ def declare(self, fact): if self.duplication or fact_id not in self.reference_counter: # Assign the ID to the fact - idx = self.last_index + if idx is None: + idx = self.last_index + else: + idx = idx fact.__factid__ = idx # Insert the fact in the factlist