人工智能及其应用作业姓名:学号:一、作业题目:设计一个动物识别系统,运用产生式系统的思想,设在综合数据库中存放下列已知事实:该动物身上有暗斑点,长脖子,长腿,奶,蹄,这些事实与规则库中的知识从第一条开始匹配,最终得出该动物是长颈鹿。二、程序设计分析:根据产生式系统的原理,该系统一般由规则库、综合数据库、控制系统三部分构成。先定义规则库结构体,里面包括Condition[6][20],result[20]和规则数Cnum,再定义综合数据库即事实库,里面包括item[20][20],和事实数Fnum,主要用到的参数就是这些。然后初始化规则库和综合数据库,编辑规则库。之后就是主程序,也就是推理机的作用:先让用户输入事实,然后与规则库中的知识从第一条开始逐条匹配,当匹配成功时,将结论插入事实库并更新事实库,再逐条匹配,依次循环..最终如果能匹配成功就显示‘该动物是..’,否则显示‘无法识别该动物’,程序结束。三、程序流程图如下图:开始规则库、事实库初始化输入动物特性更新事实库是否与规则库知识匹配得出结论结束特性与规则不匹配YN图一、系统程序流程图四、我的源程序如下:#includeiostream.h#includestdio.h#includeconio.h#includestring.htypedefstructRule//定义规则库{charCondition[6][20];charResult[20];intCnum;boolused;}rule;typedefstructFact//定义综合数据库{charitem[20][20];intFnum;}fact;ruler[100];factf;voidCreate_Rules();//初始化规则库voidCreate_Facts();//初始化综合数据库intGet_RulesNum();voidRatiocinate(intn);voidmain(){intRnum=0;Create_Rules();Create_Facts();Rnum=Get_RulesNum();//coutRnumendl;Ratiocinate(Rnum);}voidCreate_Rules(){strcpy(r[0].Condition[0],有毛发);strcpy(r[0].Result,哺乳动物);r[0].Cnum=1;r[0].used=false;strcpy(r[1].Condition[0],奶);strcpy(r[1].Result,哺乳动物);r[1].Cnum=1;r[1].used=false;strcpy(r[2].Condition[0],有羽毛);strcpy(r[2].Result,鸟);r[2].Cnum=1;r[2].used=false;strcpy(r[3].Condition[0],会飞);strcpy(r[3].Condition[1],会下蛋);strcpy(r[3].Result,鸟);r[3].Cnum=2;r[3].used=false;strcpy(r[4].Condition[0],吃肉);strcpy(r[4].Result,食肉动物);r[4].Cnum=1;r[4].used=false;strcpy(r[5].Condition[0],有犬齿);strcpy(r[5].Condition[1],有爪);strcpy(r[5].Condition[2],眼盯前方);strcpy(r[5].Result,食肉动物);r[5].Cnum=3;r[5].used=false;strcpy(r[6].Condition[0],哺乳动物);strcpy(r[6].Condition[1],蹄);strcpy(r[6].Result,有蹄动物);r[6].Cnum=2;r[6].used=false;strcpy(r[7].Condition[0],有蹄动物);strcpy(r[7].Condition[1],嚼反刍动物);strcpy(r[7].Result,有蹄动物);r[7].Cnum=2;r[7].used=false;strcpy(r[8].Condition[0],哺乳动物);strcpy(r[8].Condition[1],食肉动物);strcpy(r[8].Condition[2],黄褐色);strcpy(r[8].Condition[3],身上有暗斑点);strcpy(r[8].Result,金钱豹);r[8].Cnum=4;r[8].used=false;strcpy(r[9].Condition[0],哺乳动物);strcpy(r[9].Condition[1],食肉动物);strcpy(r[9].Condition[2],黄褐色);strcpy(r[9].Condition[3],有黑色条纹);strcpy(r[9].Result,虎);r[9].Cnum=4;r[9].used=false;strcpy(r[10].Condition[0],有蹄动物);strcpy(r[10].Condition[1],长腿);strcpy(r[10].Condition[2],长脖子);strcpy(r[10].Condition[3],身上有暗斑点);strcpy(r[10].Result,长颈鹿);r[10].Cnum=4;r[10].used=false;strcpy(r[11].Condition[0],有蹄类动物);strcpy(r[11].Condition[1],身上有黑色条纹);strcpy(r[11].Result,斑马);r[11].Cnum=2;r[11].used=false;strcpy(r[12].Condition[0],鸟);strcpy(r[12].Condition[1],有长脖子);strcpy(r[12].Condition[2],长腿);strcpy(r[12].Condition[3],不会飞);strcpy(r[12].Condition[4],有黑白两色);strcpy(r[12].Result,鸵鸟);r[12].Cnum=5;r[12].used=false;strcpy(r[13].Condition[0],鸟);strcpy(r[13].Condition[1],会游泳);strcpy(r[13].Condition[2],不会飞);strcpy(r[13].Condition[3],有黑白两色);strcpy(r[13].Result,企鹅);r[13].Cnum=4;r[13].used=false;strcpy(r[14].Condition[0],鸟);strcpy(r[14].Condition[1],善飞);strcpy(r[14].Result,海燕);r[14].Cnum=2;r[14].used=false;}voidCreate_Facts(){printf(请输入该动物特性(中间加空格,Enter键结束)\n);scanf(%s%s%s%s%s,&f.item[0],&f.item[1],&f.item[2],&f.item[3],&f.item[4]);f.Fnum=5;}intGet_RulesNum(){intnum=0;inti=0;while(1){if(r[i].Condition[0][0]=='\0'){break;}i++;num++;}returnnum;}voidRatiocinate(intn){boolFindFact(char*str);voidInsertIntoFact(char*str);inti=0,j;///i用来控制查找的是第几条规则,j用来控制查找的规则中的第几条while(1){if(r[i].used==false){for(j=0;jr[i].Cnum;j++){if(FindFact(r[i].Condition[j])){continue;}else{cout规则i+1匹配失败endl;break;}}}if(j==r[i].Cnum)///如果所有的前件都满足{r[i].used=true;cout规则i+1匹配成功,结论插入到综合数据库endl;if(!FindFact(r[i].Result)){InsertIntoFact(r[i].Result);///插入事实cout新增加的事实为:f.item[f.Fnum-1]endl;}i=0;//continue;}elsei++;//查看下条规则if(i==n){cout没有你要找符合要求的动物,请增加新的规则endl;break;}elseif(strcmp(f.item[f.Fnum-1],老虎)==0||strcmp(f.item[f.Fnum-1],金钱豹)==0||strcmp(f.item[f.Fnum-1],长颈鹿)==0||strcmp(f.item[f.Fnum-1],斑马)==0||strcmp(f.item[f.Fnum-1],鸵鸟)==0||strcmp(f.item[f.Fnum-1],企鹅)==0||strcmp(f.item[f.Fnum-1],海燕)==0){cout与你给的事实匹配的动物:f.item[f.Fnum-1]endl;break;}}}//查看综合数据库中的事实否否等于前件,或者是存在这条事实,那么新的结论就不用加到综合数据库中boolFindFact(char*str){inti;for(i=0;if.Fnum;i++){if(strcmp(f.item[i],str))continue;elsereturntrue;}returnfalse;}//插入新的事实voidInsertIntoFact(char*str){strcpy(f.item[f.Fnum],str);f.Fnum++;}五、程序运行结果: