《专家系统破解篇 六、IL代码破解--配套乱说》之 FeatherskyExpertSystem

这种规则作为输入。

if 市电中断 ^ 停电 then 检查市电;

得到全部的 条件和结论(所有的事实)。 放入 推理机对象的 A 参数中。 A是 List<string> 所有的事实 在此输入图片描述

通过规则,结论,规则结论, 的顺序 生成的,已经有的条件,则不再存入。

B 得到全部的 条件与结论 存在 A中的对应的索引值。 在此输入图片描述

B是SortedList<string, int> 对应存储 《规则,结论 : 对应A中的位置》

但是排列的顺序不是按照 大小排列的。 注意生成方式。

E 也就是D 的 对象。

那么D类的属性值: D.B属性有1017个。 DB属性是 List<a> 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) 以上文章是经过本人设计实践和阅读其他文档得出。如果需要探讨或指教可以留言!欢迎交流!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值