一、实验目的:

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

二、实验内容:

运用所学知识,设计并编程实现一个小型人工智能系统(如分类、诊断、预测等类型)。

三、实验步骤:

1)系统设置,包括设置系统名称和系统谓词,给出谓词名及其含义。

2)编辑知识库,通过输入规则或修改规则等,完成整个规则库的建立。

3)建立事实库(综合数据库),输入多条事实或结论。

4)运行推理,包括正向推理和反向推理,给出相应的推理过程、事实区和规则区。

如果在macOS下Pyside2运行有问题去看我另一篇文章

一共有需要三个文件,分别是Plants,Feature和Rule。具体文件路径需要在py文件里自行更改。

文件内容为:

Plants:

玫瑰
荷花
仙人球
水棉
苹果树
油菜
海带
松树

Feature:

种子有果皮
被子植物
种子无果皮
裸子植物
无茎叶
无根
藻类植物
有托叶
蔷薇科
吸引菜粉蝶
十字花科
十字形花冠
缺水环境
仙人掌科
有刺
玫瑰
水生
可食用
结果实
荷花
喜阳
仙人球
药用
水棉
木本
苹果树
黄色花
油菜
有白色粉末
海带
叶片针状
松树

Rule:

种子有果皮 被子植物
种子无果皮 裸子植物
无茎叶 无根 藻类植物
被子植物 有托叶 蔷薇科
被子植物 吸引菜粉蝶 十字花科
被子植物 十字形花冠 十字花科
被子植物 缺水环境 仙人掌科
被子植物 蔷薇科 有刺 玫瑰
被子植物 水生 可食用 结果实 荷花
被子植物 仙人掌科 喜阳 有刺 仙人球
藻类植物 水生 药用 水棉
被子植物 蔷薇科 木本 可食用 结果实 苹果树
被子植物 十字花科 黄色花 可食用 结果实 油菜
藻类植物 水生 可食用 有白色粉末 海带
裸子植物 木本 叶片针状 结果实 松树

