【人工智能Ⅰ】实验1:谓词表示法与产生式知识表示

news2024/9/28 3:22:09

实验1  谓词表示法与产生式知识表示

一、实验目的

1、熟悉谓词逻辑表示法;

2、理解和掌握产生式知识表示方法,实现产生式系统的规则库。

二、实验内容

要求通过C/C++/python语言编程实现:

1、猴子摘香蕉问题

2、动物识别系统

(1)建立识别七种动物识别系统的规则;

(2)确定需要识别的动物及其属性(7种动物,即:老虎、金钱豹、斑马、长颈鹿、企鹅、鸵鸟和信天翁)。

三、问题描述

1、房子里有一只猴子(即机器人),位于a处。在c处上方的天花板上有一串香蕉,猴子想吃,但摘不到。房间的b处还有一个箱子,如果猴子站到箱子上,就可以摸着天花板。如图1所示,对于上述问题,可以通过谓词逻辑表示法来描述知识。实现猴子摘香蕉问题的求解过程。

图1  猴子摘香蕉问题

2、建立一个动物识别系统的规则库,编写程序用以识别虎、豹、斑马、长颈鹿、企鹅、鸵鸟、信天翁等7种动物。

为了识别这些动物,可以根据动物识别的特征,建立包含下述规则库:            

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:猴子摘香蕉问题

1.1:源程序

dict = {}

count = 0

while 1:

    if count == 3:

        break

    item = input("please input your item:")

    site = input("please input your site:")

    if item != 'monkey' and item != 'box' and item != 'banana':

        print("input error")

    else:

        dict.setdefault(item, site)

        count += 1

print() # change lines

step = 1 #initialzie step

climb = 0

gain = 0

# if monkey is not at box site

if dict['monkey'] != dict['box']:

    result = "step"+str(step)+": move monkey to box"

    print(result,end=" ")

    print(dict['monkey']+"->"+dict['box'])

    dict['monkey']=dict['box']

    step += 1

# if box is not at banana site

if dict['box'] != dict['banana']:

    result = "step"+str(step)+": move box to banana"

    print(result,end=" ")

    print(dict['box']+"->"+dict['banana'])

    dict['box']=dict['banana']

    dict['monkey']=dict['banana']

    step += 1

# monkey climbs onto the box

if climb == 0:

    result = "step"+str(step)+": monkey climbs on the box"

    print(result,end=" ")

    print(dict['monkey']+"->"+dict['box'])

    step += 1

    climb = 1

# monkey jumps to get the banana

if climb == 1 and gain == 0:

    result = "step"+str(step)+": monkey jumps to get the banana"

    print(result,end=" ")

    print(dict['box']+"->"+dict['banana'])

    step += 1

    gain = 1

 1.2:实验过程与结果


如下图所示,依次输入三个物体及其地点,例如猴子在a点、箱子在b点、香蕉在c点。输入完毕后,程序自动显示每一步的操作。

以图中的结果为例,第一步命令猴子移动到箱子处,即a点到b点;第二步命令猴子将箱子移动到香蕉处,即b点到c点;第三步命令猴子爬到箱子上,地点不变;第四步命令猴子跳起来拿到香蕉,地点不变。综上所述,通过上述4个步骤即可实现猴子拿到香蕉的结果。

 

2:动物识别系统

    2.1:源程序

dict = {}

dict.setdefault(1, "有毛发")

dict.setdefault(2, "有奶")

dict.setdefault(3, "有羽毛")

dict.setdefault(4, "会飞")

dict.setdefault(5, "会生蛋")

dict.setdefault(6, "吃肉")

dict.setdefault(7, "犀利牙齿")

dict.setdefault(8, "有爪")

dict.setdefault(9, "眼向前方")

dict.setdefault(10, "有蹄")

dict.setdefault(11, "反刍")

dict.setdefault(12, "有黄褐色")

dict.setdefault(13, "有暗斑点")

dict.setdefault(14, "有黑色条纹")

dict.setdefault(15, "有长脖子")

dict.setdefault(16, "有长腿")

dict.setdefault(17, "不会飞")

dict.setdefault(18, "有黑白二色")

dict.setdefault(19, "会游泳")

dict.setdefault(20, "善飞")

mammal = 0  # 哺乳动物

bird = 0    #

meat = 0    # 食肉动物

foot = 0    # 蹄类动物

print(dict)

print("please later input features according to this directory")

feature = []

n = int(input("please input the total number of your features: "))

# add int() to convert str into int, or error will occur

for i in range(n):

    t = int(input("please input your current feature number: "))

    feature.append(t)

# hash features

hash = []

for i in range(21):

    hash.append(0)

for item in feature:

    hash[item]=1

# rules

result = ""

check = 0

# rule 1 2

if hash[1] == 1 or hash[2] == 1:

    mammal = 1

# rule 3 4

if hash[3] == 1 or (hash[4] == 1 and hash[5] == 1):

    bird = 1

# rule 5 6

if hash[6] == 1 or (hash[7] == 1 and hash[8] == 1 and hash[9] == 1):

    meat = 1

# rule 7 8

