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


    实验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()) 即可。

  • 相关阅读:
    【Flink】FlinkCDC自定义反序列化器
    第33章_瑞萨MCU零基础入门系列教程之DHT11温湿度获取实验
    验证码绕过、密码找回漏洞
    二叉查找树(1)-二叉树-数据结构和算法(Java)
    SV-线程的使用与控制
    cad转换成pdf怎么转?
    Maven部署打包多环境(开发、测试、生产)配置教程
    中小企业如何做好MES管理系统的项目实施
    快鲸SCRM能为企业解决哪些管理痛点?
    (附源码)php二手服装网站 毕业设计 201711
  • 原文地址:https://blog.csdn.net/m0_65787507/article/details/134043664