动物识别系统 python实现+UI

完整代码在最下方

实验目的

利用动物识别系统来验证基于符号的推理,通过实验理解简单的专家系统所包含的模块:人机结构,知识获取机构,知识库及管理系系统,推理机,解释机构,数据库及管理系统”。

实验步骤/过程

(1)、逻辑实现

1、规则库建立:

对于每条产生式规则,都具有以下格式:

前提1 前提2 前提… 前提n

结论

每一条前提由空格分隔,规则保存到txt文件中,已经预置了部分初始规则。

2、推理机推理过程:

推理流程如下:

                   图2、推理流程

对于每条规则,建立Rules字典,key值为前提的所有集合,value值为前提可以推理出的结论。

推理过程如下:

每次对给定前提进行合法性检查,然后再进行推理。若存在非法条件(给定前提格式非法,给定前提不存在于前提库中),则提示非法条件并要求重新输入。

①推理成功:对于给定的前提,遍历Rules字典,如果存在一条规则所需要的前提是给定前提的子集且该结论未被推出,则将该条规则的结论放入前提中,重新开始遍历;若该结论已经被推出过,则跳过该条规则并继续遍历,直至遍历完字典。

②推理失败:若给定的前提无法推理出任何一条结论,则输出空值。

3、对规则进行增/删/改/查:

①增加规则:对增加的规则进行合法性检查(规则格式是否非法,前提和结论是否为空)并通过后,进行判断:若给定的规则的前提对应已有规则库中的前提,则提示添加失败,否则即添加成功。添加后的规则以相同格式保存在txt文件中。

②删除规则:对删除的规则进行合法性检查(规则格式是否非法,前提和结论是否为空)并通过后,进行判断:若给定的规则的前提对应已有规则库中的前提,则删除成功,否则提示删除失败。删除后的规则从txt文件中删除。

③修改规则:目前只实现修改规则的结论,对修改的规则进行合法性检查(规则格式是否非法,前提和结论是否为空)并通过后,进行判断:若给定的规则的前提对应已有规则库中的前提,则修改规则的结论为给定的结论,否则提示修改失败。修改后的规则在txt文件中修改。

④查询规则:遍历生成的字典并输出规则,格式同规则格式。

4、UI界面设计

    (1)通过QT Designer完成UI界面的布局设计

(2)利用PyUIC将该可视化的UI界面转为python代码 

 (3)设值各接口的功能

    【1】运行UI时,首先在规则库文本框中显示所有前提

代码:

.

 【2】输入规则接口

    读取文本框中的内容,设立输入规则,第一行为前提,第二行为结论,以回车为分隔符。点击添加规则后,调用添加规则函数

    添加规则函数中,完善了健壮性,判断输入的内容,如果输入为空,或者为空格、回车,则弹窗报错。如果输入多行,默认认为第一行为前提,第二行为规则。

【3】进行推理

 在输入事实 输入框中输入前提对应的数字。

点击进行推理调用推理机的函数

 健壮性为:如果输入的不是数字,则报错。

实验结果

界面如下:

 

其他不在一一展示了。

推理规则:

该动物有毛发
该动物是哺乳动物
该动物有奶
该动物是哺乳动物
该动物有羽毛
该动物是鸟
该动物吃肉
该动物是食肉动物
该动物有犬齿 该动物有爪 该动物眼盯前方
该动物是食肉动物
该动物是哺乳动物 该动物有蹄
该动物是有蹄类动物
该动物是哺乳动物 该动物是反刍动物
该动物是有蹄类动物
该动物是哺乳动物 该动物是食肉动物 该动物是黄褐色 该动物有暗斑点
该动物是金钱豹
该动物是哺乳动物 该动物是食肉动物 该动物是黄褐色 该动物有黑色条纹
该动物是虎
该动物是有蹄类动物 该动物有长脖子 该动物有长腿 该动物有暗斑点
该动物是长颈鹿
该动物是有蹄类动物 该动物有黑色条纹
该动物是斑马
该动物是鸟 该动物不会飞 该动物有长脖子 该动物有长腿 该动物有黑白二色
该动物是鸵鸟
该动物是鸟 该动物不会飞 该动物会游泳 该动物有黑白二色
该动物是企鹅
该动物是鸟 该动物善飞
该动物是信天翁
该动物有羽毛
该动物是鸟

上代码:

这里只展示主要推理过程了。UI部分其余代码不再放了,比较杂。如果需要可以联系我。

import sys
from PyQt5 import QtWidgets
import UI.MainDis, UI.False_Lable, UI.EmptyUI
import Animal.RuleBase as RB
import Animal.Inference_Engine as IE
import Animal.Inference_Engine as Inference

Save_rules_after = set()
Save_concludes = set()
def ListInSet(li, se):
    for i in li:
        if i not in se:
            return False
    return True

def judge_rule_in(lst):
    for rule_pre in lst:
        if rule_pre in Save_rules_after:
            continue
        else:
            return False
    return True

class Lable_ui(QtWidgets.QMainWindow,UI.False_Lable.Ui_Dialog):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)  # 创建主界面对象
        UI.False_Lable.Ui_Dialog.__init__(self)  # 主界面对象初始化
        self.setupUi(self)  # 配置主界面对象