if mammal == 1 and (hash[10] == 1 or hash[11] == 1):

    foot = 1

# rule 9

if mammal == 1 and meat == 1 and hash[12] == 1 and hash[13] == 1:

    if check == 0:

        check = 1

        result = ""

# rule 10

if mammal == 1 and meat == 1 and hash[12] == 1 and hash[14] == 1:

    if check == 0:

        check = 1

        result = ""

# rule 11

if foot == 1 and hash[15] == 1 and hash[16] == 1 and hash[13] == 1:

    if check == 0:

        check = 1

        result = "长颈鹿"

# rule 12

if foot == 1 and hash[14] == 1:

    if check == 0:

        check = 1

        result = "斑马"

# rule 13

if bird == 1 and hash[17] == 1 and hash[15] == 1 and hash[16] == 1 and hash[18] == 1:

    if check == 0:

        check = 1

        result = "鸵鸟"

# rule 14

if bird == 1 and hash[17] == 1 and hash[19] == 1 and hash[18] == 1:

    if check == 0:

        check = 1

        result = "企鹅"

# rule 15

if bird == 1 and hash[20] == 1:

    if check == 0:

        check = 1

        result = "信天翁"

if check == 1:

    print("判断的结果是:"+result)

else:

    print("无法判断")

    2.2:实验过程与结果

在实验过程中,首先编写供用户查阅编号和对应特征的字典,然后令用户根据提示输入特征的总数和每个特征的编号,中间使用哈希表将用户输入的特征所对应的表内位置设定为1,不涉及的特征设定为0,再通过if语句逐条判断规则是否成立,如果成立则将相应的判定结果进行标记,最后输出判断的结果。

值得注意的是,有可能出现无法判断的情况。以下将展示测试规则系统中的各类判断结果,并逐个列举用户所使用的特征。

用户字典:

·测试豹:1、2、6、7、8、9、12、13

·测试虎:1、2、6、7、8、9、12、14

·测试斑马:1、2、10、11、14、17、19

·测试长颈鹿:1、10、13、15、16

·测试企鹅:3、5、17、18、19

·测试鸵鸟:3、5、15、16、17、18


·测试信天翁:3、20


·测试无法判断:1、3、6

 综上所述,各类情况均判断完毕,结果如图所示。

五、遇到的问题和解决办法

问题1:

n = int(input("please input the total number of your features: "))

# add int() to convert str into int, or error will occur

for i in range(n):

    t = int(input("please input your current feature number: "))

    feature.append(t)

上述代码在没有加int()前,input默认输入的为字符串,导致在循环开头时,n不是整数类型而报错。

解决方法1:

将 n = input() 改为 n = int(input()) 即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1133215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 基于腾讯云人脸核身和百度云证件识别技术相结合的 API 实现

目录 腾讯云人脸核身技术 Craneoffice.net 采用的识别方式 1、活体人脸核身(权威库): 2、活体人脸比对: 3、照片人脸核身(权威库): 调用成本 百度云身份证识别 调用成本 相关结合点 核心代码 实现调用人脸核身API的示例 实现调用身…

css 三栏布局的实现?

目录 前言 用法 代码 理解 高质量图片 1. 左侧栏 - 导航菜单 2. 中间栏 - 主要内容 3. 右侧栏 - 小部件和广告 布局的响应式设计 三栏布局在前端页面设计中是一个常见的布局方式,通常包含左侧、中间和右侧三个部分。这种布局方式在多种场景中都很受欢迎&am…

企业安全—DevSecOps概述详情

0x00 前言 SDL存在的问题在于体量过于庞大,不利于快速进行适配和进行,所以就有了DevSecOps,实际上是因为敏捷开发也就是DevOps的推进,并且坐上了云服务模式的火车,所以这一系列的东西都开始普及。DevSecOps作为DevOps…

龙迅LT9211 是MIPI/TTL/2 PORT LVDS互转的一颗高性能芯片,支持车规级

龙迅LT9211 描述: Lontium LT9211是一个高性能转换器,可以在MIPI DSI/CSI-2/双端口LVDS和TTL之间互转换,除了24位TTL到24位TTL与同步和DE。LT9211反序列化输入的MIPI/LVDS/TTL视频数据,解码数据包,并将格式化的视频数…

2006-2021年上市公司社会责任报告基本信息数据

2006-2021年上市公司社会责任报告基本信息表数据 1、时间:2006-2021年 2、来源为上市公司社会责任BG 3、指标:股票代码、统计截止日期、GG日期、所属省份、行业代码、行业名称、纳税总额、每股社会贡献值、社会捐赠额、是否经第三方机构审验、审验机构…

Python Opencv实践 - 入门使用Tesseract识别图片中的文字

做车牌识别项目前试一试tesseract识别中文。tesseract的安装使用请参考: Python OCR工具pytesseract详解 - 知乎pytesseract是基于Python的OCR工具, 底层使用的是Google的Tesseract-OCR 引擎,支持识别图片中的文字,支持jpeg, png…

Android 中如何使用 App Links

1. 简介 什么是 App Links呢?App Links 是 Android 6.0 (API 级别23) 引入的新功能,它是基于 DeepLinking,允许应用自动处理网站的 URL,而无需提示用户启动相应的应用。 例如:如果你在手机浏览器中输入了某个网站&am…

