产生式:一组产生式,互相配合/协调,其中一个产生式产生的结论可以作为另一个产生式的事实使用,以求解问题
如下图为产生式系统的基本结构:
产生式系统的基本结构
规则库:用于描述相应领域内过程性知识的产生式集合。对知识进行合理的组织与管理,提高问题求解效率。
综合数据库:
综合数据库(事实库、上下文、黑板等):存放问题求解过程中的各种信息的数据结构,包括初始状态、原始证据、中间结论、最终结论,其内容在推理过程中在动态、不断变化的。
控制系统(推理机构):由一组程序组成,负责整个产生式系统的运行,实现对问题的求解。
控制系统要做以下几项工作:
(1)从规则库中选择与综合数据库中的已知事实进行匹配。
(2)匹配成功的规则可能不止一条,进行冲突消解。
(3)执行某一规则时,如果其右部是一个或多个结论,则把这些结论加入到综合数
据库中:如果其右部是一个或多个操作,则执行这些操作。
(4)对于不确定性知识,在执行每一条规则时还要按一定的算法计算结论的不确定 性。
(5)检查综合数据库中是否包含了最终结论,决定是否停止系统的运行。
问题描述:基于产生式规则的动物识别系统——识别虎、金钱豹、斑马、长颈鹿、鸵鸟、企鹅、信天翁等七种动物的产生式系统。
1.以动物识别系统的产生规则为例,建造规则库和综合数据库,并能对他们进行添加、删除和修改操作
2.基于建立的规则库和综合数据库,进行推理
3.可以使用任何语言,需要有日志说明推理结果的解释
产生式规则如下:
解决思路如下:
前提条件:将每一个前提条件转换为一个对应的唯一的一个数学数字
中间结论:
结论:
产生式规则转换如下:
Python代码如下:
#动物识别系统 #自定义函数,判断有无重复元素 def judge_repeat(value,list=[]): for i in
range(0,len(list)): if(list[i]==value): return 1 else: if(i!=len(list)-1):
continue else: return 0 #自定义函数,对已经整理好的综合数据库real_list进行最终的结果判断 def
judge_last(list): for i in list: if(i=='23'): for i in list: if(i=='12'): for i
in list: if(i=='21'): for i in list: if(i=='13'):
print("黄褐色,有斑点,哺乳类,食肉类->金钱豹\n") print("所识别的动物为金钱豹") return 0 elif(i=='14'):
print("黄褐色,有黑色条纹,哺乳类,食肉类->虎\n") print("所识别的动物为虎") return 0 elif(i=='14'): for i
in list: if(i=='24'): print("有黑色条纹,蹄类->斑马\n") print("所识别的动物为斑马") return 0
elif(i=='24'): for i in list: if(i=='13'): for i in list: if(i=='15'): for i in
list: if(i=='16'): print("有斑点,有黑色条纹,长脖,蹄类->长颈鹿\n") print("所识别的动物为长颈鹿") return 0
elif(i=='20'): for i in list: if(i=='22'): print("善飞,鸟类->信天翁\n")
print("所识别的动物为信天翁") return 0 elif(i=='22'): for i in list: if(i=='4'): for i in
list: if(i=='15'): for i in list: if(i=='16'): print("不会飞,长脖,长腿,鸟类->鸵鸟\n")
print("所识别的动物为鸵鸟") return 0 elif(i=='4'): for i in list: if(i=='22'): for i in
list: if(i=='18'): for i in list: if(i=='19'): print("不会飞,会游泳,黑白二色,鸟类->企鹅\n")
print("所识别的动物企鹅") return 0 else: if(list.index(i) != len(list)-1): continue
else: print("\n根据所给条件无法判断为何种动物")
dict_before={'1':'有毛发','2':'产奶','3':'有羽毛','4':'不会飞','5':'会下蛋','6':'吃肉','7':'有犬齿',
'8':'有爪','9':'眼盯前方','10':'有蹄','11':'反刍','12':'黄褐色','13':'有斑点','14':'有黑色条纹',
'15':'长脖','16':'长腿','17':'不会飞','18':'会游泳','19':'黑白二色','20':'善飞','21':'哺乳类',
'22':'鸟类','23':'食肉类','24':'蹄类','25':'金钱豹','26':'虎','27':'长颈鹿','28':'斑马',
'29':'鸵鸟','30':'企鹅','31':'信天翁'} print('''输入对应条件前面的数字:
******************************************************* *1:有毛发 2:产奶 3:有羽毛 4:不会飞
5:会下蛋 * *6:吃肉 7:有犬齿 8:有爪 9:眼盯前方 10:有蹄 * *11:反刍 12:黄褐色 13:有斑点 14:有黑色条纹 15:长脖 *
*16:长腿 17:不会飞 18:会游泳 19:黑白二色 20:善飞 * *21:哺乳类 22:鸟类 23:食肉类 24:蹄类 *
*******************************************************
*******************当输入数字0时!程序结束*************** ''' ) #综合数据库 list_real=[]
while(1): #循环输入前提条件所对应的字典中的键 num_real=input("请输入:") list_real.append(num_real)
if(num_real=='0'): break print("\n") print("前提条件为:") #输出前提条件 for i in
range(0,len(list_real)-1): print(dict_before[list_real[i]],end=" ") print("\n")
print("推理过程如下:") #遍历综合数据库list_real中的前提条件 for i in list_real: if(i=='1'):
if(judge_repeat('21',list_real)==0): list_real.append('21') print("有毛发->哺乳类")
elif(i=='2'): if(judge_repeat('21',list_real)==0): list_real.append('21')
print("产奶->哺乳类") elif(i=='3'): if(judge_repeat('22',list_real)==0):
list_real.append('22') print("有羽毛->鸟类") else: if(list_real.index(i)
!=len(list_real)-1): continue else: break for i in list_real: if(i=='4'): for i
in list_real: if(i=='5'): if(judge_repeat('22',list_real)==0):
list_real.append('22') print("不会飞,会下蛋->鸟类") elif(i=='6'): for i in list_real:
if(i=='21'): if(judge_repeat('21',list_real)==0): list_real.append('21')
print("食肉->哺乳类") elif(i=='7'): for i in list_real: if(i=='8'): for i in
list_real: if(i=='9'): if(judge_repeat('23',list_real)==0):
list_real.append('23') print("有犬齿,有爪,眼盯前方->食肉类") elif(i=='10'): for i in
list_real: if(i=='21'): if(judge_repeat('24',list_real)==0):
list_real.append('24') print("有蹄,哺乳类->蹄类") elif(i=='11'): for i in list_real:
if(i=='21'): if(judge_repeat('24',list_real)==0): list_real.append('24')
print("反刍,哺乳类->哺乳类") else: if(i !=len(list_real)-1): continue else: break
judge_last(list_real)
编者赠语:
这是我大学的一次课堂小作业,就用Python(3.5)实现了一下,其实除此动物识别系统还有一个相似的植物水果识别系统(我也用Python实现了),我就不再次赘余了,如果还有不懂的那就看一下我的实验报告吧!
热门工具 换一换