写点什么

AIGC 背后的技术分析 | 基于规则产生式的推理

作者:TiAmo
  • 2023-05-17
    江苏
  • 本文字数:4292 字

    阅读完需:约 14 分钟

AIGC背后的技术分析 | 基于规则产生式的推理

简介: 基于规则的产生式系统一般由规则库(知识库)、综合数据库和推理引擎三部分组成。知识库由谓词演算事实和有关讨论主题的规则构成,综合数据库又称为上下文,用来暂时存储推理过程中的结论和数据。推理机是用规则进行推理的过程和行为。知识采集系统是领域专家把相关领域的知识表示成一定的形式,并输入到知识库中。解释系统通过用户输入的条件来分析被系统执行的推理结构,并将专家知识以易理解的方式解释给用



1、建立推理规则库首先

建立规则库(知识库),本实验系统部分规则如下:


① 哺乳动物食肉动物黄褐色黑色条纹虎


② 鸟长脖子长腿黑白二色不飞鸵鸟


2、输入事实进行推理输入事实后开始推理:




3、推理结果

输入规则①推理事实,显示推理结果如图 2 所示。



■ 图 2 规则①推理结果


输入规则②推理事实,显示推理结果如图 3 所示。



■ 图 3 规则②推理结果


实践对应示例程序参见附录 C。


附录 C 基于规则产生式的推理


from PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtWidgets import (QWidget, QHBoxLayout, QLabel, QApplication)from PyQt5.QtGui import QPixmapimport sysclass 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_())
复制代码


发布于: 刚刚阅读数: 2
用户头像

TiAmo

关注

有能力爱自己,有余力爱别人! 2022-06-16 加入

CSDN全栈领域优质创作者,万粉博主;阿里云专家博主、星级博主、技术博主、阿里云问答官,阿里云MVP;华为云享专家;华为Iot专家;亚马逊人工智能自动驾驶(大众组)吉尼斯世界纪录获得者

评论

发布
暂无评论
AIGC背后的技术分析 | 基于规则产生式的推理_推理_TiAmo_InfoQ写作社区