一、实验目的

(1)增加学生对数据与知识工程课程的兴趣;
(2)使学生进一步理解并掌握知识表示方法;
(3)使学生加强对专家系统的理解和掌握,并培养学生综合运
用所学知识开发智能系统的初步能力。

二、实验要求

(1)用产生式规则作为知识表示,构建一个小型专家系统
(如分类、诊断、预测等类型),具体应用领域由学生自选,具
体系统名称由学生自定。
(2)编写程序语言及实验环境不限。
(3)程序运行时,应能在屏幕上显示程序运行结果。

三、专家系统例子(动物分类识别系统)

推理逻辑

(1)若某动物有奶,则它是哺乳动物。
(2)若某动物有毛发,则它是哺乳动物。
(3)若某动物有羽毛,则它是鸟。
(4)若某动物会飞且生蛋,则它是鸟。
(5)若某动物是哺乳动物且有爪且有犬齿且目盯前方,则它是
食肉动物。
(6)若某动物是哺乳动物且吃肉,则它是食肉动物。
(7)若某动物是哺乳动物且有蹄,则它是有蹄动物。
(8)若某动物是有蹄动物且反刍食物,则它是偶蹄动物。
(9)若某动物是食肉动物且黄褐色且有黑色条纹,则它是老虎。
(10)若某动物是食肉动物且黄褐色且有黑色斑点,则它是猎豹。
(11)若某动物是有蹄动物且长腿且长脖子且黄褐色且有暗斑点,
则它是长颈鹿。
(12)若某动物是有蹄动物且白色且有黑色条纹,则它是斑马。
(13)若某动物是鸟且不会飞且长腿且长脖子且黑白色,则它是
驼鸟。
(14)若某动物是鸟且不会飞且会游泳且黑白色,则它是企鹅。
(15)若某动物是鸟且善飞且不怕风浪,则它是海燕。

实现

1)交互界面

(1)GUI界面在这里插入图片描述
(2)未选择选项直接按“确定”按钮时,提示“请先进行选择!”
在这里插入图片描述
(3)选择专家系统中不存在的推理逻辑时,显示“无法判断该动物!”
在这里插入图片描述
(4)选择专家系统中存在的推理逻辑时,显示推理结果
在这里插入图片描述

2)工具安装

pyqt5+pyuic+designer.exe
参考: https://www.cnblogs.com/future-dream/p/12127817.html

3)代码

(1)professor.py

dict_init = {'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': '长颈鹿', '32': '斑马', '33': '鸵鸟', '34': '企鹅', '35': '海燕'}

rule = [
    [['有奶'],'哺乳动物'],
    [['有毛发'],'哺乳动物'],
    [['有羽毛'],'鸟'],
    [['会飞','生蛋'],'鸟'],
    [['哺乳动物','有爪','有犬齿','目盯前方'],'食肉动物'],
    [['哺乳动物','吃肉'],'食肉动物'],
    [['哺乳动物','有蹄'],'有蹄动物'],
    [['有蹄动物','反刍食物'],'偶蹄动物'],
    [['食肉动物','黄褐色','有黑色条纹'],'老虎'],
    [['食肉动物','黄褐色','有黑色斑点'],'猎豹'],
    [['有蹄动物','长腿','长脖子','黄褐色','有暗斑点'],'长颈鹿'],
    [['有蹄动物','白色','有黑色条纹'],'斑马'],
    [['鸟','不会飞','长腿','长脖子','黑白色'],'鸵鸟'],
    [['鸟','不会飞','会游泳','黑白色'],'企鹅'],
    [['鸟','善飞','不怕风浪'],'海燕'],
]

def reasoning(checkboxState):

    data = checkboxState  # 存放用户选择的多选框
    result = None  # 存放推理结果

    # 用户输入结束,开始推理
    if checkboxState != []:
        # 输出前提条件
        print("\n前提条件为:")
        for i in data:
            print(i,end="  ")
        print("\n")

        # 输出推理过程
        print("推理过程如下:")
        for i in range(len(rule)):
            flag = True
            # 判断用户输入的是否是同一个动物的特征
            for j in rule[i][0]:
                # print("j", j)
                if j in data:
                    continue
                else:
                    flag = False
            # 若是同一个动物的特征,则判断特征是否完全
            if flag:
                word = ""
                for j in rule[i][0]:
                    # print("j", j)
                    word = word + j + "且"
                    data.remove(j)
                word = word[0:-1]                      # 用于删除最后一个“且”
                word = word + ",则它是" + rule[i][1]
                # 动物特征完全,输出结果
                if len(data) == 0:
                    result = rule[i][1]
                    print(word)
                    print(f"\n该动物为{result}")
                    result = "该动物为" + result
                    break
                # 动物特征不完全,无法判断该动物
                print("无法判断该动物!\n\n")
        # 若特征不是同一个动物的
        if result is None:
            word = ""
            for i in data:
                word = word + i + "且"
            print(word[0:-1])
            print("\n无法判断该动物!\n\n")
            result = "无法判断该动物!"
    else:
        result = "请先进行选择!"

    return result

