【人工智能】使用一阶谓词逻辑和产生式表示法实现动物识别系统
一、实验要求
熟悉一阶谓词逻辑和产生式表示法,掌握产生式系统的运行机制,以及基于规则推理的基本方法。
基于产生式规则的动物识别系统——识别虎、金钱豹、斑马、长颈鹿、鸵鸟、企鹅、信天翁等七种动物的产生式系统。
二、实验原理
把一组产生式放在一起,让它们互相配合、协同作用,一个产生式生成的结论可以供另一个产生式作为已知事实使用,以求得问题的解,这样的系统称为产生式系统。
一般来说,一个产生式系统由规则库、综合数据库、控制系统(推理机)三部分组成,三者关系如下图所示
规则库:用于描述相应领域内知识的产生式的集合。
综合数据库:又称为事实库、上下文、黑板等。用于存放问题求解过程中各种当前信息的数据结构,例如问题的初始状态、原始证据、推理中得到的中间结论以及最终结论。
控制系统:又称为推理机。由一组程序组成,负责整个产生式系统的运行,实现对问题的求解。
三、实验过程记录
我们要利用产生式规则求解动物识别问题,那首先需要根据这些动物识别的专家知识,建立规则库如下:
下面我们进行利用,假设当前在综合数据库中存放有下列已知事实:
该动物身上有暗斑点,长脖子,长腿,奶,蹄
我们从第一条规则开始匹配,发现只符合r2规则,则将r2的结论添加到综合数据库中,同时标记r2已匹配,避免重复匹配。此时综合数据库为:
该动物身上有暗斑点,长脖子,长腿,奶,蹄,哺乳动物
再次进行匹配,符合r7规则,添加结论并标记r7。此时综合数据库为:
该动物身上有暗斑点,长脖子,长腿,奶,蹄,哺乳动物,有蹄类动物
此时还没有确定动物是什么,再次进行匹配。符合r11规则,添加结论并标记r11。此时综合数据库为:
该动物身上有暗斑点,长脖子,长腿,奶,蹄,哺乳动物,有蹄类动物,长颈鹿
此时我们发现,已经确定了识别对象为长颈鹿,得到“该动物是长颈鹿”的最终结论。至此,该问题求解结束。
以上是系统的手动求解过程,我们下面用Pyhon编写程序求解。程序源代码如下:
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 final_judge(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):
print("\n根据所给条件无法判断为何种动物")
return;
rule_db={'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时!程序结束**************
''' )
#综合数据库
database=[]
while(1):
n=input("请输入前提条件:")
database.append(n)
if(n=='0'):
break
#输出前提条件
print("\n前提条件为:")
for i in range(0,len(database)-1):
print(rule_db[database[i]],end=" ")
#开始推理,遍历综合数据库匹配规则
print("\n推理过程如下:")
for i in database:
if(i=='1'):
if(judge_repeat('21',database)==0):
database.append('21')
print("有毛发->哺乳类")
elif(i=='2'):
if(judge_repeat('21',database)==0):
database.append('21')
print("产奶->哺乳类")
elif(i=='3'):
if(judge_repeat('22',database)==0):
database.append('22')
print("有羽毛->鸟类")
elif(i=='4'):
for i in database:
if(i=='5'):
if(judge_repeat('22',database)==0):
database.append('22')
print("不会飞,会下蛋->鸟类")
elif(i=='6'):
for i in database:
if(i=='21'):
if(judge_repeat('21',database)==0):
database.append('21')
print("食肉->哺乳类")
elif(i=='7'):
for i in database:
if(i=='8'):
for i in database:
if(i=='9'):
if(judge_repeat('23',database)==0):
database.append('23')
print("有犬齿,有爪,眼盯前方->食肉类")
elif(i=='10'):
for i in database:
if(i=='21'):
if(judge_repeat('24',database)==0):
database.append('24')
print("有蹄,哺乳类->蹄类")
elif(i=='11'):
for i in database:
if(i=='21'):
if(judge_repeat('24',database)==0):
database.append('24')
print("反刍,哺乳类->哺乳类")
final_judge(database)
四、实验结果
以上述实验过程中手动判断的条件“该动物身上有暗斑点,长脖子,长腿,奶,蹄”为例,运行结果如下。可以正确推理出“该动物为长颈鹿”的结论。
五、实验过程中存在的问题及解决方案
问题:一开始根据特点推断容易错误或推断出多个结论
原因:规则较少,不能很好的覆盖要推断的对象
解决方案:增加对每种待识别对象特征的规则,扩充规则库。
六、实验总结
在这次实验中,我们实现了一个基于产生式规则的动物识别系统。通过该实验,我进一步熟悉了一阶谓词逻辑和产生式表示法,掌握了产生式系统的运行机制以及基于规则推理的基本方法。
此外,我们分析上述产生式规则可以看出,虽然系统是用来识别七种动物的,但它并不是简单的只设计7条规则,而是设计了15条规则。基本想法是从粗到细进行分类,随条件增加逐步缩小范围,最终给出识别7种动物的规则。这样做有两个好处:一是已知事实不完全时,虽然推断不出来最终结论,但至少可以得到分类结果;二是当需要扩展系统时,规则库中只需要添加这类动物的个性知识即可,共性知识已经在系统中存在了,可以直接利用。
此外,产生式表示法有以下的优缺点。
优点:自然性、模块性、有效性、清晰性
缺点:效率不高且不能表达具有结构性的知识
原文地址:https://blog.csdn.net/qq_41626672/article/details/135863453
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!