基于产生式的小型专家系统

本文详细描述了一项人工智能实验,旨在利用Python和PyQt5构建一个动物识别专家系统,通过正向和反向推理实现规则库的编辑、事实库的建立以及系统有效性分析。学生需设计规则、收集数据并运用知识库进行推理,展示了Python在AI系统开发中的优势和问题解决过程。
摘要由CSDN通过智能技术生成

一、实验目的与要求

1、能够利用人工智能算法和所学知识,对复杂人工智能应用系统,选择合理的研究路线,构建可行的应用系统构架。
2、能够完成人工智能功能模块的设计,能体现优化和创新意识。
3、能够采用开源人工智能开发技术与平台,合理实现复杂人工智能应用系统与设计实验方案。
4、根据人工智能应用系统测试实验目的,确定需要的数据,科学采集实验数据。
5、能够遵循技术文档规范撰写复杂人工智能应用系统技术报告和设计文档,并对收集的实验数据合理分析人工智能应用系统设计的有效性。

二、实验内容

1、系统设置,包括系统名称和系统谓词,给出谓词名及其含义。
2、编辑知识库,通过输入规则或修改规则等,建立规则库。
3、建立事实库(综合数据库),输入多条事实或结论。
4、运行推理,包括正向推理和反向推理,给出相应的推理过程、事实区和规则区。
5、分析该专家系统设计实现的有效性。

三、实验设备与环境

设备:个人笔记本电脑
环境:python3.9.9、pycharm软件、pyqt5、pyuic

四、设计正文

1、产生式系统的基本结构
在这里插入图片描述
2、系统设置
系统名称:动物识别专家系统。
谓词定义:
在这里插入图片描述
3、编辑知识库
默认规则库:
R1: if 动物有毛发 then 动物是哺乳动物
R2: if 动物有奶 then 动物是哺乳动物
R3: if 动物有羽毛 then 动物是鸟
R4: if 动物会飞 and 会生蛋 then 动物是鸟
R5: if 动物吃肉 then 动物是食肉动物
R6: if 动物有犀利牙齿 and 有爪 and 眼向前方 then 动物是食肉动物
R7: if 动物是哺乳动物 and 有蹄 then 动物是有蹄类动物
R8: if 动物是哺乳动物 and 反刍 then 动物是有蹄类动物
R9: if 动物是哺乳动物 and 是食肉动物 and 有黄褐色 and 有暗斑点 then 动物是豹
R10:if 动物是哺乳动物 and 是食肉动物 and 有黄褐色 and 有黑色条纹 then 动物是虎
R11:if动物是有蹄类动物 and 有长脖子 and 有长腿 and 有暗斑点 then 动物是长颈鹿
R12:if 动物是有蹄类动物 and 有黑色条纹 then 动物是斑马
R13:if 动物是鸟 and 不会飞 and 有长脖子and有长腿 and有黑白二色 then 动物是鸵鸟
R14:if 动物是鸟 and 不会飞 and 会游泳 and 有黑白二色 then 动物是企鹅
R15:if 动物是鸟 and善飞 then 动物是信天翁
4、建立事实库(综合数据库)
(1)动物个体
金钱豹、虎、长颈鹿、斑马、鸵鸟、企鹅、信天翁。
(2)区别个体的特征
有羽毛、会飞、有犬齿、有爪、黄褐色、暗斑点、黑色条纹、长脖子、长腿、黑白二色、不飞。
(3)区别种类的特征
有奶、有毛发、吃肉、目盯前方、有蹄。
(4)种类
鸟、哺乳动物、食肉动物、有蹄动物。
5、运行推理
正向推理是一种从已知事实出发、正向使用推理规则的推理方式,亦称为数据驱动推理或前项链推理。
正向推理过程可用如下算法描述:
(1)把用户提供的初始证据放入综合数据库。
(2)检查综合数据库中是否包含了问题的解,若已包含,则求解结束,并成功退出;否则执行下一步。
(3)检查知识库中是否有可用知识,若有,形成当前可用知识集,执行下一步;否则转(5)。
(4)按照某种冲突消解策略,从当前可用知识集中选出一条知识进行推理,并将推出的新事实加入综合数据库中,然后转(2)。
(5)询问用户是否可以进一步补充新的事实,若可补充,则将补充的新事实加入综合数据库中,然后转(3);否则表示无解,失败退出。
逆向推理:
(1)将要求证的目标(称为假设)构成一个假设集;
(2)从假设集中选出一个假设,检查该假设是否在综合数据库中,若在,则该假设成立,此时,若假设集为空,则成功退出,否则仍执行(2);若该假设不在数据库中,则执行下一步;
(3)检查该假设是否可由知识库的某个知识导出。若不能由某个知识导出,则询问用户该假设是否为可由用户证实的原始事实,若是,该假设成立,并将其放入综合数据库,再重新寻找新的假设,若不是,则转(5);若能由某个知识导出,则执行下一步;
(4)将知识库中可以导出该假设的所有知识构成一个可用知识集;
(5)检查可用知识集是否为空,若空,失败退出;否则执行下一步;
(6)按冲突消解策略从可用知识集中取出一个知识,继续执行下一步;
(7)将该知识的前提中的每个子条件都作为新的假设放入假设集,转(2)。
6、规则库建立
根据规则,建立知识库文件RD.txt,内容如下图1所示。
在这里插入图片描述
7、绘制图像化界面
本实验将使用Python中的PyQt5设计动物识别专家系统的界面,因本次系统设计重在产生式规则算法步骤的实现,所以不提及Qt界面的搭建。初始界面如下图2所示。
在这里插入图片描述
8、关键算法
8.1 知识获取
在这里插入图片描述
图4 由规则集形成的推理网络
8.2 算法步骤
(1)首先将规则库里面的规则进行相应的排序和数据处理,以便之后的推理信息的匹配,此处将规则信息进行相应的拓扑排序,代码如下:

