/// <summary> /// Builtin_node_left_activations the specified memory. /// </summary> /// <param name="memory">The memory.</param> /// <param name="tok">The tok.</param> /// <param name="w">The w.</param> private void builtin_node_left_activation(BuiltinMemory memory, Token tok, WME w) { Token new_token = make_token(memory, tok, w); memory.Items.AddToFront(new_token); if (memory.PerformEvaluation(new_token)) { foreach (ReteNode child in memory.Children) { left_activation(child, new_token, w); } } }
/// <summary> /// Build_builtin_nodes the specified parent. /// </summary> /// <param name="parent">The parent.</param> /// <param name="c">The c.</param> /// <param name="earlier_conds">The earlier_conds.</param> /// <returns></returns> private BuiltinMemory build_builtin_node(ReteNode parent, Condition c, IList<LeftHandSideCondition> earlier_conds) { BuiltinMemory new_node = new BuiltinMemory(c.ToString()); new_node.Type = ReteNodeType.Builtin; new_node.Parent = parent; parent.Children.AddToFront(new_node); new_node.Builtin = ((FuncTerm) c.Attribute).Builtin; int cntOfEarlierConditions = earlier_conds.Count - 1; if (c.Id.TermType == TermType.Variable) { for (int i = cntOfEarlierConditions; i >= 0; i--) { Condition earlier_cond = earlier_conds[i]; if (earlier_cond.ConditionType == ConditionType.Positive) { for (int f2 = 0; f2 < 3; f2++) { Variable o = earlier_cond.Fields[f2] as Variable; if (o != null && o.Equals(c.Id)) { VariableSubstituter vs = new VariableSubstituter(); vs.FieldNumber = f2; vs.NumberOfLevelsUp = (cntOfEarlierConditions - i); vs.BindingPair.Variable = o; new_node.LeftArgument = vs; f2 = 3; i = -1; //escape loop of cntOfEarlierConditions } } } } } else { new_node.LeftArgument = new ConstantSubstitutor(c.Id); } if (c.Value.TermType == TermType.Variable) { for (int i = cntOfEarlierConditions; i >= 0; i--) { Condition earlier_cond = earlier_conds[i]; if (earlier_cond.ConditionType == ConditionType.Positive) { for (int f2 = 0; f2 < 3; f2++) { Variable o = earlier_cond.Fields[f2] as Variable; if (o != null && o.Equals(c.Value)) { VariableSubstituter vs = new VariableSubstituter(); vs.FieldNumber = f2; vs.NumberOfLevelsUp = (cntOfEarlierConditions - i); vs.BindingPair.Variable = o; new_node.RightArgument = vs; f2 = 3; i = -1; //escape loop of cntOfEarlierConditions } } } } } else { new_node.RightArgument = new ConstantSubstitutor(c.Value); } update_new_node_with_matches_from_above(new_node); return new_node; }