草庐IT

实验二、人工智能:产生式系统(动物识别系统)

wllll1434 2023-08-25 原文

产生式系统(动物识别系统)

一、相关知识

  • 把一组产生式放在一起,让它们互相配合、协同作用,一个产生式生成的结果可以供另一个产生式作为已知事实使用,以求得问题的解,这样的系统成为产生是系统。

产生式系统的例子:动物识别系统

  • 本系统为识别虎、金钱豹、斑马、长颈鹿、企鹅、鸵鸟、信天翁等七种动物的产生式系统。
  • 根据这些动物识别的专家知识,建立如下规则库:
    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 该动物是有蹄类动物
    r8:IF 该动物是哺乳动物 AND 是咀嚼反刍动物 THEN 该动物是有蹄类动物
    r9:IF 该动物是哺乳动物 AND 是食肉动物 AND 是黄褐色 AND 身上有暗斑点 THEN 该动物是金钱豹
    r10:IF 该动物是哺乳动物 AND 是肉食动物 AND 是黄褐色 AND 身上有黑色条纹 THEN 该动物是虎
    r11:IF 该动物是蹄类动物 AND 有长脖子 AND 有长腿 AND 身上有暗斑点 THEN 该动物是长颈鹿
    r12:IF 该动物是蹄类动物 AND 身上有黑色条纹 THEN 该动物是斑马
    r13:IF 该动物是鸟 AND 有长脖子 AND 有长腿 AND 不会飞 AND 有黑白二色 THEN 该动物是鸵鸟
    r14:IF 该动物是鸟 AND 会游泳 AND 不会飞 AND 有黑白二色 THEN 该动物是企鹅
    r15:IF 该动物是鸟 AND 善飞 THEN 该动物是信天翁

二、实验目的

  1. 根据已知规则建立规则库
  2. 根据输入的规则进行推理
  3. 得到最终结果

三、实验要求

  1. 有推理过程

  2. 对结果进行打印

  3. 若得到最终结果,即虎、金钱豹、斑马、长颈鹿、企鹅、鸵鸟、信天翁等输出,需输出此判断结果。

  4. 例如:
    1
    10
    14
    0
    前提条件为:
    有毛发 有蹄 身上有黑色条纹

    推理过程如下:
    有毛发->是哺乳动物
    是哺乳动物,有蹄->是蹄类动物
    是蹄类动物,身上有黑色条纹->斑马
    所识别的动物为斑马

四、源代码

# 通过传入的列表寻找结果
def find_data(process_data_list):
    # 依次进行循环查找并对过程排序
    for epoch, data_process in enumerate(data_process_list):
        # 用于判断此过程是否成立
        num = 0
        for i in process_data_list:
            if i in data_process:
                num += 1
        # 过程成立则数值相同,可以进入下一步
        if num == len(data_process):
            # 此过程中结果是否为最终结果,不是将此过程结果加入到过程中
            if data_result_list[epoch] not in result_list:
                # 弹出过程和此过程结果,因为此过程已经进行过,此结果存入需要查找的过程中
                result = data_result_list.pop(epoch)
                process = data_process_list.pop(epoch)
                # 判断结果是否已经存在过程中,存在则重新寻找,不存在则加入过程,并将其存入最终结果
                if result not in process_data_list:
                    dict_input[','.join(process)] = result
                    end_result = find_data(process_data_list + [result])
                    if end_result == 1:
                        return 1
                    else:
                        return 0
                # 存在则直接寻找
                else:
                    end_result = find_data(process_data_list)
                    if end_result == 1:
                        return 1
                    else:
                        return 0
            # 找到最终结果,取出结果后返回
            else:
                process = data_process_list.pop(epoch)
                dict_input[','.join(process)] = data_result_list[epoch]
                return 1


if __name__ == '__main__':
    # 用于储存中间过程
    data_process_list = []
    # 用于存储过程对应的结果
    data_result_list = []
    # 存储用于查询的数据
    list_data = []
    # 用于存储输出结果
    dict_input = {}

    # 规则库
    txt = '''有毛发,是哺乳动物
有奶,是哺乳动物
有羽毛,是鸟
会飞,会下蛋,是鸟
吃肉,是肉食动物
有犬齿,有爪,眼盯前方,是食肉动物
是哺乳动物,有蹄,是蹄类动物
是哺乳动物,是咀嚼反刍动物,是蹄类动物
是哺乳动物,是食肉动物,是黄褐色,身上有暗斑点,金钱豹
是哺乳动物,是肉食动物,是黄褐色,身上有黑色条纹,虎
是蹄类动物,有长脖子,有长腿,身上有暗斑点,长颈鹿
是蹄类动物,身上有黑色条纹,斑马
是鸟,有长脖子,有长腿,不会飞,有黑白二色,鸵鸟
是鸟,会游泳,不会飞,有黑白二色,企鹅
是鸟,善飞,信天翁'''
    # 将数据预处理
    datas = txt.split('\n')
    for data in datas:
        data = data.split(',')
        data_process_list.append(data[:-1])
        data_result_list.append(data[-1].replace('\n', ''))
    # 最终结果列表
    result_list = ['信天翁', '鸵鸟', '斑马', '长颈鹿', '虎', '金钱豹', '企鹅']
    # 数据库对应的过程
    database = {'1': '有毛发', '2': '有奶', '3': '有羽毛', '4': '会飞', '5': '会下蛋', '6': '吃肉', '7': '有犬齿',
                '8': '有爪', '9': '眼盯前方', '10': '有蹄', '11': '是咀嚼反刍动物', '12': '是黄褐色', '13': '身上有暗斑点', '14': '身上有黑色条纹',
                '15': '有长脖子', '16': '有长腿', '17': '不会飞', '18': '会游泳', '19': '有黑白二色', '20': '善飞', '21': '是哺乳动物',
                '22': '是鸟', '23': '是食肉动物', '24': '是蹄类动物', '25': '金钱豹', '26': '虎', '27': '长颈鹿', '28': '斑马',
                '29': '鸵鸟', '30': '企鹅', '31': '信天翁'}
    # 循环进行输入,直到碰见0后退出
    while 1:
        term = input("")
        if term == '0':
            break
        if database[term] not in list_data:
            list_data.append(database[term])
    # 打印前提条件
    print('前提条件为:')
    print(' '.join(list_data) + '\n')
    # 进行递归查找,直到找到最终结果,返回1则找到最终结果
    end_result=find_data(list_data)
    if end_result == 1:
        print('推理过程如下:')
        # 将结果进行打印
        for i in dict_input.keys():
            print(f"{i}->{dict_input[i]}")
            # 得到最终结果即输出所识别动物
            if dict_input[i] in result_list:
                print(f'所识别的动物为{dict_input[i]}')
    else:
        # 将结果进行打印
        for i in dict_input.keys():
            print(f"{i}->{dict_input[i]}")

五、实验结果

有关实验二、人工智能:产生式系统(动物识别系统)的更多相关文章

  1. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  2. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  3. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  4. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

  5. ruby-on-rails - 在 heroku 的 .fonts 文件夹中包含自定义字体,似乎无法识别它们 - 2

    Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在

  6. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  7. ruby-on-rails - 没有这样的文件或目录 - 用 Mini Magick 识别 - 2

    在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc

  8. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

  9. ruby - 以毫秒为单位获取当前系统时间 - 2

    在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:

  10. ruby-on-rails - 如何构建复杂的 Rails 系统 - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和

随机推荐