Example #1
0
        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());
     }
 }