![](https://oss-emcsprod-public.modb.pro/image/auto/modb_20221214_f6a06b42-7b9b-11ed-9194-fa163eb4f6be.png)
基于规则的产生式系统一般由规则库(知识库)、综合数据库和推理引擎三部分组成。知识库由谓词演算事实和有关讨论主题的规则构成,综合数据库又称为上下文,用来暂时存储推理过程中的结论和数据。推理机是用规则进行推理的过程和行为。知识采集系统是领域专家把相关领域的知识表示成一定的形式,并输入到知识库中。解释系统通过用户输入的条件来分析被系统执行的推理结构,并将专家知识以易理解的方式解释给用户,如图4.20所示。
■ 图4.20推理机结构图
建立推理规则库
首先,建立规则库(知识库),本实验系统部分规则如下:
① 哺乳动物食肉动物黄褐色黑色条纹虎
② 鸟长脖子长腿黑白二色不飞鸵鸟
输入事实进行推理
输入事实后开始推理:
推理结果
输入规则①推理事实,显示推理结果如图4.21所示。
■ 图4.21规则①推理结果
输入规则②推理事实,显示推理结果如图4.22所示。
■ 图4.22规则②推理结果
实践对应示例程序参见附录C。
附录C 基于规则产生式的推理
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QLabel, QApplication)
from PyQt5.QtGui import QPixmap
import sys
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.setGeometry(100, 200, 623, 300)
self.groupBox = QtWidgets.QGroupBox(Form)
self.groupBox.setGeometry(QtCore.QRect(10, -20, 700, 311))
self.groupBox.setTitle("")
self.groupBox.setObjectName("groupBox")
self.label = QtWidgets.QLabel(self.groupBox)
self.label.setGeometry(QtCore.QRect(30, 40, 61, 18))
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.groupBox)
self.label_2.setGeometry(QtCore.QRect(470, 40, 101, 18))
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.pushButton = QtWidgets.QPushButton(self.groupBox)
self.pushButton.setGeometry(QtCore.QRect(230, 35, 88, 27))
self.pushButton.setObjectName("pushButton")
self.pushButton_3 = QtWidgets.QPushButton(self.groupBox)
self.pushButton_3.setGeometry(QtCore.QRect(475, 265, 88, 27))
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_3.clicked.connect(QtCore.QCoreApplication.instance().quit)
self.textEdit = QtWidgets.QTextEdit(self.groupBox)
self.textEdit.setGeometry(QtCore.QRect(20, 80, 80, 211))
self.textEdit.setObjectName("textEdit")
self.textEdit_2 = QtWidgets.QTextEdit(self.groupBox)
self.textEdit_2.setGeometry(QtCore.QRect(110, 80, 331, 211))
self.textEdit_2.setObjectName("textEdit_2")
self.textEdit_2.setReadOnly(True)
self.lineEdit = QtWidgets.QLineEdit(self.groupBox)
self.lineEdit.move(450, 80)
self.lineEdit.setGeometry(QtCore.QRect(450, 80, 140, 40))
self.lineEdit.setReadOnly(True)
self.pushButton.clicked.connect(self.go)
self.label_3 = QtWidgets.QLabel(self.groupBox)
self.label_3.setGeometry(QtCore.QRect(450, 125, 140,140))
self.label_3.setAlignment(QtCore.Qt.AlignCenter)
self.label_3.setObjectName("label_3")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "正向推理-动物识别系统"))
self.label.setText(_translate("Form", "输入事实"))
self.label_2.setText(_translate("Form", "显示推理结果"))
self.label_3.setText(_translate("Form", ""))
self.pushButton.setText(_translate("Form", "进行推理"))
self.pushButton_3.setText(_translate("Form", "退出程序"))
# 将知识库做拓扑排序
def topological(self):
Q = []
P = []
ans = "" # 排序后的结果
for line in open('RD.txt'):
line = line.strip('\n')
if line == '':
continue
line = line.split(' ')
Q.append(line[line.__len__() - 1])
del (line[line.__len__() - 1])
P.append(line)
# 计算入度
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
print(ans)
# 将结果写入文件
fw = open('RD.txt', 'w', buffering=1)
fw.write(ans)
fw.flush()
fw.close()
# 进行推理
def go(self, flag=True):
# 将产生式规则放入规则库中
# if P then Q
# 读取产生式文件
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()
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 # 至少能推出一个结论
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(self.str)
if flag:
btn = s.alert("没有推出任何结论")
else:
self.lineEdit.setText(temp)
self.label_3.setPixmap(QPixmap(temp+'.jpg'))
self.label_3.setScaledContents(True)
# 判断list中至少有一个在集合set中
def ListOneInSet(li, se):
for i in li:
if i in se:
return True
return False
# 判断list中所有元素是否都在集合set中
def ListInSet(li, se):
for i in li:
if i not in se:
return False
return True
class SecondWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super(SecondWindow, self).__init__(parent)
self.setGeometry(725, 200, 300, 300)
self.textEdit = QtWidgets.QTextEdit(self)
self.textEdit.setGeometry(8, 2, 284, 286)
# 警告没有推导结果
def alert(self, info):
QtWidgets.QMessageBox.move(self, 200, 200)
QtWidgets.QMessageBox.information(self, "Information", self.tr(info))
# 询问补充事实
def quest(self, info):
# 如果推理为空,需要询问用户是否要添加已知条件
QtWidgets.QMessageBox.move(self, 200, 200)
button = QtWidgets.QMessageBox.question(self, "提示",
self.tr(info),
QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel,
QtWidgets.QMessageBox.Cancel)
return button
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
widget = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(widget)
widget.show()
s = SecondWindow()
sys.exit(app.exec_())
实例讲解
人工智能
![](https://oss-emcsprod-public.modb.pro/image/auto/modb_20221214_f7318168-7b9b-11ed-9194-fa163eb4f6be.png)
精彩回顾
下期预告
VGG16迁移模型
参考书籍
![](https://oss-emcsprod-public.modb.pro/image/auto/modb_20221214_f735e500-7b9b-11ed-9194-fa163eb4f6be.png)
《人工智能》
ISBN:9787302572541
尚文倩 编著
定价:59.8元
扫码微店优惠购书
内容简介
本书系统介绍了人工智能的基本原理、基本技术、基本方法和应用领域等内容,比较全面地反映了60多年来人工智能领域的进展,并根据人工智能的发展动向对一些传统内容做了取舍。全书共9章。第1章介绍人工智能的基本概念、发展历史、应用领域等。其后8章的内容分为两大部分:第一部分(第2~5章)主要讲述传统人工智能的基本概念、原理、方法和技术,涵盖知识表示、搜索策略、确定性推理和不确定推理的相关技术与方法;第二部分(第6~9章)主要讲述现代人工智能的新技术和方法,涵盖机器学习、数据挖掘、大数据、深度学习的**技术与方法。本书提供了8个实践项目案例,并且每章后面附有习题,以供读者练习。本书主要作为计算机专业和其他相关学科相关课程教材,也可供有关科技人员参考。
精彩推荐
微信小程序游戏开发│猜数字小游戏(附源码+视频) Flink编程基础│Scala编程初级实践 Flink编程基础│FlinkCEP编程实践 Flink编程基础│DataStream API编程实践 Flink编程基础│DataSet API编程实践 数据分析实战│客户价值分析 数据分析实战│价格预测挑战 数据分析实战│时间序列预测 数据分析实战│KaggleTitanic生存预测