动物识别系统实验报告
贝类方位辨别实验报告(3篇)

第1篇一、实验目的1. 了解贝类的生物特性,特别是其方位辨别能力。
2. 探究不同环境因素对贝类方位辨别能力的影响。
3. 通过实验验证贝类方位辨别能力的科学原理。
二、实验背景贝类是一类生活在水中的无脊椎动物,它们在自然界中扮演着重要的角色。
贝类具有多种生物学特性,其中方位辨别能力是其中之一。
方位辨别能力是指贝类在环境中能够感知并判断自身位置的能力。
本研究旨在通过实验验证贝类的方位辨别能力,并探讨影响其方位辨别能力的因素。
三、实验材料与方法1. 实验材料:牡蛎、扇贝、鲍鱼等贝类,实验箱、坐标纸、光源、温度计、湿度计等。
2. 实验方法:(1)分组:将贝类分为实验组和对照组,实验组为牡蛎、扇贝、鲍鱼,对照组为其他贝类。
(2)实验设置:在实验箱中设置不同环境条件,如光照、温度、湿度等。
(3)实验过程:将贝类置于实验箱中,观察其方位辨别能力。
记录贝类在实验过程中的行为表现,如游动方向、停留位置等。
(4)数据分析:对实验数据进行分析,比较实验组和对照组的方位辨别能力差异,探讨环境因素对贝类方位辨别能力的影响。
四、实验结果与分析1. 贝类方位辨别能力差异实验结果显示,实验组贝类在实验过程中表现出较强的方位辨别能力,而对照组贝类的方位辨别能力相对较弱。
这说明不同种类的贝类在方位辨别能力上存在差异。
2. 环境因素对贝类方位辨别能力的影响(1)光照:在光照条件下,实验组贝类表现出较强的方位辨别能力,而对照组贝类的方位辨别能力较弱。
这表明光照对贝类方位辨别能力有显著影响。
(2)温度:在适宜的温度范围内,实验组贝类的方位辨别能力较强,而温度过高或过低时,贝类的方位辨别能力有所下降。
这说明温度对贝类方位辨别能力有显著影响。
(3)湿度:在适宜的湿度条件下,实验组贝类的方位辨别能力较强,而湿度过高或过低时,贝类的方位辨别能力有所下降。
这说明湿度对贝类方位辨别能力有显著影响。
五、实验结论1. 贝类具有方位辨别能力,且不同种类的贝类在方位辨别能力上存在差异。
简单动物识别系统的知识表示实验报告