(数据和代码框架借鉴https://blog.csdn.net/weixin_53056212/article/details/124394320)在它的框架下添加了功能并优化了GUI界面。

from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton
from PySide2.QtWidgets import QPlainTextEdit
from PySide2.QtWidgets import QMessageBoxPlants = []
Feature = []
Rules = []
dy_data = []
tested_1 = []
tested_2 = []
num = []
mid_result = []
weici1 = '1'
weici2 = '2'class GUI():def __init__(self):self.window = QMainWindow()self.window.resize(600, 500)self.window.move(300, 310)self.textEdit6 = QPlainTextEdit(self.window)self.textEdit6.setPlaceholderText("请输入系统名称)")self.textEdit6.move(180, 420)self.textEdit6.resize(120, 30)self.textEdit7 = QPlainTextEdit(self.window)self.textEdit7.setPlaceholderText("请输入系统谓词1)")self.textEdit7.move(330, 420)self.textEdit7.resize(120, 30)self.textEdit8 = QPlainTextEdit(self.window)self.textEdit8.setPlaceholderText("请输入系统谓词2)")self.textEdit8.move(460, 420)self.textEdit8.resize(120, 30)self.textEdit = QPlainTextEdit(self.window)self.textEdit.setPlaceholderText("请输入已有特征信息的序号(以空格分隔)")self.textEdit.move(220, 50)self.textEdit.resize(100, 300)info = []for i in range(len(Feature)):s = "%d: %s " % (i + 1, Feature[i])info.append(s)self.textEdit2 = QPlainTextEdit(self.window)self.textEdit2.setPlainText(str(info))self.textEdit2.move(10, 50)self.textEdit2.resize(200, 300)self.textEdit3 = QPlainTextEdit(self.window)self.textEdit3.setPlainText('所有特征')self.textEdit3.move(10, 15)self.textEdit3.resize(120, 30)self.textEdit4 = QPlainTextEdit(self.window)self.textEdit4.move(430, 50)self.textEdit4.resize(150, 300)self.button1 = QPushButton('正向推理', self.window)self.button1.move(330, 130)self.button1.clicked.connect(self.handle)self.button2 = QPushButton('反向推理', self.window)self.button2.move(330, 190)self.button2.clicked.connect(self.handle2)self.button3 = QPushButton('展示所有规则', self.window)self.button3.resize(150, 100)self.button3.move(10, 380)self.button3.clicked.connect(self.display_rules)self.textEdit5 = QPlainTextEdit(self.window)self.textEdit5.setPlaceholderText("请输入要添加的规则")self.textEdit5.move(180, 360)self.textEdit5.resize(250, 50)self.button4 = QPushButton('添加规则', self.window)self.button4.resize(100, 50)self.button4.move(460, 360)self.button4.clicked.connect(self.add_rules)self.button5 = QPushButton('设置系统标题', self.window)self.button5.move(180, 455)self.button5.clicked.connect(self.set_titile)self.button6 = QPushButton('设置系统谓词', self.window)self.button6.move(380, 455)self.button6.clicked.connect(self.set_weici)def set_titile(self):self.window.setWindowTitle(self.textEdit6.toPlainText())def set_weici(self):global weici1global weici2weici1 = self.textEdit7.toPlainText()weici2 = self.textEdit8.toPlainText()def display_rules(self):Rules=[]with open("/Users/baorunfeng/Downloads/AiGUI/Rule.txt", 'r', encoding='utf8') as f3:for line in f3:line = line.split()Rules.append(line)f3.close()info = []for i in range(len(Rules)):  # 使输出有序s = "%d: %s " % (i + 1, Rules[i])info.append(s)QMessageBox.about(self.window, '所有规则',f'''如下:\n\n{'       '.join(info)}''')def add_rules(self):info = self.textEdit5.toPlainText()file = open('/Users/baorunfeng/Downloads/AiGUI/Rule.txt', 'a')file.write('\n'+info)file.close()def handle2(self):global numinit_info = []info = self.textEdit.toPlainText()num = list(map(int, info.split()))for i in num:dy_data.append(Feature[i - 1])init_info.append(Feature[i - 1])infer = inference2()self.textEdit4.setPlainText(f'''您初始输入的特征信息有:\n{' '.join(init_info)}{'            '.join(mid_result)}\n\n您得到的答案是:\n{infer}''')def handle(self):global numinit_info = []info = self.textEdit.toPlainText()num = list(map(int, info.split()))for i in num:dy_data.append(Feature[i - 1])init_info.append(Feature[i - 1])infer = inference()self.textEdit4.setPlainText(f'''您初始输入的特征信息有:\n{' '.join(init_info)}{'            '.join(mid_result)}\n\n您得到的答案是:\n{infer}''')def Database(file1, file2, file3):with open(file1, 'r', encoding='utf8') as f1:for line in f1.readlines():line = str(line).split()Plants.extend(line)f1.close()with open(file2, 'r', encoding='utf8') as f2:for line in f2.readlines():line = str(line).split()Feature.extend(line)f2.close()with open(file3, 'r', encoding='utf8') as f3:for line in f3:line = line.split()Rules.append(line)f3.close()def inference():flag = 1while (flag):for i in range(len(dy_data)):if(dy_data[i] in Plants):return dy_data[i]tested_1 = []for i in range(len(Rules)):if (Rules[i] in tested_2):  # 防止规则重复匹配passelse:sub = Rules[i][:-1]for j in sub:if (j not in dy_data):breakif (j == sub[-1]):if (Rules[i][-1] not in dy_data):  # 避免匹配到的规则后件重复加入dy_data.append(Rules[i][-1])s = "\n匹配的规则:"s += weici1for g in Rules[i]:if (g == Rules[i][-2]):s += gs += '--->'s += weici2else:s += gs += '、'mid_result.append(s)ss = "\n目前综合数据库信息:"for g in dy_data:ss += gss += '、'mid_result.append(ss)tested_1.append(Rules[i])tested_2.append(Rules[i])if (tested_1 == []):flag = 0  # 匹配失败,查找不到return Falsedef inference2(): for i in range(len(Rules)):if (Rules[i][0] in dy_data):s = "\n匹配的规则:"for g in Rules[i]:if(g == Rules[i][0]):s += weici2s += gs += '--->'s += weici1else:s += gs += '、'mid_result.append(s)for j in range(len(Rules[i])):if(j!=0):dy_data.append(Rules[i][j])ss = "\n目前综合数据库信息:"for g in dy_data:ss += str(g)ss += '、'mid_result.append(ss)return dy_datafile1_path = "/Users/baorunfeng/Downloads/AiGUI/Plants.txt"
file2_path = "/Users/baorunfeng/Downloads/AiGUI/Feature.txt"
file3_path = "/Users/baorunfeng/Downloads/AiGUI/Rule.txt"
Database(file1_path, file2_path, file3_path)
app = QApplication([])
gg = GUI()
gg.window.show()
app.exec_()

实验结果:

(实验数据我已经改成这个球员判别系统了)

记得要先输入两个谓词后点击设置,才能正常使用,谓词可以是Postive和Player_is.

产生式系统Python PySide2的GUI界面相关推荐

  1. 用Python制作可视化GUI界面,一键实现证件照背景颜色的替换

    今天,我们来分享一下如何通过Python的十来行代码来替换证件照的背景颜色,那么在最后,小编也会将上述的流程制作成一个GUI界面来方便大家使用.关于界面的大致模样其实和先前的相差不大,大家应该都看过上 ...

  2. python开发的gui界面,python写gui应用程序

    python 编写gui界面有哪些 安装wxPython下面是wxPython特别基础的使用方法,将以一个小程序为例来说明,它的功能是在一个文本框中输入文件名,点击open按钮,会在另一个文本框中显示 ...

  3. 用 Python 制作可视化 GUI 界面,一键实现自动分类管理文件!

    作者 | 欣一 来源 | Python爱好者集中营 经常杂乱无章的文件夹会让我们找不到所想要的文件,因此小编特意制作了一个可视化GUI界面,通过输入路径一键点击实现文件分门别类的归档. 不同的文件后缀 ...

  4. python中的gui界面编程_python应用系列教程——python的GUI界面编程Tkinter全解

    全栈工程师开发手册 (作者:栾鹏) python的GUI界面编程,常用的几个python库包含如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包 ...

  5. python数据写入表格生成图片_使用Python制作一个GUI界面,将随机生成的姓名存入到Excel文件中...

    前面内容,我们详细介绍了如何使用Python生成一定数量的随机姓名. 生成一些随机姓名 如何用Python生成若干个随机姓名?男女取名有方法,不能千篇一律 之前,也提到过,我们在一些项目中,需要若干个 ...

  6. python应用: GUI界面设计之JPG转ico工具编辑(PythonMagic)

    1.环境: windows7 python3.7 该实例设计到的库有: PythonMagick,win32api,win32con,wx,os 等模块 该实例运用到:提示消息框,GUI界面,打开当前 ...

  7. python高手养成百家号_使用Python制作一个GUI界面,将随机生成的姓名存入到Excel文件中...

    前面内容,我们详细介绍了如何使用Python生成一定数量的随机姓名. 如何用Python生成若干个随机姓名?男女取名有方法,不能千篇一律 之前,也提到过,我们在一些项目中,需要若干个随机姓名,为了节省 ...

  8. 用Python制作可视化GUI界面,顺便实现自动分类整理文件

    有时候,我们写了一些简单.有用的小代码.此时,如果能够有一个可视化GUI界面,是不是显得很舒服.今天介绍的一个Python库,超级牛逼,几行代码就可以实现一个可视化界面! 应朋友私信要求,开通技术交流 ...

  9. 【Python】用Python制作可视化GUI界面,一键实现证件照背景颜色的替换

    今天,我们来分享一下如何通过Python的十来行代码来替换证件照的背景颜色,那么在最后,小编也会将上述的流程制作成一个GUI界面来方便大家使用.关于界面的大致模样其实和先前的相差不大,大家应该都看过上 ...

  10. 如何在python开发的GUI界面程序中恰当地使用PyExecJS

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 "解决一闪而过的黑框的小技巧." 在使用python开发过程中,不可避免地,会开发带界面的应用,也会经常使用js来完成一些功能,比如, ...

最新文章

  1. 【重磅】吴恩达又一项目Landing.ai曝光,这一次,他是要给传统制造业狠狠开刀!
  2. mybatis plus 导出sql_springBoot+mybatisPlus+hutool 实现输入sql导出 excel表格
  3. 解决linux 升级高版本python3.7后yum不能使用的问题
  4. 告别程序员生涯,一点感慨,与诸君共勉(转)
  5. 利用递归遍历文件夹和文件存入TreeView
  6. Vue指令v-show和v-if的区别
  7. Bash脚本15分钟进阶教程-转
  8. undefined reference to symbol 'dlsym@@GLIBC_2.17' libdl.so: error adding symbols: DSO missing from c
  9. rds基于什么开发_玩物得志: 基于DataWorks+MaxCompute+MC-Hologres 构建大数据平台
  10. 国家标准《文后参考文献著录规则》(GB7714-87)
  11. webqq linux,Ubuntu 11.10安装WebQQ
  12. 计算机网络练习题-1
  13. 卡巴斯基激活码无限量获取
  14. 划分vlan实验心得体会_计算机网络实验心得体会_计算机网络实验工作感想
  15. 【电子电路计算公式】 导线流过电流计算工具,我已经做成一个小工具了(源代码)
  16. MIDI 128种音色码表
  17. Object.assign()方法
  18. [经验分享] 覃超直播课学习笔记
  19. 42个面向前端开发人员的很棒JavaScript 库和框架
  20. xjoi1.4行李托运

热门文章

  1. sqlserver2000数据库迁移到2008R2
  2. 嵌入式Linux驱动笔记(四)------USB键盘驱动程序
  3. 盛会再临,2018 中国大数据技术大会(BDTC)首曝日程及议题
  4. IOI2021集训队作业
  5. 如何用手机访问电脑本地localhost网页, 以调试项目
  6. java中数组倒叙复制输出
  7. 马斯克、李彦宏、姚期智等云端纵论AI,他们都说了什么?
  8. 每日一题系列:考拉有n个字符串,任意两个字符串长度都是不同的。考拉最近学习到两种字符串的排序方法
  9. matlab霍夫曼吗仿真,霍夫曼编译码的Matlab代码实现
  10. Android高德地图marker和InfoWindow的使用