依据表1、2、3数据,设计产生式系统的数据模型。
表 1 产生式规则
规则码 |
规则 |
R1 |
如果动物有奶,则它是哺乳动物 |
R2 |
如果动物有毛发,则它是哺乳动物 |
R3 |
如果动物有羽毛,则它是鸟 |
R4 |
如果动物会飞且生蛋,则它是鸟 |
R5 |
吃肉的哺乳动物是食肉动物 |
R6 |
有爪的犬齿目盯前方的哺乳动物是食肉动物 |
R7 |
有蹄的哺乳动物是有蹄动物 |
R8 |
反刍食物的有蹄动物是偶蹄动物 |
R9 |
黄褐色有黑色条文的食肉动物是老虎 |
R10 |
黄褐色有黑色斑点的食肉动物是金钱豹 |
R11 |
长腿长脖子有黄褐色半点的有蹄动物是长颈鹿 |
R12 |
有黑色白条的有蹄动物是斑马 |
R13 |
不会飞长腿长脖子的鸟是鸵鸟 |
R14 |
不会飞会游泳黑白色的鸟是企鹅 |
R15 |
善飞不怕风浪的鸟是海鸥 |
表2 动物特征集合:
有奶,有毛发,有羽毛,会飞,生蛋,有爪,有犬齿,目盯前方,吃肉,有蹄,反刍食物,黄褐色,黑色条纹,黑色斑点,长腿,长脖子,暗斑点,白色,不会飞,黑白色,会游泳,善飞,不怕风浪,哺乳动物,食肉动物,有蹄动物,偶蹄动物,鸟 |
表3 动物名称集合:
海燕,老虎,金钱豹,长颈鹿,斑马,鸵鸟,企鹅,海鸥 |
(1)规则库模块
由领域规则组成,在机器中以某种动态数据结构进行组织。一个产生式规则集中的规则,按其逻辑关系,一般可形成一个称为推理网络的结构图。该模块主要用于推理机的推理原则,推理机使用该规则来进行推理。
(2)推理机模块
推理机模块是一个程序模块,负责产生式规则的前提条件测试或匹配,规则的调度与选取,规则体的解释和执行。即推理机实施推理,并对推理进行控制,它也就是规则的解释程序。通过已知的事实,推理出中间结论或最终结论。
(3)动态数据库模块
动态数据库,亦称全局数据库、综合数据库、工作存储器、上下文、黑板等等,它是一个动态数据结构,用来存放初始事实数据、中间结果和最后结果等。最开始存储已知事实,然后把推出的中间结论等加入该数据库。
规则库:
代码如下:
1 import pandas 2 # 字符串集合list_str(事实)包含rule_str(特征字符串)中的字符串则返回True 3 def judgement(rule_str, list_str): 4 rule_str = rule_str.split(",") 5 for str_temp in rule_str: 6 if str_temp not in list_str: 7 return False 8 return True 9 10 11 conclusion = ["海燕", "老虎", "金钱豹", "长颈鹿", "斑马", "鸵鸟", "企鹅", "海鸥"] # 包含所有的最终结论,也可用excel 12 root = "rule.xlsx" 13 Rule_base = pandas.read_excel(root, engine="openpyxl") # 规则库--规则码,规则,特征,结论 14 # 请输入待测数据的组数n: 15 n = eval(input("请输入待测数据的组数 n :")) 16 # 开始推理 17 for i in range(n): 18 temp = input("请输入已知事实,以空格(',')分隔 :").split(",") 19 # 建立数据库 20 sql_animal = set() 21 for index in temp: # 填入已知特征 22 sql_animal.add(index) 23 rule_set = {i for i in range(15)} # 存放规则码,可去掉已经使用过的推理规则,减少重复搜索 24 not_update = True # 判断是否推出新的特征或结论,没有便可结束了 25 end = False # 成功推出结论,结束标志 26 print("推理过程:", "\n事实:", *temp) 27 while True: 28 not_update = True 29 for j in rule_set: 30 if judgement(Rule_base.loc[j, "前提"], sql_animal): 31 print("规则:", Rule_base.loc[j, "规则码"], Rule_base.loc[j, "规则"], " 前提:", Rule_base.loc[j, "前提"], " 结论:", 32 Rule_base.loc[j, "结论"]) 33 sql_animal.add(Rule_base.loc[j, "结论"]) 34 rule_set.remove(j) # 已经使用过的规则没必要再次使用 35 not_update = False 36 if Rule_base.loc[j, "结论"] in conclusion: 37 end = True 38 print("结论:本次推理结果为 ->", Rule_base.loc[j, "结论"], '\n- - - - - - - - - - - - - - - - - - - - - - - - ') 39 break 40 if end or not_update: # 已实现本次推理过程 41 if not_update: 42 print("结论:NULL (本次输入的特征无法推理出符合条件的动物!)\n- - - - - - - - - - - - - - - - - - - - - - - - ") 43 break 44 print("success!") 45
测试结果:
2021-06-04