public bool IsDiagonalNumber(RDNumber n, RDBool result, object factPool) { FactPool pool = (FactPool)factPool; if (pool.isDiagnal[n.Data] == result.Data) { return(false); } pool.isDiagnal[n.Data] = result.Data; return(true); }
private RDElement Calculate(Formula formula, Dictionary <string, RDElement> assginedValue) { if (formula.Parameters == null) { RDElement value = null; if (Context.Constant.IsConstant(formula, out value)) { return(value); } if (!assginedValue.TryGetValue(formula.OperationName, out value)) { throw new Exception("推理机错误:变量未定义:" + formula.OperationName); } return(value); } else { if (formula.OperationName == "And" && formula.Parameters.Length == 2) { RDBool left = Calculate(formula.Parameters[0], assginedValue) as RDBool; if (left.Data == true) { return(Calculate(formula.Parameters[1], assginedValue) as RDBool); } else { return(left); } } else if (formula.OperationName == "Or" && formula.Parameters.Length == 2) { RDBool left = Calculate(formula.Parameters[0], assginedValue) as RDBool; if (left.Data == false) { return(Calculate(formula.Parameters[1], assginedValue) as RDBool); } else { return(left); } } List <object> input = formula.Parameters.Select(p => (object)Calculate(p, assginedValue)).ToList(); input.Add(FactPool); MethodInfo method = null; if (!operations.TryGetValue(formula.OperationName, out method)) { throw new Exception("推理机错误:函数未定义:" + formula.OperationName); } RDElement result = method.Invoke(Context.Operations, input.ToArray()) as RDElement; return(result); } }
private void DeclareCallBack(int declareID) { if (tempSuccessFire == true) { return; } if (declareID == tempRule.Declaration.Generator.Length) // 变量已经全部定义 { // Will fail if condition doesn't return a RDBool RDBool result = Calculate(tempRule.Condition, tempAssginedValue) as RDBool; if (result.Data == true) // 如果IF条件满足 { if (FireSetters(tempRule, tempAssginedValue)) // 尝试触发THEN { tempSuccessFire = true; // 触发成功 } } } else { MethodInfo method = null; if (!declares.TryGetValue(tempRule.Declaration.Generator[declareID].Method, out method)) { throw new Exception("定义部分出错:函数未找到:" + tempRule.Declaration.Generator[declareID].Method); } List <object> input = (tempRule.Declaration.Generator[declareID].Variables as object[]).ToList(); input.AddRange(new object[] { tempAssginedValue, FactPool, tempRule, new Action <int>(DeclareCallBack), declareID + 1 }); method.Invoke(Context.Declares, input.ToArray()); } }