依据表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

posted on 2021-06-04 18:31  夜_归_人  阅读(1063)  评论(0编辑  收藏  举报