人工智能实验报告-产生式系统推理-动物识别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人工智能第二次实验报告
产生式系统推理
班级:姓名:学号:
一、实验目的
1. 理解并掌握产生式系统的基本原理;
2. 掌握产生式系统的组成部分,以及正向推理和逆向推理过程。
二、实验要求
1. 结合课本内容, 以动物识别系统为例,实现小型产生式系统;
2. 要求: 正向推理中能根据输入的初始事实,正确地识别所能识别的动物;逆向推理中
能根据所给的动物给出动物的特征。
三、实验算法
1. 如何表示事实和特征的知识;
在本程序中,我将动物的特征写入data.txt,将规则记入rules.txt,将动物种类记为goal.txt。
通过函数void readFiles()
{
readGoal();
readCod();
readRule();
}读入所有数据分别存放于goal[],rule[],cod[]自定义数组中。
2. 指出综合数据库和规则库分别使用哪些函数实现的?
综合数据库(包括特征和目标)
typedef struct
{
int xuh;//存放编号
char valu[50];//存放具体内容
}Node;
Node goal[20];
Node cod[50];
规则库
typedef struct
{
int rslt;
int codNum;//记载前提的个数
int cod[10];//记载前提的序号
int used;//记载是否已匹配成功
}Nrule;
Nrule rule[50];
void readRule()
{
FILE *fp;
int i;
int tempxuh,tempcodn;
char ch;
if((fp=fopen("rules.txt","r"))==NULL)
{
printf("cannot open data\n");
exit(0);
}
i=0;
rule[i].codNum=0;
while((ch=fgetc(fp))!=EOF)
{
if(i==14)
i=i;
tempcodn=0;
while(ch!='\n'&&ch!=EOF) //每一条规则
{
tempxuh=0;
while(ch<='9'&&ch>='0')
{
tempxuh=tempxuh*10+ch-'0';
ch=fgetc(fp);
}
rule[i].cod[tempcodn++]=tempxuh;
tempxuh=0;
if(ch=='-')//下一个是结论
{
ch=fgetc(fp);
ch=fgetc(fp);
while(ch<='9'&&ch>='0')
{
tempxuh=tempxuh*10+ch-'0';
ch=fgetc(fp);
}
rule[i].rslt=tempxuh;
}//if
else if(ch=='*')
{
ch=fgetc(fp);
}
rule[i].codNum++;
}
i++;
}
rulenum=i;
fclose(fp);
}
3. 规则库的匹配算法是什么?如何选用可用规则集中的规则?分别使用哪些函数实现的?
程序中的正向与逆向搜索分别是在void main()中调用forwardFinger()和backFinger()来实现的。
正向搜索
从下向上的推理。由于建立规则库时的内在要求,即子规则必在父规则前,故进行正向推理的时候只要将规则库从前到后扫一遍看是否能由规则推出相应结果即可。如果能匹配推出结果则看该结果是否为动物,如果已经推出动物则推理成功。否则更新事实库,匹配下一个规则。代码如下:
void forwardFinger()
{
int flag;//1:工作已完成 0:还未完成
int flagFit;
int flagCNew;//记录本次循环有没有推出新事实
int fitPart;//1:有部分符合条件
int i,j,k;
flag=0;
flagCNew=1;
while(!flag&&flagCNew==1)
{
flagCNew=0;
for(j=0;j { if(rule[j].codNum<=inpCod.curnum)//事实数不小于当前规则所要求的条件数 { flagFit=1; for(i=0;i { fitPart=0; for(k=0;k { if(rule[j].cod[i]==inpCod.cod[k].xuh) { fitPart=1; } } flagFit=fitPart; } if(flagFit==1) { flagCNew=1; fitOneRule(j,&flag);//有事实匹配时,就处理把结论加入事实库等事情 flagFit=0; } } }// }//while if(flagCNew==0) { printf("条件不足,不能推出它是什么动物"); } } 逆向搜索 反向推理比正向推理要复杂一些。采用的算法是从事实库的动物开始从前往后进行匹配,看是否能成功推出,如果都推不出能识别失败,若能推出其中一个则中止搜索,识别成