人工智能产生式系统实验—动物识别系统(txt文件导入数据库)python代码实现以及关系图

大家好!第一次写,请大家多批评指正!

动物识别系统要求:

运用所学知识,设计并编程实现一个小型动物识别系统,能识别虎、金钱豹、斑马、长颈鹿、鸵鸟、企鹅、信天翁等七种动物的产生式系统。
规则库:
r1: IF 该动物有毛发 THEN 该动物是哺乳动物
r2: IF 该动物有奶 THEN 该动物是哺乳动物
r3: IF 该动物有羽毛 THEN 该动物是鸟
r4: IF 该动物会飞 AND 会下蛋 THEN 该动物是鸟
r5: IF 该动物吃肉 THEN 该动物是食肉动物
r6: IF 该动物有犬齿 AND 有爪 AND 眼盯前方
THEN 该动物是食肉动物
r7: IF 该动物是哺乳动物 AND 有蹄
THEN 该动物是有蹄类动物
r 8: IF 该动物是哺乳动物 AND 是反刍动物
THEN 该动物是有蹄类动物
r9: IF 该动物是哺乳动物 AND 是食肉动物 AND 是黄褐色
AND 身上有暗斑点 THEN 该动物是金钱豹
r10:IF 该动物是哺乳动物 AND 是食肉动物 AND 是黄褐色
AND 身上有黑色条纹 THEN 该动物是虎
r11: IF 该动物是有蹄类动物 AND 有长脖子 AND 有长腿
AND 身上有暗斑点 THEN 该动物是长颈鹿
r 12:IF 该动物有蹄类动物 AND 身上有黑色条纹
THEN 该动物是斑马
r13:IF 该动物是鸟 AND 有长脖子 AND 有长腿 AND 不会飞
AND 有黑白二色 THEN 该动物是鸵鸟
r14: IF 该动物是鸟 AND 会游泳 AND 不会飞
AND 有黑白二色 THEN 该动物是企鹅
r15: IF 该动物是鸟 AND 善飞 THEN 该动物是信天翁
要求给定初始条件,能识别出是哪种动物。
比如已知初始事实存放在综合数据库中:
暗斑点,长脖子,长腿,奶,蹄
运行后得该动物是:长颈鹿

对问题画出关系图

其中箭头之间的波浪线代表所有条件都满足才可以推出结果
注:其中规则8属于哺乳动物与反刍动物两个规则同时满足才成立
用Visio画的水平有限大家将就看

代码实现思路

把规则按照系统要求写入txt文件,用python直接读入文件,并且可以保留原来的规则,并允许改规则和添加规则的同时对原来的txt规则文件同步修改。从而可以实现人机交互的动物识别系统。话不多说直接上代码。注:代码参考了这位博主写的代码,受用良多。
原文链接:https://blog.csdn.net/Zhangguohao666/article/details/105423594

# !/usr/bin/env python
# @Time:2021/4/2 11:38
# @Author:华阳
# @File:动物识别.py
# @Software:PyCharm
rules = {}  # 以字典形式存储规则
filePath = r'rules.txt'
"""
读取规则库文件中规则,并存放在rules字典中
    - 字典的键:前提
    - 字典的值:结论 
"""

def storeRules(filePath):#储存老文件
    file_data = ""
    with open(filePath, 'r', encoding='utf-8') as f:
        for line in f:  # 将文件按行读取
            file_data += line
    with open(r"old rules.txt", "w", encoding='utf-8') as d:
        d.write(file_data)
    f.close()
    d.close()
def readRules(filePath):
    global rules
    fo = open(filePath, mode='r', encoding='utf-8')
    for line in fo:#将文件按行读取
        line = line.replace('IF', '').strip()#将字符IF替换
        temp = line.split(' THEN ')#按照THEN将字符串切片
        premise = temp[0]#条件
        conclusion = temp[1]#结论
        rules[premise] = conclusion#以字典形式储存在rules中
    fo.close()
def add_txt(filePath,new_premise,new_conclusion):
    file_data = ""
    with open(filePath, 'r', encoding='utf-8') as f:
        for line in f:  # 将文件按行读取
            file_data += line
        file_data += "IF"+" "+new_premise+" "+"THEN"+" "+new_conclusion+"\n"
    with open(filePath, "w", encoding='utf-8') as d:
        d.write(file_data)
    f.close()
    d.close()
def alter_txt(filePath,old_str,new_str):
    file_data = ""
    with open(filePath,'r', encoding='utf-8') as f:
        for line in f:#将文件按行读取
            if old_str in line:
                line = line.replace(old_str,new_str)
            file_data += line
    with open(r'rules.txt',"w",encoding='utf-8') as d:
        d.write(file_data)
    f.close()
    d.close()

