产生式系统实验报告张昆+E0Word文档下载推荐.docx
- 文档编号:3102319
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:32
- 大小:67.17KB
产生式系统实验报告张昆+E0Word文档下载推荐.docx
《产生式系统实验报告张昆+E0Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《产生式系统实验报告张昆+E0Word文档下载推荐.docx(32页珍藏版)》请在冰点文库上搜索。
PS_BACKTRACK(db)
(1)若db指示了目标状态,则输出(显示)db作为解答,算法成功结束;
(2)若db指示了失败状态,则返回真值F;
(3)rs:
=RULE_ACTIVATE(db),并用启发式知识对rs中的规则按从优到劣的次序排列;
(4)若rs为空,则返回真值F;
(5)r:
=MOVE_FIRST(rs);
(6)PS_BACKTRACK(TRANSFORM(db,r));
(7)返回语句(4)。
其中db为数据库内容,RULE_ACTIVATE()为匹配函数,MOVE_FIRST()功能为获取最优触发规则,TRANSFORM()将结论加入数据库
3、相关策略
3.1冲突解决策略:
按详细程度排序,即优先选择前提部分描述最详细的规则
3.2动物识别系统的推理策略:
正向推理
三、实验代码
#include<
stdio.h>
string.h>
stdlib.h>
math.h>
#defineMAXNUM50
typedefstruct
intxuh;
charvalu[50];
}Node;
intstat;
//0:
还未访问1:
至少用过一次2:
没用过但不冲突
}NFact;
intsnum;
//开始时的事实数
intcurnum;
//目前的事实数
intnotEnoughFlag;
//当最后若所有未用过的条件支持一个结论,但条件不足时,置1
NFactcod[MAXNUM];
}Fact;
intcodXuh;
doubleweight;
//intcodNum;
}bQueueNode;
inthead;
inttail;
bQueueNodebNode[MAXNUM];
}bQueue;
intcanReachTime;
inthavReached;
}Reach;
intlastCodXuhInQueue;
intmyXuh;
//intmycodNum;
intmyRslt;
doublemyweight;
}CloseNode;
CloseNodenode[MAXNUM];
}Close;
intcodnum=28;
intgoalnum=7;
intrulenum=0;
Nodegoal[20];
Nodecod[50];
Nrulerule[50];
FactinpCod;
bQueuebqueue;
ReachrecReach[MAXNUM];
Closeclose;
voidreadGoal()
FILE*fp;
inti;
if((fp=fopen("
goal.txt"
"
r"
))==NULL)
{
printf("
cannotopengoal\n"
);
exit(0);
}
i=0;
while((fscanf(fp,"
%d%s"
&
goal[i].xuh,&
goal[i++].valu))!
=EOF);
fclose(fp);
}//readGoal
voidreadRule()
inttempxuh,tempcodn;
charch;
rules.txt"
cannotopendata\n"
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-'
;
ch=fgetc(fp);
}
rule[i].cod[tempcodn++]=tempxuh;
if(ch=='
-'
)//下一个是结论
{
while(ch<
{
tempxuh=tempxuh*10+ch-'
ch=fgetc(fp);
}
rule[i].rslt=tempxuh;
}//if
elseif(ch=='
*'
rule[i].codNum++;
}
i++;
rulenum=i;
}//readCod
voidreadCod()
data.txt"
cod[i].xuh,&
cod[i++].valu))!
voidreadFiles()
//charfname[100];
readGoal();
readCod();
readRule();
}//reaFiles
intinputCod()
intretflag=1;
inttemp;
do
scanf("
%d"
temp);
inpCod.cod[i++].xuh=temp;
if(temp>
=codnum)
printf("
特征序号不能大于%d,请重新输入:
\n"
codnum-1);
fflush(stdin);
retflag=0;
}while(temp!
=-1&
temp<
codnum);
inpCod.snum=i-1;
inpCod.curnum=inpCod.snum;
/*inpCod.snum=5;
inpCod.cod[0].xuh=1;
inpCod.cod[1].xuh=5;
inpCod.cod[2].xuh=10;
inpCod.cod[3].xuh=15;
inpCod.cod[4].xuh=16;
*/
returnretflag;
}//inputCod()
intonlyExtra(intinpCodXuh,intrslt)
inti,j;
intfa[50];
intretflag;
inttempstate[50];
//若放入队列中,则记录为1
fa[0]=rslt;
tempstate[rslt]=1;
head=0;
tail=1;
retflag=0;
while(head!
=tail&
retflag!
=1)
for(j=0;
j<
rulenum;
j++)
if(rule[j].rslt==fa[head])
for(i=0;
i<
rule[j].codNum;
i++)
{
if(inpCod.cod[inpCodXuh].xuh==rule[j].cod[i])
//if(inpCodXuh==rule[j].cod[i])
{
retflag=1;
}
else
if(tempstate[rule[j].cod[i]]!
{
fa[tail++]=rule[j].cod[i];
tempstate[rule[j].cod[i]]=1;
}
head++;
}//onlyExtra
intisContradict(intrslt)
intflag;
flag=0;
for(i=0;
inpCod.curnum&
flag==0;
if(inpCod.cod[i].stat==0&
inpCod.cod[i].xuh!
=rslt)
if(onlyExtra(i,rslt))
inpCod.cod[i].stat=2;
flag=0;
else
flag=1;
returnflag;
}//isContradict()
voidisAim(intrslt,int*doneflag)
if(rslt>
=codnum)//已推理出一个动物
*doneflag=1;
if(isContradict(rslt))
条件有冲突,没有这样的动物。
else
它是%s。
goal[rslt-codnum].valu);
}//isAim()
voidaddFact(intruleXuh,int*doneflag)
intflagHave;
flagHave=0;
//标志此次推出的结论是否已在inpCod.cod[]中
inpCod.curnum;
if(inpCod.cod[i].xuh==rule[ruleXuh].rslt)
flagHave=1;
if(flagHave==0)
inpCod.cod[inpCod.curnum].xuh=rule[ruleXuh].rslt;
inpCod.curnum++;
isAim(rule[ruleXuh].rslt,doneflag);
}//addFact()
voidfitOneRule(intruleXuh,int*doneflag)
inti,k;
rule[ruleXuh].codNum;
i++)//作inpCod[]的访问标记
for(k=0;
k<
k++)
if(rule[ruleXuh].cod[i]==inpCod.cod[k].xuh)
inpCod.cod[k].stat=1;
}//for
rule[ruleXuh].used=1;
addFact(ruleXuh,doneflag);
}//fitOneRule()
voidcountNoUseF(int*recNoUseF,int*recNoUseFNum)
//若已经在recNoUseF[]中记录过,就记为1
tempstate[inpCod.cod[i].xuh]!
recNoUseF[*recNoUseFNum]=inpCod.cod[i].xuh;
++(*recNoUseFNum);
tempstate[inpCod.cod[i].xuh]=1;
}//countNoUseF()
voidprintLikeClouse(inttempflag,intruleXuh,int*printRec)
Node*result;
intresultXuh;
result=cod;
resultXuh=rule[ruleXuh].rslt;
printRec[rule[ruleXuh].rslt]=1;
if(resultXuh>
27)
result=goal;
resultXuh-=28;
if(tempflag==0)
条件不完全,但它有%s"
result[resultXuh].valu);
else
和%s"
}//printLikeClouse()
voidmaybeAnimal()
inti,j,k;
//intcountMaybe;
intcountLikeCurRule;
intrecNoUseF[50],recNoUseFNum;
intprintRec[50];
//若前面已推出这个"
可能结论"
,就置为1
inttempflag;
recNoUseFNum=0;
countNoUseF(recNoUseF,&
recNoUseFNum);
//countMaybe=0;
tempflag=0;
countLikeCurRule=0;
rule[i].codNum;
for(k=0;
recNoUseFNum;
if(recNoUseF[k]==rule[i].cod[j])
++countLikeCurRule;
if(countLikeCurRule*2>
=rule[i].codNum&
printRec[rule[i].rslt]!
printLikeClouse(tempflag,i,printRec);
tempflag=1;
条件不足,不能推出它是什么动物"
的部分特征"
printf("
。
}//maybeAnimal()
voidforwardFinger()
//1:
工作已完成0:
还未完成
intflagFit;
intflagCNew;
//记录本次循环有没有推出新事实
intfitPart;
//1:
有部分符合条件
flagCNew=1;
while(!
flag&
flagCNew==1)
flagCNew=0;
rulenum&
rule[j].used!
=1&
j++)//一条规则
if(rule[j].codNum<
=inpCod.curnum)//事实数不小于当前规则所要求的条件数
flagFit=1;
rule[j].codNum&
flagFit==1;
fitPart=0;
for(k=0;
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)
maybeAnimal();
//当没有推出任何动物时,看是否极有可能得出一些结论
//if(flag==0)
}//finger()
voidprintChoice()
j=0;
codnum;
//for(j=0;
4;
%-2d%-14s"
cod[i].xuh,cod[i].valu);
j++;
if(j%4==0)
}//printChoice()
voidinit()
MAXNUM;
rule[i].used=0;
inpCod.notEnoughFlag=0;
inpCod.cod[i].stat=0;
}//init()
voidfindCod()
//for(j=bqueue.head;
bqueue.tail;
//{
if(inpCod.cod[i].xuh==bqueue.bNode[bqueue.head].codXuh)
bqueue.bNode[bqueue.head].stat=1;
inpCod.cod[i].stat=1;
//}
return;
}//findCod()
voidrecMarkdCod(bQueueNode*markdCod,int*markdCodNum)
//inti;
intj;
intflagRecd;
//for(i=bqueue.head;
//{
flagRecd=0;
if(bqueue.bNode[bqueue.head].stat==1)
*markdCodNum;
if(markdCod[j].codXuh==bqueue.bNode[bqueue.head].codXuh&
markdCod[j].rslt==bqueue.bNode[bqueue.head].rslt)
flagRecd=1;
markdCod[j].weight=bqueue.bNode[bqueue.head].weight;
if(flagRecd==0)
markdCod[*markdCodNum].codXuh=bqueue.bNode[bqueue.head].codXuh;
markdCod[*markdCodNum].weight=bqueue.bNode[bqueue.head].weight;
markdCod[*markdCodNum].rslt=bqueue.bNode[bqueue.head].rslt;
(*markdCodNum)++;
//}
}//recMarkdCod()
voidcountReachTime()
++(recReach[rule[i].rslt].canReachTime);
}//countReachTime()
voidaddNodeToQueue()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 产生 系统 实验 报告 E0