class Empty_ui(QtWidgets.QMainWindow,UI.EmptyUI.Ui_Dialog):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)  # 创建主界面对象
        UI.False_Lable.Ui_Dialog.__init__(self)  # 主界面对象初始化
        self.setupUi(self)  # 配置主界面对象


class MAIN_ui(QtWidgets.QMainWindow,UI.MainDis.Ui_dialog,UI.False_Lable.Ui_Dialog):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)  # 创建主界面对象
        UI.MainDis.Ui_dialog.__init__(self)  # 主界面对象初始化
        self.setupUi(self)  # 配置主界面对象
        self.rulePushButton.clicked.connect(self.add_rule)#添加规则
        self.inferencePushButton.clicked.connect(self.inference)
        self.Lable = Lable_ui()
        self.Empty = Empty_ui()
        self.display_pre()

    def display_pre(self):
        RB.ini_rules()
        self.ruleTextBrowser.clear()
        i = 0
        RB.rules_pre = list(RB.Rules_pre).sort()
        for line in RB.Rules_pre:#将规则库放入显示框
            if i < 10 :
                str_temp = str(i) + '. '+ line
            else:
                str_temp = str(i) + '.'+ line
            self.ruleTextBrowser.append(str_temp)
            i += 1

    def add_rule(self):
        #添加新规则
        new_rule = self.inputLineEdit.toPlainText()
        self.inputLineEdit.clear()

        if new_rule == '' or new_rule == '\n':
            self.Empty.show()
            self.Empty.pushButton.clicked.connect(self.Empty.close)
            return
        new_rule = new_rule.split('\n')
        if new_rule[0] == '' or new_rule[1] == '' or new_rule[0].isspace()  or new_rule[1].isspace() :
            self.Empty.show()
            self.Empty.pushButton.clicked.connect(self.Empty.close)
            return

        new_pre = new_rule[0]
        new_pre = new_pre.split(' ')
        new_conclusion = new_rule[1]
        new_pre = [i for i in new_pre if (len(str(i)) != 0)]
        new_pre = ' '.join(new_pre)
        print(type(new_pre))
        print(new_pre)
        print(new_conclusion)
        judge_bool = False
        for i in RB.Rules.keys():
            if judge_is(i, new_pre):
                judge_bool = True
                break
        # print(judge_bool)
        if judge_bool:
            self.Lable.show()
            self.Lable.pushButton.clicked.connect(self.Lable.close)
        else:
            file = open('../UI/Rules.txt', 'a', encoding='UTF-8')
            RB.Rules[new_pre] = new_conclusion
            file.write('\n')
            file.write(new_pre)
            file.write('\n')
            file.write(new_conclusion)
            file.close()
            self.display_pre()



    def inference(self):
        #推理
        # self.outputTextBrowser.append("1")
        ini()
        self.outputTextBrowser.clear()
        self.answerTextBrowser.clear()
        rule_pre_num = self.inputFactTextEdit.toPlainText() #获取输入的事实
        rule_pre_num = rule_pre_num.split('\n')

        #删除空格元素
        rule_pre_num = list(set(rule_pre_num))
        for space in rule_pre_num:
            if space == '':
                rule_pre_num.remove('')

        rules = list(RB.Rules_pre)
        for i in rule_pre_num:
            if i.isdigit():
                if 0 <= int(i) < len(rules):
                    Save_rules_after.add(rules[int(i)])
                    # self.outputTextBrowser.append(rules[int(i)])
                else:
                    self.outputTextBrowser.clear()
                    self.outputTextBrowser.append('该前提不存在,请重新输入')
                    return
            else:
                self.outputTextBrowser.clear()
                self.outputTextBrowser.append('输入中存在非法字符,请重新输入')
                return
        i = 1
        for rule in RB.Rules:
            rule_list = rule.split(' ')
            if i == 1:
                rule_ini = rule
            if judge_rule_in(rule_list):
                Save_rules_after.add(RB.Rules[rule])
                temp = rule + '->'  +RB.Rules[rule]
                self.outputTextBrowser.append(temp)
                Save_concludes.add(RB.Rules[rule])
                rule = rule_ini

            i = i + 1
        if Save_concludes:
            for conclude in Save_concludes:
                self.answerTextBrowser.append(conclude)
        else:
            self.answerTextBrowser.append('根据已知事实无法得出结论')


def ini():
    Save_rules_after.clear()
    Save_concludes.clear()

def judge_is(rule1, rule2):
    rule1 = rule1.split(' ')
    rule2 = rule2.split(' ')
    rule1.sort()
    rule2.sort()
    if rule2 == rule1:
        return True
    else:
        return False

app = QtWidgets.QApplication(sys.argv)  # 新建窗体
MAIN_window = MAIN_ui()  # 创建主菜单的窗口对象
MAIN_window.show()  # 显示主菜单
sys.exit(app.exec_())  # 保持显示

代码链接过期了,2024.6.13 代码分享

链接:https://pan.baidu.com/s/1gwUHh0HxDNYP2SqJh3YjuA?pwd=pc4b 
提取码:pc4b 
 

  • 4
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值