inn = []
for i in P:
    sum = 0
    for x in i:
        if Q.count(x) > 0:  # 能找到,那么
            sum += Q.count(x)
    inn.append(sum)
while (1):
    x = 0
    if inn.count(-1) == inn.__len__():
        break
    for i in inn:
        if i == 0:
            str = ' '.join(P[x])
            ans = ans + str + " " + Q[x] + "\n"  # 写入结果
            inn[x] = -1
            # 更新入度
            y = 0
            for j in P:
                if j.count(Q[x]) == 1:
                    inn[y] -= 1
                y += 1
        x += 1

(2)整理好规则库之后,我们开始进行推理功能的编写,在这里我们根据相应的规则匹配模式,对用户输入的需要推理的信息进行相应的判断,然后一步步的询问用户相关的规则信息,进行进一步的推理,直到完全匹配出推理信息。代码如下:

def go(self, flag=True):
    self.Q = []
    self.P = []
    fo = open('RD.txt', 'r', encoding='utf-8')
    for line in fo:
        line = line.strip('\n')
        if line == '':
            continue
        line = line.split(' ')
        self.Q.append(line[line.__len__() - 1])
        del (line[line.__len__() - 1])
        self.P.append(line)
    fo.close()
    print("go按钮按下")
    self.lines = self.textEdit.toPlainText()
    self.lines = self.lines.split('\n')  # 分割成组
    self.DB = set(self.lines)
    print(self.DB)
    self.str = ""
    print(self.str)
    flag = True
    temp = ""
    for x in self.P:  # 对于每条产生式规则
        if ListInSet(x, self.DB):  # 如果所有前提条件都在规则库中
            self.DB.add(self.Q[self.P.index(x)])
            temp = self.Q[self.P.index(x)]
            flag = False  # 至少能推出一个结论
            # print("%s --> %s" %(x, self.Q[self.P.index(x)]))
            self.str += "%s --> %s\n" % (x, self.Q[self.P.index(x)])

    if flag:  # 一个结论都推不出
        print("一个结论都推不出")
        for x in self.P:  # 对于每条产生式
            if ListOneInSet(x, self.DB):  # 事实是否满足部分前提
                flag1 = False       # 默认提问时否认前提
                for i in x:  # 对于前提中所有元素
                    if i not in self.DB:  # 对于不满足的那部分
                        btn = s.quest("是否" + i)
                        if btn == QtWidgets.QMessageBox.Ok:
                            self.textEdit.setText(self.textEdit.toPlainText() + "\n" + i)  # 确定则增加到textEdit
                            self.DB.add(i)  # 确定则增加到规则库中
                            flag1 = True    # 肯定前提
                            # self.go(self)
                if flag1:  # 如果肯定前提,则重新推导
                    self.go()
                    return
    self.textEdit_2.setPlainText(self.str)
    print("----------------------")
    print(self.str)
    if flag:
        btn = s.alert("啥也推不出来!!!")
        # if btn == QtWidgets.QMessageBox.Ok:  # 点击确定
        #     self.textEdit.setText(self.textEdit.toPlainText() + "\n确定")
    else:
        self.lineEdit.setText(temp)