简单动物识别系统的知识表示实验报告一、实验目的:1、理解和掌握产生式知识表示方法。
2、能够用选定的编程语言实现产生式系统的规则库。
二、实验内容和要求:1、以动物识别系统的产生式规则为例。
2、用选定的编程语言建造规则库和综合数据库,并能对它们进行增加、删除和修改操作。
三、实验步骤:1、确定需要识别的动物及其属性:本次实验的简单动物识别系统总共能识别7种动物,即:老虎、金钱豹、斑马、长颈鹿、企鹅、鸵鸟、信天翁。
2、建立识别七种动物识别系统的规则:由于实验要求系统的规则库和综合数据库能够进行增加、删除和修改操作,因此可以采取逐步添加条件,压缩范围的方法进行识别,即:先跟据一些动物的共性进行大致分类,然后在添加约束条件,将范围缩小,直到能够识别出每一种不同的动物为止。
这样,我们在需要添加识别其他动物的功能时,只需要添加那些动物的个性方面的信息即可,这样也可以简化系统的结构和内容。
识别老虎、金钱豹、斑马、长颈鹿、企鹅、鸵鸟、信天翁这7种动物的简单动物识别系统规则一共可以写成以下15条:Rule1:IF 该动物有毛发 THEN 该动物是哺乳动物Rule2:IF 该动物有奶 THEN 该动物是哺乳动物Rule3:IF 该动物有羽毛 THEN 该动物是鸟Rule4:IF 该动物会飞 AND 会下蛋 THEN该动物是鸟Rule5:IF 该动物吃肉 THEN 该动物是肉食动物Rule6:IF 该动物有犬齿 AND 有爪 AND 眼盯前方 THEN该动物是肉食动物Rule7:IF 该动物是哺乳动物 AND 有蹄 THEN 该动物是有蹄类动物Rule8:IF 该动物是哺乳动物 AND 是嚼反刍动物 THEN 该动物是有蹄类动物Rule9:IF 该动物是哺乳动物 AND 是肉食动物 AND 是黄褐色AND 身上有暗斑点THEN该动物是金钱豹Rule10:IF 该动物是哺乳动物 AND 是肉食动物 AND 是黄褐色AND 身上有黑色条纹 THEN 该动物是老虎Rule11:IF 该动物是有蹄类动物 AND 有长脖子 AND 有长腿 AND 身上有暗斑点 THEN 该动物是有长颈鹿Rule12:IF 该动物是有蹄类动物 AND 身上有黑色条纹 THEN 该动物是斑马Rule13:IF 该动物是鸟 AND 有长脖子 AND 有长腿 AND不会飞 THEN 该动物是鸵鸟Rule14:IF 该动物是鸟 AND 会游泳 AND 有黑白二色 AND不会飞THEN 该动物是企鹅Rule15:IF 该动物是鸟 AND 善飞 THEN 该动物是信天翁三、选定编程语言并确定综合数据库和规则库结构:(1)选用C语言作为编程语言(2)综合数据库的建立:用C程序写出综合数据库的代码:char*str{"有毛发","有奶","有羽毛","有犬齿","有暗斑点","有黑色条纹","有蹄","有长脖子","有长腿","有爪","有黑白两色","是黄褐色"," 会游泳","会下蛋","会飞","善飞","不会飞","眼盯前方","吃肉","哺乳动物","嚼反刍动物","肉食动物","有蹄类动物","鸟","老虎","金钱豹","斑马","长颈鹿","企鹅","鸵鸟","信天翁",0}(3)规则库的建立:为了简化数据结构,将综合数据库中的事实全部用序号来表示,共有31个事实,编号依次为1到31。
动物识别系统实验报告

