文章目录

  • 一、题目
  • 二、实验过程
  • 三、完整代码
  • 四、结果展示

一、题目

建造用以识别虎、金钱豹、斑马、长颈鹿、企鹅、鸵鸟和信天翁 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 该动物是信天翁

提示,识别动物的基本思路:首先根据简单的条件对动物进行初次的分类划分,然后根据题中逐渐增加的细化条件,缩小分类范围,最后得出识别以上 7种动物的规则结果。
需要注意的是,
(1) 当已知的事实不完全时,虽不能推出最终结论,但可以得到分类结果;
(2) 当需要增加对其它动物的识别时,规则中只需增加关于这些动物的识别规则,可以充分利用前导规则;

二、实验过程

1.用C++模板库的容器构造特征表,用数字表示动物特征和动物类别:

2.构建规则库:

3.实现原理
用C++STL库的set_difference()函数求规则库与输入数据的差集放入tmp_sec的vector容器中,如果该容器的大小为0,说明输入数据中的某一/某些特征符合规则库中的规则,可以继续推理下去,如果该容器的大小不为0,说明输入数据中的某一/某些特征只是规则库中的某一/某些规则的一部分条件,不能进行推理;
主要过程:

        map<vector<int>, int>::iterator vec_iter;vector<int>  tmp_sec;vec_iter = classific.begin();i = 0;while (vec_iter != classific.end()) {i++;set_difference(vec_iter->first.begin(), vec_iter->first.end(), fact.begin(), fact.end(), inserter(tmp_sec, tmp_sec.begin()));if (tmp_sec.size() == 0) {//得到结果result.push_back(vec_iter->second);}tmp_sec.clear();vec_iter++;}

手动推导:

具体示例:

三、完整代码

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
//映射特征表
map<int, string> tables =
{{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,"金钱豹"}
};
//推理表(规则库)
map<vector<int>, int> classific =
{{{1},21},               //1{{2},21},{{3},22},{{4,5},22},{{6},23},             //5{{7,8,9},23},{{10,21},24},{{11,21},24},{{12,13,21,23},31},{{12,14,24,26},30},        //10{{13,15,16,24},29},{{14,24},28},{{15,16,17,19,22},27},{{20,22},26},{{17,18,19,22},25}//15
};
bool have_result = false;
int main()
{int i, j, a, b, c;int num;vector<int> fact, temp, result;vector<int>::iterator p;int flag = 1;cout << "欢迎来到产生式系统:" << endl;//打印选项单map<int, string>::iterator iter;iter = tables.begin();while (iter->first <= 24) {cout << iter->first << "." << iter->second << "\t";if (iter->first % 5 == 0)cout << endl;iter++;}cout << endl;while (flag == 1) {//输入信息cout << "请输入特征数:" << endl;cin >> num;cout << "请输入特征:" << endl;for (i = 0; i < num; i++) {cin >> a;fact.push_back(a);}sort(fact.begin(), fact.end());//实现推理过程map<vector<int>, int>::iterator vec_iter;vector<int>  tmp_sec;vec_iter = classific.begin();i = 0;while (vec_iter != classific.end()) {i++;set_difference(vec_iter->first.begin(), vec_iter->first.end(), fact.begin(), fact.end(), inserter(tmp_sec, tmp_sec.begin()));if (tmp_sec.size() == 0) {//得到结果result.push_back(vec_iter->second);}tmp_sec.clear();vec_iter++;}//判断是否得出结论p = result.begin();if (result.begin() == result.end()){cout << "不能推导出!" << endl;}else{while (p != result.end()){if (*p < 21)//特征{cout << "不能推导出!" << endl;break;}else{cout << "该动物可能是" << tables[*p] << endl;}p++;}}fact.clear();result.clear();cout << "请选择:1.继续    0.退出" << endl;cin >> flag;}return 0;
}

四、结果展示

1.完全符合规则库的某一规则:

2.部分符合规则库的某一/某些规则:

3. 都不符合规则库的某一/某些规则

4.超出范围:

文章参考自:c++实现简单的产生式推理系统

人工智能基础---上机2:产生式系统相关推荐

  1. 人工智能基础---上机1:猴子摘香蕉

    人工智能基础-上机1:猴子摘香蕉 一.题目 利用一阶谓词逻辑求解猴子摘香蕉问题:房内有一个猴子,一个箱子,天花板上挂了一串香蕉,其位置如图 1 所示,猴子为了拿到香蕉,它必须把箱子搬到香蕉下面,然后再 ...

  2. dlut 人工智能基础上机————创造营2020数据爬取

    import json import requests from bs4 import BeautifulSoup import os from openpyxl import workbook # ...

  3. 首部高中《人工智能基础》教材问世,40家中学引入

     整理 | 阿司匹林 出品 | AI科技大本营(公众号ID:rgznai100) 随着人工智能逐渐上升为国际竞争的新焦点,AI 人才短缺也日益凸显,全球对于人工智能基础教育的呼声不断.国务院印发的 ...

  4. 计算机应用基础上机操作,计算机应用基础上机操作试题

    计算机应用基础上机操作试题 山东省计算机应用能力考核试题 准考证号:姓名: 一.win7操作题 1.在D盘根目录下建立文件夹,命名为自己的准考证号,在姓名文件 夹下建立文件夹user. 2.在user ...

  5. 理解与理论:人工智能基础问题的悲观与乐观

    来源:筑土为坛 梅剑华,男,1980年生,湖北秭归人,山西大学哲学社会学院教授,博士生导师,先后赴美国罗格斯大学.匹兹堡大学.奥地利萨尔茨堡大学等访学,研究方向是语言哲学与心灵哲学.实验哲学与认知科学 ...

  6. UC伯克利教授Stuart Russell人工智能基础概念与34个误区

    来源:数据简化DataSimp 数据简化DataSimp导读:UC伯克利教授StuartRussell人工智能基础概念与34个误区,Russell是加州大学伯克利分校人工智能系统中心创始人兼计算机科学 ...

  7. 计算机文化基础操作考试,(计算机文化基础上机考试操作指南.doc

    (计算机文化基础上机考试操作指南 <计算机文化基础>上机考试操作指南 一.考试说明: 本考试为无纸化考试,考生按照监考老师的指引进入考场,在指定的座位参加考试. 二.登录系统 1.用鼠标双 ...

  8. 计算机文化教程实验基础知识,《计算机文化基础上机实验教程》孙家启、黄晓梅、刘奎 著_孔网...

    <计算机文化基础上机实验教程>是安徽省高等学校"十一五"规划教材--<计算机文化基础教程>的配套实验教材.本教程共安排了19个实验,内容包括计算机基础知识( ...

  9. 综述 | 联邦学习-新兴的人工智能基础技术

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟  报道  | 公众号 CVLianMeng 转载于 :arivx, 专知 [人工 ...

最新文章

  1. Nginx源代码分析 - 日志处理
  2. 监测linux一些重要文件md5值脚本
  3. c语言24点程序,C语言24点问题
  4. MAC地址、IP地址、ARP协议
  5. php后台登录显示ok,thinkphp的项目 后台登录问题,怪事
  6. windows xp中安装PadWalker
  7. “迭代期内无变更”与敏捷开发产品版本规划
  8. python中如何去除列表中重复元素?
  9. Python爬取起点中文网小说信息及封面图片
  10. eclipse卸载插件
  11. 用excel做logistic回归分析_利用SPSS进行Logistic回归分析
  12. KindEditor
  13. cpu高对计算机有什么影响吗,电脑CPU性能高低有什么影响 怎么提高电脑CPU性能...
  14. 【7gyy】高手分享辨别电脑病毒技巧
  15. Android游戏引擎汇总,架构师花费近一年时间整理出来的安卓核心知识
  16. sqoop import 数据同步到hive的用法
  17. matlab冲激激励,实验一 阶跃响应与冲激响应.doc
  18. 源码分析Dubbo监控中心实现原理
  19. 用计算机专业起情侣网名,带对方名字的情侣网名最新精选
  20. 修改服务器上tomcat的默认端口号

热门文章

  1. windows server 12 r2安装Hyper-V
  2. 为什么你需要RS485转LoRaWAN的数据采集器?
  3. 阿里云服务器配置(三)
  4. 有关iOS学习方法拙见
  5. Linux服务器故障排查基本方案
  6. hopfileld神经网络_人工智能及深度学习-中国大学mooc-题库零氪
  7. html插入自动循环背景音乐,HTML插入背景音乐方法【全】
  8. Flutter时间选择器(城市选择器,时间选择器,数量选择器)
  9. 嵌入式c语言学习笔记
  10. Oracle存储过程转Mysql存储过程