(3)询问用户补充的推理信息进行进一步推理,代码如下:

def quest(self, info):
 		QtWidgets.QMessageBox.move(self, 200, 200)
  		 button = QtWidgets.QMessageBox.question(self, "Question",
                 self.tr(info),QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel, QtWidgets.QMessageBox.Cancel)
   	 return button

五、实验结果及分析

5.1 测试数据
(1)输入“有毛发”推出“哺乳动物”,正确。
在这里插入图片描述
(2)输入“鸟”, “长脖子”, “长腿”, “黑白二色”, “不飞’ =>推出‘鸵鸟’,复杂示例正确,即正向推理结果正确。
在这里插入图片描述
(3)输入“黑白二色”、“长脖子”、“会游泳”、“不飞”、“长腿”,此时无法正向推理出是什么动物,系统会对用户进行提问,询问其他特征进行识别。如下图7所示。
在这里插入图片描述
在对其他特征进行补充描述后,会重新进行推理识别,如下图8所示。
在这里插入图片描述
(4)当输入数据无法退出任何结果时,系统输出错误。
在这里插入图片描述
(5)在修改知识库按钮中,可以对原知识库内容进行修改,修改后进行确认即可完成,如下图10所示。
在这里插入图片描述

六、总结及进一步改进设想

1、遇到的问题
在本次实验中最大的问题就是第一步对于规则库的信息的整理和之后如何在匹配这些规则,开始使用了元组和集合,但是都难以进行多次匹配,于是想到了Python本身的字典的“键值对”属性,并且参考了相关文献,对信息做了拓扑排序。
2、解决方法
首先,对规则信息通过字典的格式存入相应的“RD.txt”文件中,然后对当中的信息进行相应的拓扑排序。
3、总结
本次实验项目,通过pyqt5与Eric6自动生成用户交互页面,体现了Python在前台的优势,同时整体的代码量比起用C/C++而言,大大减少,体现了Python在编写专家系统的优势。
4、体会与项目优化
本次实验遇到了一些问题,首先,要做到推理机和知识库分离,经过多次尝试之后,我选择了读取外部txt文件的方法,对综合数据库及规则库进行读入;其次,我选择可正向推理,推理机具备匹配规则、识别冲突、解决等功能,正向推理,从事实出发,通过规则库匹配出结论。由于本实验规则较少,本程序没有涉及冲突解决算法,只设计了判断其是何种动物及具备某种动物特征算法,若判断冲突,则得出条件有冲突,没有这样的动物的结论。
通过这次实验,对人工智能的产生式系统有了进一步的认识,特别是对正向推理有更深的了解,充分培养了我的独立解决问题的能力。由于首次设计比较生疏,加之时间较短,所以该系统还有许多不尽如人意的地方,例如界面设计不美观等,因此有待进一步改进。

  • 27
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
小型专家系统Prolog是一种基于逻辑编程的编程语言和环境,适用于构建专家系统和知识库。Prolog的名字来自于“Programming in Logic”的缩写,它基于一种被称为基于逻辑的语言的编程范,其中将问题定义为一组逻辑关系和规则。 Prolog的语法简洁且易于理解,其核心思想是使用关系和规则来表示问题的解决方案。基于逻辑的编程范允许我们通过事实和规则来描述问题的特性和关系。我们可以定义事实,比如“动物是哺乳动物”或“狗是动物”,以及规则,比如“如果动物是哺乳动物,那么它有胎生的特征”。 通过使用Prolog,我们可以以一种类似于自然语言的方来查询和推理我们定义的事实和规则。Prolog系统提供了一种称为回溯搜索的机制,它可以尝试不同的解决方案,直到找到满足查询的解。这使得Prolog非常适合开发专家系统,其中可以根据特定的领域知识和规则来推理和解决问题。 小型专家系统Prolog在许多领域有广泛的应用,例如疗诊断、自然语言处理和智能推理。通过构建一个基于Prolog的知识库,我们可以使用该系统来回答特定领域的问题和查询,从而提供有价值的专家意见和解决方案。 总而言之,小型专家系统Prolog是一种基于逻辑编程的语言和环境,它适用于构建专家系统和知识库。其简洁的语法和回溯搜索的机制使得它成为开发专家系统的理想选择,可以用于解决特定领域的问题和查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Conn_w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值