《专家系统破解篇 七、IL代码破解》之 规则推理

规则推理 经过 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对象方法。 } } }

    /// <summary>
    /// 条件对应的规则
    /// </summary>
    /// <param name="A_0">条件正反符号--用户输入信息</param>
    /// <remarks>条件对应事实索引Init类的规则List循环操作 </remarks>
    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类:

<!-- lang: c# -->
  /// <summary>
    /// 设置结论正反符号
    /// </summary>
    /// <param name="A_0"></param>
    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类:

<!-- lang: c# -->
  /// <summary>
    /// 一条规则中的多个条件
    /// </summary>
    /// <param name="A_0"></param>
    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;
            }
        }

    }

等我有时间,搞一个图出来~

本人声明:沐海(http://my.oschina.net/mahaisong) 以上文章是经过本人设计实践和阅读其他文档得出。如果需要探讨或指教可以留言!欢迎交流!

转载于:https://my.oschina.net/mahaisong/blog/140313

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值