"""
2. 推理机用这些事实(即:facts变量),依次与知识库中的规则的前提匹配
    - 注意:匹配成功的规则可能不止一条,进行冲突消解(本代码没有这个功能)
    - 代码很简单,没有对综合数据库进行设置
3. 若某规则的前提全被事实满足,则规则可以得到运用
4. 规则的结论部分作为新的事实存储
5. 用更新过的事实再与其它规则的前提匹配,直到不再有可匹配的规则为止
"""


def matchRules(facts):
    print()
    isEnd = False
    m = True
    # 循环匹配
    def loop():#循环函数

        global rules#定义全局变量rules
        nonlocal facts, isEnd,m
        i = 0
        for premise in rules:#遍历rules的每一个条件
            flag = True
            pre = premise.split(' AND ')#根据AND将条件字符切片
            for p in pre:#遍历条件
                if p in facts:#条件存在facts中(遍历成功一次,就会少一个)
                    m = False
                    pass
                else:
                    flag = False#如果有一个条件遍历失败,则匹配失败。
            if (flag):#该条件完全匹配成功进行输出
                print('该动物:' + premise + ' -> ' + rules[premise])#得到一个小推论/结果
                for p in pre:
                    facts = facts.replace(p, ' ')#去掉得出小结论的小条件
                facts = facts + rules[premise]#加上需要的小结论作为下次遍历的条件
            else:
                i += 1
        if i == len(rules):#条件全部不一致,遍历结束
            isEnd = True
            if(m):
                print("十分抱歉!没有找到您所给条件对应的动物,请尝试输入信息与数据库对应")
                a = eval(input("0. 继续程序 1. 查看数据库内容") )
                if(a==1):
                    print(rules)
    # 是否推导出最终结论
    while (not isEnd):#循环遍历,解决条件顺序问题
        loop()


"""
1. 用户通过人机界面输入一批事实
"""


def ui():
    print('----')
    print('--------动物识别系统--------')
    print('----')
    print('注意!请按照规则库中的前提来阐述事实(实例:鸟 善飞)', end='\n\n')
    facts = input('请输入事实:')#输入动物特征
    matchRules(facts)#根据特征匹配
def add():
    a = input("请输入判断条件:")
    b = input("请输入可以判断的结果:")
    rules[a] = b
    print(rules)
    add_txt(filePath,a,b)
def alter():
    x = True
    a = input("请输入判断条件:")
    b = input("请输入可以判断的结果:")
    for item in rules:
        if(a==item and b==rules[item]):
            print("该条件已存在,添加条件失败")
            x = False
        elif(a==item and b!=rules[item]):
            alter_txt(filePath,rules[item],b)
        elif(a!=item and b==rules[item]):
            alter_txt(filePath,item,a)
    if(x):
        rules[a] = b
        print(rules)
def main():
    global filePath#信息库文件路径
    storeRules(filePath)#储存文件
    readRules(filePath)#读取文件
    print(rules)#打印字典

    while(1):
        print("\n1. 更改数据库信息"
              "2. 添加数据库信息"
              "3. 动物识别"
              "4. 退出系统\n")#打印目录
        n = int(input("Please select :"))#选择功能
        if(n==1):#未完善
            alter()
            continue
        elif(n==2):
            add()
            continue
        elif(n==3):#匹配
            ui()
        elif(n==4):#退出
            print("\n成功推出程序!欢迎您下次光临\n")
            break
        else:#输入错误
            print("\n输出有误,请重新输入!\n")
    return 1
if __name__ == '__main__':#主函数
    main()

txt文件

如下所示,大家可以自己新建一个txt,文件名改为rules.txt和代码放在同一个路径就可以正常运行了,不必担心该规则后txt会改动,找不到最早的规则。代码编译运行后会自动保存原来的规则并存在程序相同路径下名字是
old rules.txt.

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

至大家

第一次写,有不足之处还请谅解指正,欢迎各位小伙伴和我一起交流讨论。在这里谢谢大家的观看与转载点赞哈哈!

代码文件

小程序员将代码文件和相关素材整理到了百度网盘里,因为文件大小基本不大,大家也不用担心限速问题。后期小程序员有能力的话,将在gitee或者github上上传相关素材。
链接:https://pan.baidu.com/s/1Ce14ZQYEYWJxhpNEP1ERhg?pwd=7mvf
提取码:7mvf

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