/// <summary> Remove a successor node /// </summary> /// <param name="">node /// </param> /// <param name="">engine /// </param> /// <param name="">mem /// @throws AssertException /// /// </param> public virtual void removeSuccessorNode(BaseNode node, Rete engine, IWorkingMemory mem) { if (removeNode(node)) { // we retract the memories first, before removing the node IAlphaMemory alpha = (IAlphaMemory)mem.getAlphaMemory(this); if (alpha.size() > 0) { IEnumerator itr = alpha.GetEnumerator(); while (itr.MoveNext()) { if (node is BaseAlpha) { BaseAlpha next = (BaseAlpha)node; next.retractFact((IFact)itr.Current, engine, mem); } else if (node is BaseJoin) { BaseJoin next = (BaseJoin)node; next.retractRight((IFact)itr.Current, engine, mem); } } } } }
/// <summary> method for propogating the retract /// </summary> /// <param name="">fact /// </param> /// <param name="">engine /// /// </param> protected internal virtual void propogateRetract(IFact fact, Rete engine, IWorkingMemory mem) { for (int idx = 0; idx < successorNodes.Length; idx++) { Object nNode = successorNodes[idx]; if (nNode is BaseAlpha) { BaseAlpha next = (BaseAlpha)nNode; next.retractFact(fact, engine, mem); } else if (nNode is BaseJoin) { BaseJoin next = (BaseJoin)nNode; // AlphaNodes always call retractRight in the // BetaNode next.retractRight(fact, engine, mem); } else if (nNode is TerminalNode) { Index inx = new Index(new IFact[] { fact }); ((TerminalNode)nNode).retractFacts(inx, engine, mem); } } }