(2)GUI.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'GUI.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
import professor


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(692, 421)

        self.gridLayoutWidget = QtWidgets.QWidget(Form)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(50, 50, 548, 194))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.checkBox_1 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_1.setObjectName("checkBox")
        self.gridLayout.addWidget(self.checkBox_1, 0, 0, 1, 1)
        self.checkBox_2 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_2.setObjectName("checkBox_2")
        self.gridLayout.addWidget(self.checkBox_2, 0, 1, 1, 1)
        self.checkBox_3 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_3.setObjectName("checkBox_3")
        self.gridLayout.addWidget(self.checkBox_3, 0, 2, 1, 1)
        self.checkBox_4 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_4.setObjectName("checkBox_4")
        self.gridLayout.addWidget(self.checkBox_4, 0, 3, 1, 1)
        self.checkBox_5 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_5.setObjectName("checkBox_5")
        self.gridLayout.addWidget(self.checkBox_5, 1, 0, 1, 1)
        self.checkBox_6 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_6.setObjectName("checkBox_6")
        self.gridLayout.addWidget(self.checkBox_6, 1, 1, 1, 1)
        self.checkBox_7 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_7.setObjectName("checkBox_7")
        self.gridLayout.addWidget(self.checkBox_7, 1, 2, 1, 1)
        self.checkBox_8 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_8.setObjectName("checkBox_8")
        self.gridLayout.addWidget(self.checkBox_8, 1, 3, 1, 1)
        self.checkBox_9 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_9.setObjectName("checkBox_9")
        self.gridLayout.addWidget(self.checkBox_9, 2, 0, 1, 1)
        self.checkBox_10 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_10.setObjectName("checkBox_10")
        self.gridLayout.addWidget(self.checkBox_10, 2, 1, 1, 1)
        self.checkBox_11 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_11.setObjectName("checkBox_11")
        self.gridLayout.addWidget(self.checkBox_11, 2, 2, 1, 1)
        self.checkBox_12 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_12.setObjectName("checkBox_12")
        self.gridLayout.addWidget(self.checkBox_12, 2, 3, 1, 1)
        self.checkBox_13 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_13.setObjectName("checkBox_13")
        self.gridLayout.addWidget(self.checkBox_13, 3, 0, 1, 1)
        self.checkBox_14 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_14.setObjectName("checkBox_14")
        self.gridLayout.addWidget(self.checkBox_14, 3, 1, 1, 1)
        self.checkBox_15 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_15.setObjectName("checkBox_15")
        self.gridLayout.addWidget(self.checkBox_15, 3, 2, 1, 1)
        self.checkBox_16 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_16.setObjectName("checkBox_16")
        self.gridLayout.addWidget(self.checkBox_16, 3, 3, 1, 1)
        self.checkBox_17 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_17.setObjectName("checkBox_17")
        self.gridLayout.addWidget(self.checkBox_17, 5, 0, 1, 1)
        self.checkBox_18 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_18.setObjectName("checkBox_18")
        self.gridLayout.addWidget(self.checkBox_18, 5, 1, 1, 1)
        self.checkBox_19 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_19.setObjectName("checkBox_19")
        self.gridLayout.addWidget(self.checkBox_19, 5, 2, 1, 1)
        self.checkBox_20 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_20.setObjectName("checkBox_20")
        self.gridLayout.addWidget(self.checkBox_20, 5, 3, 1, 1)
        self.checkBox_21 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_21.setObjectName("checkBox_21")
        self.gridLayout.addWidget(self.checkBox_21, 6, 0, 1, 1)
        self.checkBox_22 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_22.setObjectName("checkBox_22")
        self.gridLayout.addWidget(self.checkBox_22, 6, 1, 1, 1)
        self.checkBox_23 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_23.setObjectName("checkBox_23")
        self.gridLayout.addWidget(self.checkBox_23, 6, 2, 1, 1)
        self.checkBox_24 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_24.setObjectName("checkBox_24")
        self.gridLayout.addWidget(self.checkBox_24, 6, 3, 1, 1)
        self.checkBox_25 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_25.setObjectName("checkBox_25")
        self.gridLayout.addWidget(self.checkBox_25, 7, 0, 1, 1)
        self.checkBox_26 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_26.setObjectName("checkBox_26")
        self.gridLayout.addWidget(self.checkBox_26, 7, 1, 1, 1)
        self.checkBox_27 = QtWidgets.QCheckBox(self.gridLayoutWidget)
        self.checkBox_27.setObjectName("checkBox_27")
        self.gridLayout.addWidget(self.checkBox_27, 7, 2, 1, 1)
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(310, 30, 54, 12))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(50, 250, 281, 16))
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(520, 280, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(Form)
        self.pushButton_2.setGeometry(QtCore.QRect(520, 310, 75, 23))
        self.pushButton_2.setObjectName("pushButton_2")
        self.textBrowser = QtWidgets.QTextBrowser(Form)
        self.textBrowser.setGeometry(QtCore.QRect(50, 270, 461, 71))
        self.textBrowser.setObjectName("textBrowser")

        # 按键响应
        self.pushButton.clicked.connect(self.buttonclick)
        self.pushButton_2.clicked.connect(self.buttonclick_2)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def checkboxState(self):
        checkboxState = []

        checkBoxStatus_1 = self.checkBox_1.isChecked()
        checkBoxStatus_2 = self.checkBox_2.isChecked()
        checkBoxStatus_3 = self.checkBox_3.isChecked()
        checkBoxStatus_4 = self.checkBox_4.isChecked()
        checkBoxStatus_5 = self.checkBox_5.isChecked()
        checkBoxStatus_6 = self.checkBox_6.isChecked()
        checkBoxStatus_7 = self.checkBox_7.isChecked()
        checkBoxStatus_8 = self.checkBox_8.isChecked()
        checkBoxStatus_9 = self.checkBox_9.isChecked()
        checkBoxStatus_10 = self.checkBox_10.isChecked()
        checkBoxStatus_11 = self.checkBox_11.isChecked()
        checkBoxStatus_12 = self.checkBox_12.isChecked()
        checkBoxStatus_13 = self.checkBox_13.isChecked()
        checkBoxStatus_14 = self.checkBox_14.isChecked()
        checkBoxStatus_15 = self.checkBox_15.isChecked()
        checkBoxStatus_16 = self.checkBox_16.isChecked()
        checkBoxStatus_17 = self.checkBox_17.isChecked()
        checkBoxStatus_18 = self.checkBox_18.isChecked()
        checkBoxStatus_19 = self.checkBox_19.isChecked()
        checkBoxStatus_20 = self.checkBox_20.isChecked()
        checkBoxStatus_21 = self.checkBox_21.isChecked()
        checkBoxStatus_22 = self.checkBox_22.isChecked()
        checkBoxStatus_23 = self.checkBox_23.isChecked()
        checkBoxStatus_24 = self.checkBox_24.isChecked()
        checkBoxStatus_25 = self.checkBox_25.isChecked()
        checkBoxStatus_26 = self.checkBox_26.isChecked()
        checkBoxStatus_27 = self.checkBox_27.isChecked()

        # for i in range(1, 28):
        #     name = "checkBox_" + str(1)
        #     checkboxState.append(self.name.isChecked())

        if checkBoxStatus_1 == True:
            checkboxState.append(self.checkBox_1.text())
        if checkBoxStatus_2 == True:
            checkboxState.append(self.checkBox_2.text())
        if checkBoxStatus_3 == True:
            checkboxState.append(self.checkBox_3.text())
        if checkBoxStatus_4 == True:
            checkboxState.append(self.checkBox_4.text())
        if checkBoxStatus_5 == True:
            checkboxState.append(self.checkBox_5.text())
        if checkBoxStatus_6 == True:
            checkboxState.append(self.checkBox_6.text())
        if checkBoxStatus_7 == True:
            checkboxState.append(self.checkBox_7.text())
        if checkBoxStatus_8 == True:
            checkboxState.append(self.checkBox_8.text())
        if checkBoxStatus_9 == True:
            checkboxState.append(self.checkBox_9.text())
        if checkBoxStatus_10 == True:
            checkboxState.append(self.checkBox_10.text())
        if checkBoxStatus_11 == True:
            checkboxState.append(self.checkBox_11.text())
        if checkBoxStatus_12 == True:
            checkboxState.append(self.checkBox_12.text())
        if checkBoxStatus_13 == True:
            checkboxState.append(self.checkBox_13.text())
        if checkBoxStatus_14 == True:
            checkboxState.append(self.checkBox_14.text())
        if checkBoxStatus_15 == True:
            checkboxState.append(self.checkBox_15.text())
        if checkBoxStatus_16 == True:
            checkboxState.append(self.checkBox_16.text())
        if checkBoxStatus_17 == True:
            checkboxState.append(self.checkBox_17.text())
        if checkBoxStatus_18 == True:
            checkboxState.append(self.checkBox_18.text())
        if checkBoxStatus_19 == True:
            checkboxState.append(self.checkBox_19.text())
        if checkBoxStatus_20 == True:
            checkboxState.append(self.checkBox_20.text())
        if checkBoxStatus_21 == True:
            checkboxState.append(self.checkBox_21.text())
        if checkBoxStatus_22 == True:
            checkboxState.append(self.checkBox_22.text())
        if checkBoxStatus_23 == True:
            checkboxState.append(self.checkBox_23.text())
        if checkBoxStatus_24 == True:
            checkboxState.append(self.checkBox_24.text())
        if checkBoxStatus_25 == True:
            checkboxState.append(self.checkBox_25.text())
        if checkBoxStatus_26 == True:
            checkboxState.append(self.checkBox_26.text())
        if checkBoxStatus_27 == True:
            checkboxState.append(self.checkBox_27.text())

        return checkboxState


    def buttonclick(self):
        checkboxState = self.checkboxState()
        text = professor.reasoning(checkboxState)
        self.textBrowser.setText(text)


    def buttonclick_2(self):
        sys.exit(app.exec_())


    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "动物分类识别系统"))
        self.checkBox_1.setText(_translate("Form", "有奶"))
        self.checkBox_2.setText(_translate("Form", "有毛发"))
        self.checkBox_3.setText(_translate("Form", "有羽毛"))
        self.checkBox_4.setText(_translate("Form", "会飞"))
        self.checkBox_5.setText(_translate("Form", "生蛋"))
        self.checkBox_6.setText(_translate("Form", "有爪"))
        self.checkBox_7.setText(_translate("Form", "有犬齿"))
        self.checkBox_8.setText(_translate("Form", "目盯前方"))
        self.checkBox_9.setText(_translate("Form", "吃肉"))
        self.checkBox_10.setText(_translate("Form", "有蹄"))
        self.checkBox_11.setText(_translate("Form", "反刍食物"))
        self.checkBox_12.setText(_translate("Form", "黄褐色"))
        self.checkBox_13.setText(_translate("Form", "有黑色条纹"))
        self.checkBox_14.setText(_translate("Form", "有黑色斑点"))
        self.checkBox_15.setText(_translate("Form", "长腿"))
        self.checkBox_16.setText(_translate("Form", "长脖子"))
        self.checkBox_17.setText(_translate("Form", "有暗斑点"))
        self.checkBox_18.setText(_translate("Form", "白色"))
        self.checkBox_19.setText(_translate("Form", "不会飞"))
        self.checkBox_20.setText(_translate("Form", "黑白色"))
        self.checkBox_21.setText(_translate("Form", "会游泳"))
        self.checkBox_22.setText(_translate("Form", "善飞"))
        self.checkBox_23.setText(_translate("Form", "不怕风浪"))
        self.checkBox_24.setText(_translate("Form", "哺乳动物"))
        self.checkBox_25.setText(_translate("Form", "鸟"))
        self.checkBox_26.setText(_translate("Form", "食肉动物"))
        self.checkBox_27.setText(_translate("Form", "有蹄动物"))
        self.label.setText(_translate("Form", "选项"))
        self.label_2.setText(_translate("Form", "按“确定开始推理”"))
        self.pushButton.setText(_translate("Form", "确定"))
        self.pushButton_2.setText(_translate("Form", "退出系统"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

四、问题思考

思考:你所实现的基于产生式的专家系统所采用的推理算法是正向推理还是反向推理?你编写专家系统所采用的语言有何优点与不足?
答:
(1)本实验用正向推理策略来完成,实现推理机的程序与知识库的具体内容无关,对知识库的修改不需要改动推理机。
(2)优点:简单易学、面向对象、有丰富的第三方库;
不足:速度慢、对格式要求严格。

五、实验不足

1、无法进行反向推理
2、无法进行三段式推理
3、未封装交互界面

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