动物专家系统Word文档格式.docx
- 文档编号:3105931
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:16
- 大小:104.81KB
动物专家系统Word文档格式.docx
《动物专家系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《动物专家系统Word文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
2、将动态数据库中的事实/数据,匹配/测试目标条件,若目标条件满足,则推理成功,结束。
3、用规则库中各规则的前提匹配动态数据库中的事实/数据,将匹配成功的规则组成待用规则集。
4、若待用规则集为空,则运行失败,退出。
5、将待用规则集中各规则的结论加入动态数据库,或者执行其动作,转2.
三、源程序:
#defineANIMAL_H
#defineTrue1
#defineFalse0
#defineDontKnow-1
#include<
stdio.h>
math.h>
string.h>
//事实集(概念集)
char*str[]={"
"
"
chew_cud"
/*1*/,"
hooves"
/*2*/,"
mammal"
/*3*/,
forward_eyes"
/*4*/,"
claws"
/*5*/,"
pointed_teeth"
/*6*/,
"
eat_meat"
/*7*/,"
lay_eggs"
/*8*/,"
fly"
/*9*/,
feathers"
/*10*/,"
ungulate"
/*11*/,"
carnivore"
/*12*/,
bird"
/*13*/,"
give_milk"
/*14*/,"
has_hair"
/*15*/,
fly_well"
/*16*/,"
black&
while_color"
/*17*/,"
can_swim"
/*18*/,
long_legs"
/*19*/,"
long_neck"
/*20*/,"
black_stripes"
/*21*/,
dark_spots"
/*22*/,"
tawny_color"
/*23*/,"
albatross"
/*24*/,
penguin"
/*25*/,"
ostrich"
/*26*/,"
zebra"
/*27*/,
giraffe"
/*28*/,"
tiger"
/*29*/,"
cheetah"
/*30*/,
\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};
//前个是要识别的动物
//事实类
classfact{
private:
intNumber;
//事实ID
charName[21];
//事实名
intActive;
//激活标志
intSucc;
//事实断言:
真、假、不知道三种情况值
public:
fact*Next;
//事实链表后继指针
/*<
Function事实类构造函数,由它激活事实对象集/>
<
para>
Num:
事实ID<
/para>
L:
事实名<
*/
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;
}//获取事实ID
intGetAct(){returnActive;
}//获取事实激活标志
intGetSucc(){returnSucc;
}//获取事实断言值
//设置事实激活标志和断言值
voidPutAct(constintAct0,intSuc0)
Active=Act0;
Succ=Suc0;
//endfact
fact*Fact;
//事实链表
classlist{//前提(前提来源与事实集)链表类
//前提ID,即事实ID
list*Next;
//前提链表后继指针
/*<
Function前提链表类构造函数/>
list(intNum)
}//获取前提ID(也就是事实ID)
//endlist
classrule{//规则类
char*Name;
//规则名
list*Pre;
//规则前件(前提、条件)链表头指针
intConc;
//规则后件(结论)ID(也是事实ID)
rule*Next;
//规则链表后继指针
rule(char*N,intP[],intC);
//规则类构造函数
~rule();
//析构函数
intQuery();
//推理机函数
voidGetName(){printf("
%s%"
Name);
}//输出规则名
/*<
Function规则类构造函数,激活规则对象集/>
<
N:
规则名<
P:
规则前件数组<
C:
规则后件ID<
*/
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;
//填入规则后件(结论)
}
Function释放规则链表节点之前提链空间/>
Note规则链本身空间为释放/>
~rule()
list*L;
while(Pre)
{
L=Pre->
Next;
deletePre;
deleteName;
Function主要实现推理机/>
Return规则使用成功与否/>
intrule:
Query()
//inti;
charc;
//保存用户输入按键符号
//临时前提链
fact*F;
//临时事实链
L=Pre;
//L指向前提链
F=Fact;
if(L==NULL)printf("
\nError!
);
//如果推理时,本规则前提链为空,出错,后面while循环也退出!
while(L!
=NULL)//前提链未处理完
//F指向事实链表
for(;
;
)//以当前前提,在事实链表中查询(根据ID)
{//因为前提为“-事实ID”,表示该事实不成立,所以取绝对值
if(abs(L->
GetNumber())==F->
GetNumber())break;
//一旦查询到,有这样的前提(不管其是否成立)则中止查询。
我们的知识库必须保证一定能查许到,否则deadloop
F=F->
//查询下一事实
}//退出循环时,F指向查询到的事实节点
if(L->
GetNumber()>
0)//如果前提为真
if((F->
GetSucc())==True){//而且事实链表中的这个事实断言也为真
L=L->
//则本规则的当前前提在推理中满足
continue;
//继续下一前提的判断
}
GetSucc())==False)//Sorry,该前提在事实链表中断言不成立
returnFalse;
//该规则推理使用结束,直接返回
else//如果前提为假,表现为-ID
GetSucc())==True)//Sorry,该前提在事实链表中断言却为真
//该规则推理使用结束,直接返回
GetSucc())==False){//同上类似
}//endif-else
printf("
%s(Y/N)"
F->
GetName());
//向用户提问,这里简单以事实名为问题
c=getchar();
//接受用户输入
flushall();
/*注意:
事实链表中节点的Succ域指:
该事实的用户断言或中间推出的断言*/
if((c=='
Y'
)||(c=='
y'
))//回答“是”
if(L->
0)F->
PutAct(1,True);
//且当前规则中的当前前提要求为“真”,置激活和“真”断言
GetNumber()<
0){//且若当前规则中的当前前提要求为“假”
F->
//置激活和用户的断言
//本规则推理结束,不成功;
后面的前提不判断了!
else
{//分析同上
PutAct(-1,False);
0){
L=L->
//用户断言和当前规则的当前前提符合,则取当前规则的下一前提进行判断!
}//endwhile
//只要上述while循环正常退出,表明当前规则的所有前件都满足,下面要得出当前规则的推理结论了
)
if(Conc==F->
//在事实表中查找与当前规则得后件相同得事实(结论性)
F=F->
if(Conc<
24)//如果规则后件(结论)不是最终最终性得(即不是种要识别得动物)
F->
//那就是中间事实性结论,设置其激活和中间推理确证了的断言
returnFalse;
//然后返回,本规则并不能结束整个推理
//当前规则之后件是最终结论,得出要识别的动物,返回真!
\nThisannimalis%s"
returnTrue;
#endif
#include"
animal.h"
intmain(intargc,char*argv[])
//list*List;
fact*F,*T;
rule*Rule,*R;
charch[8];
inti=1;
Fact=NULL;
//事实链表初始为空
while(str[i][0]!
='
\0'
){//在事实链表中填入事实,注意:
F=newfact(i,str[i++]);
F->
Next=Fact;
Fact=F;
while(F){//倒转上面前插入的事实链表。
invertedtheupperlink
T=F;
T->
Fact=T;
ch[0]='
R'
ch[1]='
U'
ch[2]='
L'
ch[3]='
E'
ch[4]='
_'
ch[5]='
a'
ch[6]='
Rule=NULL;
//规则链表初始为空
for(i=0;
i<
15;
i++)//填入规则
R=newrule(ch,rulep[i],rulec[i]);
R->
Next=Rule;
Rule=R;
ch[5]++;
R=Rule;
)//开始询问用户。
Query
{
i=R->
Query();
if(i==1)break;
//如果返回“真”,则推理成功,并可以给出最后专家答案!
R=R->
if(!
R)break;
//所有规则都扫描完,R为空,则退出!
if(!
R)printf("
\nIdon'
tknow."
//所有规则都扫描完的退出,表明无法得到答案,
\nPressandbartoexit."
getchar();
return0;
四、实验结果:
五、心得体会
通过本次设计与实验,对专家系统有了深刻的理解与掌握。
摆脱了书面上单一的介绍,结合自己的实践过程,对推理机的实现、算法的选择、知识库的构建以及动态数据库的实现都有了比较好的掌握。
利用人工智能语言,编写的程序,具有专家系统所具有的各种有点。
并对语言的学习和理解提供了良好的契机。
巩固和提高了自己的编程能力,强化了编程思想,对数据结构、数据库等知识做到了很好的复习。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动物 专家系统