小红书女性用户洞察|2023「她研究」深度数据报告

作为新时代女性群体的聚集地、发声场,小红书不断涌现的「她」话题,承载着不同的女性特质,对理想自我、理想生活的期待,以及消费行为与决策偏好。 当代女性为回答「我是谁」、「我要什么」、「我想成为什么样的自己」,倾…

YOLOv7改进:全网原创首发 | 新颖的多尺度卷积注意力(MSCA),即插即用,助力小目标检测 | NeurIPS2022

💡💡💡本文全网首发独家改进:多尺度卷积注意力(MSCA),有效地提取上下文信息,新颖度高,创新十足。 1)作为注意力MSCA使用; 推荐指数:五星 MSCA | 亲测在多个数据集能够实现涨点,多尺度特性在小目标检测表现也十分出色。 收录: YOLOv7高阶自研专栏介绍:…

【网安大模型专题10.19】论文4:大模型+自动生成代码评估:改进自动化测试方法、创建测试输入生成器、探索新的评估数据集扩充方法,提高编程基准的精度

Is Your Code Generated by ChatGPT Really Correct? 写在最前面主要贡献这篇论文的创新点,为之后的论文提供了一些的启发未来研究的方向:改进自动化测试方法、创建测试输入生成器、探索新的评估数据集扩充方法,以及提高编程基准的精度。实验…

【单链表,循环链表和双向链表的时间效率比较,顺序表和链表的比较,有序表的合并------用顺序表实现,用链表实现】

文章目录 一、单链表,循环链表和双向链表的时间效率比较二、顺序表和链表的比较三、线性表的应用1.线性表的合并1.1有序表的合并------用顺序表实现1.2有序表的合并--------用链表实现 一、单链表,循环链表和双向链表的时间效率比较 查找表头结点&#…

C语言每日一题(19)回文素数

牛客网 BC157 回文素数 题目描述 描述 现在给出一个素数,这个素数满足两点: 1、 只由1-9组成,并且每个数只出现一次,如13,23,1289。 2、 位数从高到低为递减或递增,如2459,87631。 请你判断一下&am…

React中的Virtual DOM(看这一篇就够了)

文章目录 前言了解Virtual DOMreact创建虚拟dom的方式React Element虚拟dom的流程虚拟dom和真实dom的对比后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:react合集 🐱‍👓博主在前端领域还有很多知识和技术需要掌…

双非本两年经验,靠这套Java面试题拿下拿下阿里、百度、美团、滴滴、快手、拼多多等大厂offer

背景 博主是双非大学毕业,有两年的互联网经验 社招面试也是一样的流程:项目 八股 算法 项目: 公司项目,涉及的技术包括但不限: 管理域:DDD、CQRS、事件总线、命令总线 运行域:微内核、规则…

卡尔曼滤波(Kalman Filter)原理及Python实现

Kalman-Filter-Example 项目地址 https://github.com/zhengjie9510/kalman-filter-example 理论公式 详细理论可参考DR_CAN关于卡尔曼滤波器的视频讲解。https://www.bilibili.com/video/BV1dV411B7ME 卡尔曼滤波公式分为预测和更新两部分。 预测公式为: x_hat…

IDENTITY_INSERT 设置为 OFF 时,不能为表 ‘t_user‘ 中的标识列插入显式值

出现这个问题的原因 出现这个问题一般都是SQL server数据库,在创建表主键的时候双击修改标识规范默认自增,如果再插入显示的值就会出现这样的问题。这样的问题是非常常见的,通常会出现在大量数据插入表中,列如 解决的办法 在…

最新发布!阿里云卓越架构框架重磅升级

云布道师 10 月 19 日阿里云峰会山东上,阿里云重磅升级《阿里云卓越架构白皮书》,助力企业在阿里云上构建更加安全、高效、稳定的云架构。《阿里云卓越架构白皮书》在今年的阿里云峰会粤港澳大湾区首度亮相,这是阿里云基于多年服务各行各业客…

RK3399平台开发中安卓系统去除USB权限弹窗

RK3399平台开发中安卓系统去除USB权限弹窗 问题方法 问题 当我们在访问一个插入到Android系统的USB设备的时候往往是需要权限的,此时系统会弹出询问权限的对话框,而我们此时希望让它默认允许访问USB设备并且不希望用户看到这个对话框。 方法 文件目录&…

Dart HttpClient 网络请示框架的使用详解

Dart的HttpClient库是一个用于发送HTTP请求的库,它提供了一个简单的API来执行HTTP请求和接收响应。下面是一个详细的HttpClient使用指南。 1. 导入HttpClient库 首先,确保你已经将HttpClient库导入到你的Dart项目中。你可以使用pubspec.yaml文件中的de…

Java程序设计进阶

Java异常处理机制 异常 异常的最高父类是 Throwable,在 java.lang 包下。 Throwable 类的方法主要有: 方法说明public String getMessage()返回对象的错误信息public void printStackTrace()输出对象的跟踪信息到标准错误输出流public void printSta…