这种规则作为输入。
if 市电中断 ^ 停电 then 检查市电;
得到全部的 条件和结论(所有的事实)。 放入 推理机对象的 A 参数中。
A是 List 所有的事实
通过规则,结论,规则结论, 的顺序 生成的,已经有的条件,则不再存入。
B是SortedList 对应存储 《规则,结论 : 对应A中的位置》
但是排列的顺序不是按照 大小排列的。 注意生成方式。
E 也就是D 的 对象。
那么D类的属性值: D.B属性有1017个。
DB属性是 List A类对象的 LIst列表
A类对象有两个子类, C类与E类。
加载时,通过不同情况,来构造C类与E类对象。
前1000个都是C类对象, 后17个是E类对象。
E对象 也就是A类对象, 对应的属性值 为*
Expert 对象
非公共成员:
成员D string[] ET_dp 是切割得到的全部的条件与结论的语句。
通过切割,得到对应的 结论和条件,存入到 a。b中。 而且对应的符号也要进行比对,才能确定。
通过 F 分析接口。做 针对与D 的 每一个切割得出的 规则的元素。
当前是针对 f_ap = new string[] { “if”, “then”, “~“, “^“, “;” };
用“end”字符做标识,通过标识 结束
做字符串的比对。 如果没有 返回“I” 字符。 通过I字符表示未知。
到以上, 规则库导入已经完成。
规则库导入完成后。
需要导入用户现象,通过用户现象与前件匹配。
对匹配得到的规则进行推理。
前件有可能是符合多个判断事实的。 而且每个判断事实有可能早在前面也出现过。甚至推理过。
根据前推理的结果,作为此次判断的依据之一。
通过得到推理现象,通过关键字分词。
分割成列表,通过推理现象,匹配, 加载匹配成功的规则, 对规则进行中间库记录。
得到结论之后,再次进入数据库中 加载匹配成功的规则。 依次到得到结果。 成立和不成立。 成立向下。不成立,返回。
鉴于实在没有思路。而又不得不破解此方法才能继续做。 选择使用数据推到
推理类初期加载 e 也就是 D类的对象, 得到1000条数据。 每条都是 C类对象。
C类对象中的 a_ep 参数 是 根据循环得到的索引值。
同时A类中的 a_ap 也存入 这1000个值。 即静态化了1000个A类型。放在List《a》里面。
C类作为初始的一个特殊列,重写一个 方法。 在使用C类对象时可以用
推理类直接进入LoadRule
规则库导入
通过 切割规则,得到全部的 规则的条件,结论,条件见的 关系 与判定。
初始化ET_dp 5000条
strArray2进行赋值。 得到 此切割数据。
对 此切割进行循环, 每次循环,都得到 if then 条件 结论等数据。
ET_cp最为 ET_dp的存储计数。
把每一条 切割数据 通过循环 放入到ET_dp 中去。
this.ET_dp[this.ET_cp++] = str2;
放完之后。 在最后的索引位置 加入 end ,结束标志。
this.ET_dp[this.ET_cp] = “end”;
重置 ET_cp 计数为0。 执行 this.ET_bf();方法。
.ET_bf();方法, 执行this.ET_ef();
this.ET_af();方法:
this.ET_ef();方法:
if (this.ET_dp[this.ET_cp] != null)
{
this.ET_fp = f.f_af(this.ET_dp[this.ET_cp]);
this.ET_gp = this.ET_dp[this.ET_cp];
this.ET_cp++;
return;
}
else
{
return;
}
通过ET_cp++;计数 来进行多次的比对。 每次不为NUll 的就 进行
f.f_af(this.ET_dp[this.ET_cp]);
并赋值给ET_fp 规则分析返回值。
this.ET_gp = this.ET_dp[this.ET_cp];
规则值存入。
到这里。 本次规则的if 关键字通过了规则分析, 存入了
ET_fp 分析后的值
this.ET_gp 原值。
this.ET_af();方法:
对ET_fp 是否是 if 进行判断。 如果不是, 则抛出。 如果是则做this.ET_cf();分析
this.ET_cf()
CF分析是针对 if 关键字的分析。
this.ET_ef();方法: 得到当前的下一条的数据。 向下走了一个。
走到第一个对应IF的 条件关键字。
ET_df()
然后直接进行 this.ET_af(ref num, ref num2);
this.ET_hp.Add(num);
this.ET_ip.Add(num2);
ET_af 因为 传入 af的参数是 0,
Af 对 if 后面的关键字进行分析。
首先是 ~符号。 符合~符号,则记录 判断标志 为-1 。执行 ef方法。 读取下一条关键字。
如果不是~符号。 是 条件或者结论。则 进行 af(int 当前关键字索引)方法的判断。得到A_0.
然后再进行ef() ,通过ef 知道 为 if时
在这里有个疯狂的嵌套递归方法。
为了大脑健康。我决定按照 测试数据去走一遍。
if ~冬天 ^ 干性皮肤 then 用大宝 ;
在加载完成时,首次调用 this.ET_bf() 开始。
重置 ET_cp 计数为0。 执行 this.ET_bf();方法。
this.ET_bf()。
中包含
this.ET_ef();
this.ET_af();
this.ET_ef();
得到 当前的 分析后的关键字 this.ET_fp
, 得到当前关键字this.ET_gp
。 索引++ this.ET_cp++
当前this.ET_cp=1;
this.ET_gp=”if”
this.ET_af();
判断是if break;
因为是循环。 所以继续进行, 如果不是if ,则进行关键字的操作。
this.ET_cf();
通过cf()调用
this.ET_ef();
得到 下一条关键字信息。
If 后面的
当前
this.ET_cp=2;
this.ET_gp=”~”
然后调用this.ET_df();//庞ó大洙
本人声明:沐海(http://my.oschina.net/mahaisong) 以上文章是经过本人设计实践和阅读其他文档得出。如果需要探讨或指教可以留言!欢迎交流!