自学内容网 自学内容网

【人工智能】使用一阶谓词逻辑和产生式表示法实现动物识别系统

一、实验要求

        熟悉一阶谓词逻辑和产生式表示法,掌握产生式系统的运行机制,以及基于规则推理的基本方法。

        基于产生式规则的动物识别系统——识别虎、金钱豹、斑马、长颈鹿、鸵鸟、企鹅、信天翁等七种动物的产生式系统。

二、实验原理

        把一组产生式放在一起,让它们互相配合、协同作用,一个产生式生成的结论可以供另一个产生式作为已知事实使用,以求得问题的解,这样的系统称为产生式系统。

        一般来说,一个产生式系统由规则库、综合数据库、控制系统(推理机)三部分组成,三者关系如下图所示

        规则库:用于描述相应领域内知识的产生式的集合。

        综合数据库:又称为事实库、上下文、黑板等。用于存放问题求解过程中各种当前信息的数据结构,例如问题的初始状态、原始证据、推理中得到的中间结论以及最终结论。

        控制系统:又称为推理机。由一组程序组成,负责整个产生式系统的运行,实现对问题的求解。

三、实验过程记录

我们要利用产生式规则求解动物识别问题,那首先需要根据这些动物识别的专家知识,建立规则库如下:

        下面我们进行利用,假设当前在综合数据库中存放有下列已知事实:

该动物身上有暗斑点,长脖子,长腿,奶,蹄

        我们从第一条规则开始匹配,发现只符合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)!