您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 产生式—动物识别系统
一.实验题目动物识别专家系统二.实验目的1.理解并掌握基于规则系统的表示与推理2.学会编写小型的生产式系统,理解正向推理和反向推理的过程以及两者的区别3.学会设计简单的人机交互界面三.实验内容动物识别专家系统是流行的专家系统实验模型,它用产生式规则来表示知识,共15条规则、可以识别七种动物,这些规则既少又简单,可以改造他们,也可以加进新的规则,还可以用来识别其他东西的新规则来取代这些规则。四.实验要求1、确定推理方法(正向还是反向),并根据问题设计实现一个简单的不通用推理机(匹配、冲突消解)2、规则库要求至少包含15条规则3、初始事实可以任意给定,输入初始事实后能够得到推理结果4、设计人机界面,解释模块提供查询规则的功能5、可以不考虑知识库管理模块6、提交实验报告,7、报告中要有推理树五.实验原理动物识别专家系统是流行的专家系统实验模型,它用产生式规则来表示知识,共15条规则、可以识别七种动物,这些规则既少又简单,可以改造他们,也可以加进新的规则,还可以用来识别其他东西的新规则来取代这些规则。动物识别15条规则:规则1:如果:动物有毛发则:该动物是哺乳动物规则2:如果:动物能产奶则:该单位是哺乳动物规则3:如果:该动物有羽毛则:该动物是鸟规则4:如果:动物会飞,且会下蛋则:该动物是鸟规则5:如果:动物吃肉则:该动物是肉食动物规则6:如果:动物有犬齿,且有爪,且眼盯前方则:该动物是食肉动物规则7:如果:动物是哺乳动物,且有蹄则:该动物是有蹄动物规则8:如果:动物是哺乳动物,且是反刍动物则:该动物是有蹄动物规则9:如果:动物是哺乳动物,且是食肉动物,且是黄褐色的,且有暗斑点则:该动物是豹规则10:如果:如果:动物是黄褐色的,且是哺乳动物,且是食肉,且有黑条纹则:该动物是虎规则11:如果:动物有暗斑点,且有长腿,且有长脖子,且是有蹄类则:该动物是长颈鹿规则12:如果:动物有黑条纹,且是有蹄类动物则:该动物是斑马规则13:如果:动物有长腿,且有长脖子,且是黑色的,且是鸟,且不会飞则:该动物是鸵鸟规则14:如果:动物是鸟,且不会飞,且会游泳,且是黑色的则:该动物是企鹅规则15:如果:动物是鸟,且善飞则:该动物是信天翁六.推理树七.代码#includestring.h#includemath.h#includestdio.h#includeiostream.h#defineTrue1#defineFalse0#defineDontKnow-1char*str[]={chew_cud反刍动物,hooves蹄类动物,mammal哺乳动物,forward_eyes眼盯前方,claws有爪,pointed_teeth有犬齿,eat_meat吃肉,lay_eggs会下蛋,fly会飞,feathers有羽毛,ungulate有蹄,carnivore食肉动物,bird鸟,give_milk能产奶,has_hair有毛发,fly_well善飞,black&white_color黑白色,can_swim会游泳,long_legs长腿,long_neck长脖子,black_stripes黑条纹,dark_spots黑斑点,老虎哺乳动物黑条纹黄褐色肉食动物能产奶吃肉有爪有犬齿眼顶前方规则2规则5规则6规则10有毛发规则1tawny_color黄褐色,albatross信天翁,penguin企鹅,ostrich驼鸟,zebra斑马,giraffe长颈鹿,tiger老虎,cheetah猎豹,0};intrulep[][6]={{22,23,12,3,0,0},{21,23,12,3,0,0},{22,19,20,11,0,0},{21,11,0,0,0,0},{17,19,20,13,-9,0},{17,18,13,-9,0,0},{16,13,0,0,0,0},{15,0,0,0,0,0},{14,0,0,0,0,0},{10,0,0,0,0,0},{8,7,0,0,0,0},{7,0,0,0,0,0},{4,5,6,0,0,0},{2,3,0,0,0,0},{1,3,0,0,0,0}};intrulec[]={30,29,28,27,26,25,24,3,3,13,13,12,12,11,11,0};classfact{private:intNumber;charName[21];intActive;intSucc;public:fact*Next;fact(intNum,char*L){strcpy(Name,L);Number=Num;Active=False;Succ=DontKnow;Next=NULL;}char*GetName(){char*L;L=newchar[21];strcpy(L,Name);returnL;}intGetNumber(){returnNumber;}intGetAct(){returnActive;}intGetSucc(){returnSucc;}voidPutAct(constintAct0,intSuc0){Active=Act0;Succ=Suc0;}};fact*Fact;classlist{private:intNumber;public:list*Next;list(intNum){Number=Num;Next=NULL;}intGetNumber(){returnNumber;}};classrule{char*Name;list*Pre;intConc;public:rule*Next;rule(char*N,intP[],intC);~rule();intQuery();voidGetName(){coutName;}};rule::~rule(){list*L;while(Pre){L=Pre-Next;deletePre;Pre=L;}deleteName;}rule::rule(char*N,intP[],intC){inti;list*L;Pre=NULL;Next=NULL;Name=newchar[strlen(N)+1];strcpy(Name,N);i=0;while(P[i]!=0){L=newlist(P[i++]);L-Next=Pre;Pre=L;}Conc=C;}intrule::Query(){charc;intTag=0;list*L;fact*F;F=Fact;L=Pre;if(L==NULL)cout\nError;while(L!=NULL){F=Fact;for(;;){if(abs(L-GetNumber())==F-GetNumber())break;F=F-Next;}if(L-GetNumber()0){if((F-GetSucc())==true){L=L-Next;continue;}if((F-GetSucc())==false)returnfalse;}else{if((F-GetSucc())==True)returnFalse;if((F-GetSucc())==False){L=L-Next;continue;}}coutF-GetName()(Y/N)endl;c=getchar();flushall();if((c=='Y')||(c=='y')){if(L-GetNumber()0)F-PutAct(1,True);if(L-GetNumber()0){F-PutAct(1,True);Tag=-1;returnFalse;}}else{if(L-GetNumber()0)F-PutAct(-1,False);else{F-PutAct(-1,False);Tag=-1;returnFalse;}}L=L-Next;}F=Fact;for(;;){if(Conc==F-GetNumber())break;F=F-Next;}if(Conc24){F-PutAct(1,True);returnFalse;}if(Tag!=-1){F=Fact;for(;;){if(Conc==F-GetNumber())break;F=F-Next;}if(Conc24){F-PutAct(1,True);returnFalse;}cout\nThisaniamalisF-GetName()endl;returnTrue;}returnFalse;}intmain(){fact*F,*T;rule*Rule,*R;charch[8];inti=1;Fact=NULL;while(str[i-1]){F=newfact(i,str[i-1]);F-Next=Fact;Fact=F;i++;}F=Fact;Fact=NULL;while(F){T=F;F=F-Next;T-Next=Fact;Fact=T;}i=0;ch[0]='R';ch[1]='U';ch[2]='L';ch[3]='E';ch[4]='_';ch[5]='a';ch[6]='\0';Rule=NULL;for(i=0;i15;i++){R=newrule(ch,rulep[i],rulec[i]);R-Next=Rule;Rule=R;ch[5]++;}R=Rule;for(;;){i=R-Query();if((i==1)||(i==-1))break;R=R-Next;if(!R)break;}if(!R)cout没有这种动物.endl;coutpressanykeytoexit.endl;getchar();returnTrue;}八.截图九.实验感悟虽然还没有具体学习过产生式算法,但是通过本次实践,对正向推理反向推理的过程可以说已经有了大概的了解和一些自己的看法,对代码的控制能力也有了一定的提高,递归函数的设计,流程的控制都得到了一定的强化。我觉得本次实验的算法还是比较简单的,关键是数据结构的设计,我运用了很多自定义的结构体想使程序显得简单一些,但是效果并不好,别人很难分清那些机构。
本文标题:产生式—动物识别系统
链接地址:https://www.777doc.com/doc-4346979 .html