功能说明:

以一定格式自定义规则文件,保存为txt格式,用此解析器来消化这种格式的规则

目前只支持每条规则最多两个条件,两个条件间的逻辑运算只支持and 和 or

条件值和结果值只接受string,bool,int,float类型,输出目前只支持等于(=)操作符。

以下是调用操作(对应最后的示例):

if __name__=='__main__':
    rt=ruletable("RULE1.txt")    
    rule_table= rt.rule_table # which record the rule,is a dataframe 
    case={'personality':'kind','sex':'male'}
    result=rt.reason(case)
    print(result)

原理说明:根据格式化的txt文件,读取并且解析其中的规则,生成规则表(ruletable)类。规则表中记录了各类事实和对应的结果以及事实的关系。将输入案例case输入到一个ruletable实例的reason(case)函数中,reason函数根据case中记录的事实,参考规则表进行事实名称和事实值的匹配,如果匹配成功,那么分别记录下对应的推理结果,整合后作为推理输出。

 

数据格式:输入:以字典结构来记录各个事实作为输入

输出:以字典结构来记录各个推理结果作为输出

(字典与json比较方便相互转换)

 

规则格式

if [fact1] = [fact_value] and [fact2] = [fact2_value] then [result_name]=[result_value]

这里角括号中的内容根据使用来定制

Example:if personality = kind and sex=male then type= good man

 

关键字:"!=",">=","<=","=","<",">","if","then"," and"," or","(",")"

在对规则进行编写时,应该避开这些关键字,否则会造成解析错误。即以上关键字不能出现在 规则格式[  ]中出现。

 

类型控制:目前所有[fact_value]  [result_value] 都只支持 bool,string,int,float四种类型。

 

Example:if error_factor < (float) 0.1 then rewardmoney = (int)10000

 

规则解释:当错误因素小于0.1时候,奖励10000元

当涉及数字比较的时候需要在数值前用小括号来指定数值的类型。如果是bool型,那么

正确,是:(bool)1

错误,否:(bool)0

Example:if isstudent = (bool)1 then discount=float(0.7)

规则解释:当 是否学生 为“是” 则 折扣为0.7

如果不强制控制类型那么所有类型默认为string类型

 

支持最多两条结果输出:

在编写rule.txt的时候,支持一个条件满足,两个输出

Example:if function = (string) video  then cpu=i3 and type=轻薄

解释:如果 用来看视频,那么使用 cpu=i3 和轻薄类型(的笔记本)

 

支持循环推理:经过一轮推理得到的结果会作为输入再次进入规则引擎进行匹配,直到没有新的结果产生,推理结束:

示例:

python原型匹配 python规则匹配引擎_python原型匹配

 

 

以上四条是我随意写下的四条规则。

Input:case={'personality':'kind','sex':'male'}
Output:{'prefer': 'love animal', 'action': "don't kill animal", 'peopletype': 'goodboy'}

可以看到,在第三条规则中的action并不是我们输入的项目,而是经过personality:kind经过第一条规则和第二条规则推理得出的,然后最后我们得到了peopletype:goodboy的结果。

具体代码和测试例子参见https://github.com/zuozhenLib/A-Rule-Engine-based-on-Python