stringFindMaxNumber ="select max(动物序号) from动物库";
SqlCommandcmd2 =newSqlCommand( FindMaxNumber ,con);
1.1功能需求
1.1.1动物识别正向推理
正向推理是从已知事实出发,通过规则库求的结论,也称为自底向上,或称为数据驱动方式。
正向推理过程的具体步骤是:
(1)读入事实集到工作存储器。
(2)取出某条规则,将规则的全部前件与工作存储器中的所有事实进行比较。如果匹配成功,则所得结果显示到屏幕上,转向(3);否则,直接转向(3)。
动物识别系统设计主体框架:本系统只用了一个页面实现,界面使用上下结构的框架设计,当用户进入系统的时候,打开Default.aspx,该页面分为上下两个部分,上面的部分是用于根据问题输入动物特征,下面的部分是新规则的加入功能部分,也是用户进行添加新规则的页面,这好似一个导航页面,用户可以更具自己的选择进行的操作,由上至下进入不同的功能部分。各个功能模块的设计:
staticint[] a =newint[7];
SqlConnectioncon =newSqlConnection("Server = PC-11; user id = sa;password = ;Database = animal;");
protectedvoidPage_Load(objectsender,EventArgse)
YesOption.Checked =false;
}
protectedvoidNoOption_CheckedChanged(objectsender,EventArgse)
{
a[Convert.ToInt32(Questionselected.SelectedValue)] = 0;
动物识别系统实验报告

condition[numbers] = Int32.Parse(this.CheckBoxList1.Items[j].Value.ToString());
numbers++;
}
}
//添加用户自己输入的项
在推理过程中,当规则表中某条规则的前提可以和综合数据库中的已知事实相匹配时,该规则被激活。由它推出的结论将被作为新的事实放入数据库,称为后面推理的已知事实。所以数据库系统结构如下:
4. 系统设计
本系统分为三个功能模块,分别是动物识别、添加规则、删除规则。系统实现如下,其中distinguish.aspx实现动物识别;Addrule.aspx实现添加规则;Deleterule.aspx实现删除规则;主页实现为main.aspx和top.aspx;连接数据库调用DBFunction.cs。
using (DBFunction DBfun = new DBFunction(DBTransactionType.WithTran)) { //如果用户填写了这个空并且这个条件不在数据库中,就将它添加到数据库中。
if (this.TextBox1.Text.ToString() != "" && !check(this.TextBox1.Text.ToString(),DBfun)) {
bool check = true;
for (int j = 1; j < 6; j++){
if (dt.Rows[i][j].ToString() == "")
{ }
else{
马品种的识别实验报告

马品种的识别实验报告实验目的:本实验旨在通过观察和分析马的外貌特征以及主要品种的区别,实现对马品种的准确识别。
实验步骤:1.收集马的样本照片和相关资料;2.选取具有代表性和典型性的马的特征进行观察和记录;3.根据马的颜色、体型、体毛等特征,将样本照片进行分类;4.对每个品种的马的特征进行比较和分析;5.结果记录和总结。
实验结果:经过观察和分析,我们发现马的品种可以根据其颜色、体型和体毛等特征进行准确识别。
主要的马品种包括汗血宝马、花色马、游戏马和体型较小的迷你马等。
1.汗血宝马:这是一种体型较大的马,以其优雅的身姿和灵活的动作而闻名。
它们的体毛通常为纯黑色或纯白色,四肢粗壮,背脊平直。
其特点是颈部较长而修长,眼睛大而明亮。
2.花色马:花色马的外观特征非常个性化和多样化。
它们的体毛可以呈现出各种颜色和斑纹,如黑白相间、棕白相间等。
与其他品种相比,花色马的体型较小,腿部相对细长,尾巴一般呈长而浓密的造型。
3.游戏马:游戏马以其运动和竞技能力而著名。
它们的体型中等,四肢修长而有力,背脊呈弧形。
游戏马的体毛颜色较为丰富,主要有黑色、棕色和灰色等。
与其他品种相比,游戏马的颈部较短而粗壮,背部有明显的肌肉线条。
4.迷你马:迷你马是一种体型较小的马,通常被作为马术比赛中的宠物使用。
它们的体毛颜色多样,包括黑色、棕色、白色等。
迷你马的眼睛大而圆,腿部短且修长,尾巴细长而浓密。
实验结论:通过对马的外貌特征的观察和比较,我们可以准确识别不同品种的马。
汗血宝马、花色马、游戏马和迷你马在体型、颜色、体毛等方面存在明显差异,这些特征能够帮助我们进行马品种的准确识别。
本实验对马的识别和分类有重要意义,对于马术比赛、畜牧业和动物保护等领域具有实际应用价值。
我们深入研究马的外貌特征和品种分类的研究,可以更好地了解和保护这一美丽的动物资源。
动物疫病识别及病原观察实验报告

动物疫病识别及病原观察实验报告
一、实验目的
本实验旨在通过对动物疫病的识别及病原观察,掌握动物疫病的基本知识和诊断方法,提高动物疫病的防治能力。
二、实验原理
动物疫病是指能够引起动物生理、生化、免疫等方面的异常变化,导致动物生产能力下降、死亡或者对人类健康造成威胁的疾病。
动物疫病的病原体主要包括细菌、病毒、真菌、寄生虫等。
诊断动物疫病的方法主要有临床诊断、病理诊断、实验室诊断等。
三、实验步骤
1.观察动物疾病症状
在实验室中,我们观察了几只小白鼠的症状,发现它们出现了呼吸急促、体温升高、食欲不振等症状,初步判断可能是感染了某种病原体。
2.采集样本
为了进一步确定病原体,我们需要采集样本进行实验室检测。
我们选择了小白鼠的血液和粪便样本进行检测。
3.实验室检测
我们将采集到的血液和粪便样本分别进行了细菌培养和病毒检测。
经过培养和检测,我们发现血液样本中存在一种名为“链球菌”的细菌,而粪便样本中则检测出了一种名为“肠病毒”的病毒。
4.诊断疾病
根据实验室检测结果,我们可以初步诊断出小白鼠感染了链球菌和肠病毒,导致了其出现的症状。
四、实验结果
通过本次实验,我们成功地诊断出了小白鼠感染了链球菌和肠病毒,导致了其出现的症状。
同时,我们也掌握了动物疫病的基本知识和诊断方法,提高了动物疫病的防治能力。
五、实验结论
动物疫病是一种严重的疾病,对于动物生产和人类健康都有很大的威胁。
通过本次实验,我们深入了解了动物疫病的诊断方法和病原体,为今后的动物疫病防治工作提供了重要的参考和依据。
动物识别专家系统实验报告

题目:动物识别专家系统一.实验目的理解和掌握产生式只是表示方法,能够用选定的编程语言实现产生式系统的规则库。
二.实验内容(1)以动物识别系统的产生式规则为例。
(2)用选定的编程语言建造规则库和综合数据库,并能对它们进行增加、删除和修改操作。
三.实验原理动物识别专家系统是流行的专家系统实验模型,它用产生式r来表示知识,共15条r、可以识别七种动物,这些r既少又简单,可以改造他们,也可以加进新的r,还可以用来识别其他东西的新r来取代这些r。
动物识别15条r: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该动物是信天翁四.推理树部分推理树如下:五.代码程序是用java编写的规则对象代码:public class Rule {private ArrayList<Integer> premise = new ArrayList<Integer>();private int result;public void addPremise(int item) { premise.add(item);}public int size() {return premise.size();}public int getPremiseAt(int index) {return premise.get(index);}public void setResult(int result) {this.result = result;}public int getResult() {return result;}}规则库代码如下:public class RuleBase {private ArrayList<Rule> rules= new ArrayList<Rule>();public int size() {return rules.size();}public RuleBase() {init();}public void addRule(Rule rule) {rules.add(rule);}public Rule getRuleAt(int index) {return rules.get(index);}public void init() {Rule rule1 = new Rule();rule1.addPremise(0); rule1.setResult(20);rules.add(rule1);Rule rule2 = new Rule();rule2.addPremise(1); rule2.setResult(20);rules.add(rule2);Rule rule3 = new Rule();rule3.addPremise(2); rule3.setResult(21);rules.add(rule3);Rule rule4 = new Rule();rule4.addPremise(3); rule4.addPremise(13); rule4.setResult(21);rules.add(rule4);Rule rule5 = new Rule();rule5.addPremise(19); rule5.setResult(22);rules.add(rule5);Rule rule6 = new Rule();rule6.addPremise(4); rule6.addPremise(15); rule6.addPremise(12); rule6.setResult(22);rules.add(rule6);Rule rule7 = new Rule();rule7.addPremise(20); rule7.addPremise(9); rule7.setResult(23);rules.add(rule7);Rule rule8 = new Rule();rule8.addPremise(20); rule8.addPremise(18); rule8.setResult(23);rules.add(rule8);Rule rule9 = new Rule();rule9.addPremise(20); rule9.addPremise(22); rule9.addPremise(14); rule9.addPremise(11);rule9.setResult(24);rules.add(rule9);Rule rule10 = new Rule();rule10.addPremise(20); rule10.addPremise(22); rule10.addPremise(11); rule10.addPremise(5);rule10.setResult(25);rules.add(rule10);Rule rule11 = new Rule();rule11.addPremise(23); rule11.addPremise(6); rule11.addPremise(7); rule11.addPremise(14);rule11.setResult(30);Rule rule12 = new Rule();rule12.addPremise(23); rule12.addPremise(5); rule12.setResult(26);rules.add(rule12);Rule rule13 = new Rule();rule13.addPremise(21); rule13.addPremise(6); rule13.addPremise(17); rule13.addPremise(7);rule13.setResult(27);rules.add(rule13);Rule rule14 = new Rule();rule14.addPremise(21); rule14.addPremise(10); rule14.addPremise(17); rule14.addPremise(8);rule14.setResult(28);rules.add(rule14);Rule rule15 = new Rule();rule15.addPremise(21); rule15.addPremise(16); rule15.setResult(29);}}综合数据库代码如下:public class Database {ArrayList<Integer> db = new ArrayList<Integer>();public void addFact(int item) {db.add(item);}public boolean contains(int item) {return db.contains(item);}}控制系统代码如下:public class Machine {public static String inference(Database db) { RuleBase ruleBase = new RuleBase();int result = 0;for (int i = 0; i < ruleBase.size(); i++) { int size = ruleBase.getRuleAt(i).size();boolean flag = true;for (int j = 0; j < size; j++) {if(!db.contains(ruleBase.getRuleAt(i).getPremiseAt(j))) { flag = false;break;}}if (flag) {int fact = ruleBase.getRuleAt(i).getResult();db.addFact(fact);if (fact >= 24) {result = fact;break;}}}switch (result) {case 24:return"金钱豹";case 25:return"老虎";case 26:return"斑马";case 27:return"鸵鸟";case 28:return"企鹅";case 29:return"信天翁";case 30:return"长颈鹿";default:return"不存在";}}}六.截图七.感想通过这次课程设计我对专业课的学习有了更加深刻的认识,让我知道了学无止境的道理。
动物识别系统实验报告

暨南大学人工智能实验报告题目:基于web的动物识别系统院系:信科院计算机系专业:计算机技术学号:27学生姓名:ming fang成绩:日期:2010年12月10日一、目的与要求1.掌握人工智能的知识表示技术,能用产生式表示法表示知识,并实现一个用于识别的专家系统。
2.推理策略采用正向推理和反向推理两种。
二、主要内容1.学习人工智能的知识表示技术,关键掌握产生式知识表示的具体应用方法。
2.实现的动物识别系统的主要功能如下:2.1系统能通过正向、反向推理得到正确的动物识别结果。
2.2系统能动态地添加规则、能显示推理过程。
三.实验原理产生式表示:产生式表示是知识表示的一种。
这种方法是建立在因果关系的基础上的,可很容易的描述事实、规则及其不确定性度量。
1.事实的表示:事实可看成是断言一个语言变量的值或是多个语言变量间的关系的陈述句,语言变量的值或语言变量间的关系可以是一个词。
不一定是数字。
一般使用三元组(对象,属性,值)或(关系,对象1,对象2)来表示事实,其中对象就是语言变量,若考虑不确定性就成了四元组表示(增加可信度)。
这种表示的机器内部实现就是一个表。
如事实“小王年龄是22岁”,便写成(Lee,age,22)事实“小李、小张是朋友”,可写成(friend,Lee,Zhang)2.规则的表示:规则用于表示事物间的因果关系,以IF condition THEN action 的单一形式来描述,将规则作为知识的单位。
其中的condition 部分称为条件式前件或模式,而action部分称作动作、后件或结论。
产生式一般形式为:前件后件。
前件和后件也可以是有“与”、“或”、“非”等逻辑运算符的组合的表达式。
条件部分常是一些事实的合取或析取,而结论常是某一事实B。
如果不考虑不确定性,需另附可信度度量值。
产生式过则的含义是:如果前件满足,则可得到后件的结论或者执行后件的相应动作,即后件由前件来触发。
一个产生式生成的结论可以作为另一个产生式的前提或语言变量使用,进一步可构成产生式系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人工智能实验报告二班级:XXXX 姓名:XXXX 学号:XXXXX 一.实验目的1. 理解并掌握基于规则系统的表示与推理。
2. 学会编写小型的产生式系统,理解正向推理和反向推理的过3. 程以及两者的差别。
4. 学会设计简单的人机交互界面。
二.实验预习内容及实验环境:1. 了解动物识别系统问题;2. 产生式系统的组成部分,正向推理,逆向推理的算法和产生式系统的类型。
三、实验内容和步骤:1.内容:结合第五章内容,以动物识别系统(或货物袋装系统)为例,实现基于规则的系统构造实验。
2.要求:1>结果显示要求(1)有若干选择动物特征的选择列表;(2)表现判断动物时,使用了哪些规则;(3)表现数据库的变化;(正向推理中表现每使用一次规则后,产生新事实。
反向推理中表现新的目标事实有哪些需要证明,哪些已经得到证实);(4)显示规则的调用次序;(5)显示最后的结果,包含动物能识别出来和动物不能识别出来两种情况。
(6)至少检查两个例子实现正向推理和反向推理的区别;老虎的例子如上所示,以下为金钱豹的例子:正向推理:反向推理:2>指出综合数据库和规则库分别使用哪些函数实现的?综合数据库和规则库均采用数组完成。
其中的综合数据库为一个string类型的数组,内容为事实的名称字符串,下标则为该事实的序号。
数组长度为33,表示共有33个事实(最后7个为动物名称)。
代码如下:string facts[factnum]={"有爪","有犬齿","有奶","有毛发","目视前方","吃肉","有蹄","有羽毛","会飞","生蛋","不会飞","黑白色","会游泳","善飞","不怕风浪","长腿","长脖子","有暗斑点","白色","黑色斑点","黑色条纹","黄褐色","食肉动物","鸟","哺乳动物","有蹄动物","老虎","金钱豹","长颈鹿","斑马","鸵鸟","企鹅","海燕"};规则库为一个结构体数组。
该结构体由一个int型数组(表示前提条件的序号集合)和一个int数据(表示由此前提推出的结果)表示。
该数组长度为14,表明有14条规则。
该规则库在建立时有一个内在要求:前提的规则(子规则)的序号必须在父规则之前。
(便于正向推理的实现)代码如下:struct rule{int con[10];int res;};Rulerules[rulenum]={{{2,-1},24},{{3,-1},24},{{7,-1},23},{{8,9,-1},23},{{24,0,1,4,-1},22 }, {{24,5,-1},22},{{24,6,-1},25},{{22,21,20,-1},26},{{22,21,19,-1},27},{{25,15,16,21,17,-1},28},{{25,18,20,-1},29},{{23,10,15,16,11,-1},30},{{23,10,12,11,-1},31},{{23,13,14,-1},32}};3>规则库的匹配算法是什么?如何选用可用规则集中的规则?分别使用哪些函数实现的?用一个bool型的与数据库数组等长的enfact数组表示各事实是否已经满足(或已经推出)。
要匹配一个规则的时候,只需查看其前提序号集数组中每个元素对应的enfact数组中的值是否为true,如果所有都为true则可由该规则推出相应结果。
代码如下:bool enfact[factnum];memset(enfact,false,factnum);//每次输入时需对该数组进行初始化//以下为输入过程while(ti!=-1){if(ti>=0&&ti<=notanimal)enfact[ti]=true;else{cout<<"输入错误!请输入0~25之间的数字!"<< endl;//notanimal=25cin.clear();//清除流错误错误标记cin.sync(); ////////////清空输入缓冲区break;}cin>> ti;};以上,则完成了输入,并对enfact数组进行了初始化。
现在对正向推理和反向推理的匹配和具体推理过程进行简要说明。
正向推理:从下向上的推理。
由于建立规则库时的内在要求,即子规则必在父规则前,故进行正向推理的时候只要将规则库从前到后扫一遍看是否能由规则推出相应结果即可。
如果能匹配推出结果则看该结果是否为动物,如果已经推出动物则推理成功。
否则更新数据库,匹配下一个规则。
代码如下:int obverse(){outputf(1);int ti;int i,j;int tres;cout<<endl;for(i=0;i<rulenum;i++){j=0;ti=rules[i].con[j];while(ti!=-1) //假设前提数不超过9个,必存在-1作为结束{if(enfact[ti]==false)break;j++;ti=rules[i].con[j];}if(ti==-1){tres=rules[i].res;enfact[tres]=true;cout<<"运用了规则"<<i<<" : ";j=0;while(rules[i].con[j]!=-1){cout<<facts[rules[i].con[j]]<<" ";j++;}cout<<"====> "<<facts[tres]<<endl;if(isAnimal(tres)){if(noOtiose(tres))return tres;elsereturn -1;}}}return -1;}反向推理:从上向下的推理。
反向推理比正向推理要复杂一些。
采用的算法是从事实数据库的动物开始从前往后进行匹配,看是否能成功推出,如果都推不出能识别失败,若能推出其中一个则中止搜索,识别成功。
推某一个事实时,仍然是从该事实的前提出发,逐个匹配,若所有的前提满足,则该事实满足。
不同的是,这里以该事实为结果的前提可能有很多,我采用了牺牲空间换时间的方法,即不是将规则库从头到尾搜一遍来查找以待查事实为结果的规则,而是事先将所有的先保存在一个结构体数组中,结构体中只有一个数组,表示能推出某个结果的规则序号。
代码如下:struct factrule{int rulen[5];};factrulefactrules[factnum]={{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{-1},{4,5,-1},{2,3,-1},{0,1,-1},{6,-1},{7,-1},{8,-1},{9,-1},{10,-1},{11,-1},{12,-1}};故要看某个事实是否能推出的时候,只要将它对应的标号的factrules中的数组中的规则进行匹配即可,只要有一条规则满足,即可中止搜索,推出该事实可满足。
另外,由于某个规则的前提可能是另一个规则的结果,这相当于规则的嵌套。
所以在进行反向推理时必须用到递归技术,并且是一种回溯。
整个反向推理的代码如下:bool achieve(int ri) //{int j;int ti;cout<<endl<<"当前验证目标为: "<<facts[rules[ri].res]<<endl;cout<<"尝试规则"<<ri<<" : ";j=0;while(rules[ri].con[j]!=-1){cout<<facts[rules[ri].con[j]]<<" ";j++;}cout<<"==?==> "<<facts[rules[ri].res]<<endl;j=0;ti=rules[ri].con[j];while(ti!=-1){if(enfact[ti]==false){int ki=0;if(factrules[ti].rulen[ki]==-1){cout<<"条件"<<facts[ti]<<"不满足!"<<endl;cout<<"使用规则"<<ri<<" : ";j=0;while(rules[ri].con[j]!=-1){cout<<facts[rules[ri].con[j]]<<" ";j++;}cout<<"=====> "<<facts[rules[ri].res]<<"失败!"<<endl;return false;}else{cout<<"条件"<<facts[ti]<<"未知,继续推理..."<<endl;bool ok=false;for(ki=0;factrules[ti].rulen[ki]!=-1&&!ok;ki++){ok=achieve(factrules[ti].rulen[ki]);}if(ok){cout<<"条件"<<facts[ti]<<"满足!"<<endl;j++;ti=rules[ri].con[j];}else{cout<<"条件"<<facts[ti]<<"不满足!"<<endl;cout<<"使用规则"<<ri<<" : ";j=0;while(rules[ri].con[j]!=-1){cout<<facts[rules[ri].con[j]]<<" ";j++;}cout<<"=====> "<<facts[rules[ri].res]<<" 失败!"<<endl<<endl;return false;}}}else{cout<<"条件"<<facts[ti]<<"满足!"<<endl;j++;ti=rules[ri].con[j];}}{cout<<"使用规则"<<ri<<" : ";j=0;while(rules[ri].con[j]!=-1){cout<<facts[rules[ri].con[j]]<<" ";j++;}cout<<"=====> "<<facts[rules[ri].res]<<"成功!"<<endl;return true;}}int reverse(){outputf(2);int i;for(i=animalfrom;i<rulenum;i++){cout<<endl<<"----------------------由动物目标:"<<facts[rules[i].res]<<"进行反向推理-------------------------"<<endl;if(achieve(i)){if(noOtiose(i+notanimal-animalfrom+1))return i+notanimal-animalfrom+1;elsereturn -1;}}return -1;}注:本系统对输入事实冗余的情况做出了处理。