规则推理 经过 C类与E类。的构造已经很容易产生。
通过条件列表(1.2) 找到1这个条件对应的规则(规则中有1这个条件的)(规则A B)。 通过对规则A的多个条件判断,得到规则A的是否成立标志-----E类操作。
对A类的结论进行第二次推理。 即,A结论 A_ J 做规则的条件时,对应规则的成立。
也可以做第三次推理。依次类推。
重点在于三段代码:
入口 <!-- lang: c# --> for (int i = 0; i < QList.Count; i++) //主要推理过程---用户输入的条件列表 { this.operRulesList[QList[i]].QToRules(QState[i]);//条件对应--事实索引的对应--Init类:Basic类对象的方法(条件的正反 用户输入)
}A类 两层推理 1.根据条件找到规则,根据规则找到结论,2.根据结论找到规则,根据规则找到结论。 <!-- lang: c# --> public virtual void QListFRule(int A_0) { //appSettings EngineLevel if (A_0 <= 9)//5两层推理,9三层推理。 { //RUN类对象结论 for (int num = 0; num < this.Q_RuleIndex.Count; num++) { RulesList[this.Q_RuleIndex[num]].QListFRule(A_0 + 1); //Init对象方法。 } } }
////// 条件对应的规则 /// /// 条件正反符号--用户输入信息 ///条件对应事实索引Init类的规则List循环操作 public void QToRules(int Q_Istrue) { this.IsSuc = Q_Istrue;//事实被用户初始为 正反 //此事实对应多条规则 for(int num = 0;num < this.Q_RuleIndex.Count; num++) { RulesList[this.Q_RuleIndex[num]].QListFRule(0);//每条规则Run类对象的方法(0)。 } }
C类:
////// 设置结论正反符号 /// /// public override void QListFRule(int A_0) //重写A类方法 { int suc = 0;//初始结论正反符号为0 for ( int i = 0; i < base.A_RuleQIndex.Count; i++)//此事实做结论的多条规则 { if (RulesRelationBasic.RulesList[base.A_RuleQIndex[i]].IsSuc == base.A_State[i])//结论状态初始为1,规则是否成立与结论状态匹配 { suc = base.A_Istrue[i];//结论成立。则把结论正反符号标志 if (suc == -1) { break;//是否有规则的结论是-1符号 } } } if (base.IsSuc != suc) { base.IsSuc = suc; if (RulesRelationBasic.Result.ContainsKey(base.Index)) { base.QListFRule(A_0 + 1);//init:Basic类 return; } else { RulesRelationBasic.Result.Add(base.Index, base.Index); base.QListFRule(A_0 + 1); return; } } }
E类:
////// 一条规则中的多个条件 /// /// public override void QListFRule(int A_0)//重写A类中方法 { int suc = 1;//初始规则成立 for (int i = 0; i < base.A_RuleQIndex.Count; i++) //此规则多个条件是否都成立 { if (RulesRelationBasic.RulesList[base.A_RuleQIndex[i]].IsSuc != base.A_State[i]) { //条件不成立 suc = 0; break; } } if (base.IsSuc != suc) //上次其他条件计算的本规则的IsSuc,与本次是否相同 { base.IsSuc = suc; if (RulesRelationBasic.Result.ContainsKey(base.Index)) //规则插入Result结论 { base.QListFRule(A_0 + 1);//Basic类对象方法(1); return; } else { RulesRelationBasic.Result.Add(base.Index, base.Index); base.QListFRule(A_0 + 1); return; } } }
等我有时间,搞一个图出来~
本人声明:沐海( 以上文章是经过本人设计实践和阅读其他文档得出。如果需要探讨或指教可以留言!欢迎交流!