产生式推理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MessageBox("没有规则库!"); return; } CString db[50]; RULE goal[50]; CString str,g[50]; char s1[50],*s2; int n=0,t=1; strcpy(s1,m_f); s2=strtok(s1,","); while(s2!=NULL) {
运行程序后的正向推理结果图如下:
2 反向推理: (1)动态数据库与目标链的定义:
CString db[50]; RULE goal[50]; CString g[50];
(2)事实(条件)与目标的输入; (3)反向推理程序设计:
CDC *pDC=GetDlgItem(IDC_RESULT)->GetDC(); if(rule[0].reason=="") {
pDC->TextOut(100,15,rule[i].result); t=0; } for(i=0;i<num;i++) if(com(db,n,rule[i].reason)&&!bz[i]) {
wait[k].reason=rule[i].reason; wait[k++].result=rule[i].result; bz[i]=1; } if(k==0) { pDC->TextOut(10,10,"推理失败!"); t=0; } for(i=0;i<k;i++) db[i+n]=wait[i].result; n+=k; k=0; } }
} return(true); }
(5)正向推理程序设计:
CDC *pDC=GetDlgItem(IDC_RESULT)->GetDC(); if(rule[0].reason=="") { MessageBox("没有规则库!");
return; } CString db[50]; RULE wait[50]; CString str; char s1[50],*s2; int n=0; strcpy(s1,m_f); s2=strtok(s1,",");
str[m++].FormaBiblioteka Baidu("%s",s2); s2=strtok(NULL,","); } int t=0;
for(int j=0;j<m;j++) { for(int i=0;i<n;i++)
if(str1[i]==str[j]) {t=1;break;}
if(t==0) return(false); t=0;
三 产生式推理的运行:
1 正向推理及其主要算法: 从初始实时数据出发,正向使用规则进行推理,朝目标
方向前进。 (1)将初始事实/数据置入动态数据库。 (2)用动态数据库中的事实匹配目标条件,若目标条件满 足,推理成功,结束。 (3)用规则库中各规则的前提匹配动态数据库中的事实, 将匹配成功的规则前提移除数据动态库,并将匹配成功的规 则组成待用规则集。 (4)若待用规则集为空,则运行失败,退出。 (5)将待用规则集中各规则移出,并将结论加入动态数据 库,或者执行其动作,转步(2)。
(5)若该目标是初始目标,则推理失败,退出。
(6)将该目标的父目标移回目标链,取代该目标及其兄弟
目标,转步(3)。
四 实验主要步骤及代码:
1 正向推理:
(1)建立规则库:在对话框类定义内添加规则库的数据结
构定义及存放规则个数的变量,主要代码如下:
Class CMyDlg:public CDialog { public: struct RULE
rule[6].reason=_T("有蹄动物,白色,有黑色条纹"); rule[6].result=_T("斑马"); rule[6].t=true; rule[7].reason=_T("鸟,不会飞,长腿,长脖子,黑白色"); rule[7].result=_T("鸵鸟"); rule[7].t=true; rule[8].reason=_T("鸟,不会飞,会游泳,黑白色"); rule[8].result=_T("企鹅"); rule[8].t=true; rule[9].reason=_T("鸟,善飞,不怕风浪"); rule[9].result=_T("海燕"); rule[9].t=true; rule[10].reason=_T("有毛"); rule[10].result=_T("哺乳动物"); rule[10].t=false; rule[11].reason=_T("有羽毛"); rule[11].result=_T("鸟"); rule[11].t=false; rule[12].reason=_T("会飞,生蛋"); rule[12].result=_T("鸟"); rule[12].t=false; rule[13].reason=_T("哺乳动物,有爪,有犬齿,目盯前方,吃肉"); rule[13].result=_T("食肉动物"); rule[13].t=false; num=14; CDC *pDC=GetDlgItem(IDC_RULE)->GetDC(); for(int i=0;i<num;i++) {
pDC->TextOut(5,i*20+5,rule[i].reason); pDC->TextOut(410,i*20+5,rule[i].result); } }
(3)添加规则:
rule[num].reason=m_r; rule[num].result=m_s; rule[num].t=m_t; CDC *pDC=GetDlgItem(IDC_RULE)->GetDC(); pDC->TextOut(5,num*20+5,rule[num].reason); pDC->TextOut(410,num*20+5,rule[num].result); num++; MessageBox("成功添加!");
二 实验基础知识:
产生式系统:包括产生式规则库、推理机、动态数据库三部 分; (1)动态数据库:它是产生式系统的数据结构中心,是一 个动态数据结构,用来存放初始事实数据、中间结果和最后 结果; (2)产生式规则库:由领域规则组成,在机器中以某种数 据结构进行组织,每条规则都有一定条件,若动态数据库中 内容满足这些条件可调用这条规则; (3)推理机:控制执行机构,负责产生式规则的前提条件 测试或匹配、规则的调度和选取、规则体的解释和执行。
}
} }
if(i==num) if(goal[k].reason==m_g) { pDC->TextOut(10,10,"推理失败!"); t=0; } else { str=goal[k].result; for(i=k;i>=0;i--) if(goal[k].result!=str) break; k=i+1; goal[k].reason=str; }
人工智能实验报告-基于产生式规则的机器推理
专 业: 计算机科学与技术
班 级:
1320701
学 号: 201320070115
学生姓名 :
许志捷
指导教师 :
钟国韵
一 实验目的:
(1)熟练了解、掌握机器推理产生式规则的定义及使用; (2)熟练掌握基于产生式规则的推理模式; (3)了解并熟悉产生式系统的整个结构比如:动态数据库、 产生式规则库、推理机等; (4)熟练掌握正向反向推理的步骤及思想。
2 反向推理及其主要算法: 从目标出发,反向使用规则进行推理,朝初始事实或数据
方向前进。 (1)将初始事实/数据置入动态数据库,将目标条件置入目 标链。 (2)若目标链为空,则推理成功,结束。 (3)取出目标链中第一个目标,用动态数据库中的事实同 其匹配,若匹配成功,转步(2)。 (4)用规则集中的各规则的结论同该目标匹配,若匹配成 功,则将第一个匹配成功且从未使用过的规则的前提作为新 的目标,并取代原来的父目标加入目标链,转步(3)。
db[n++].Format("%s",s2); s2=strtok(NULL,","); } int k=-1,k1=-1; goal[++k].reason=m_g; goal[k].result=m_g; g[++k1]=m_g; while(t) { if(k==-1) {
pDC->TextOut(10,15,"推理结果:"); pDC->TextOut(100,15,m_g); t=0; } for(int i=0;i<n;i++) if(goal[k].reason==db[i])
while(s2!=NULL) {
db[n++].Format("%s",s2); s2=strtok(NULL,","); } int k=0,t=1; BOOL bz[100]={100*0}; while(t) { for(int i=0;i<num;i++)
if(com(db,n,rule[i].reason)&&rule[i].t) { pDC->TextOut(10,15,"推理结果:");
break; if(i<n) {
k--;continue; } for(i=0;i<num;i++)
if(rule[i].result==goal[k].reason) {
for(int j=0;j<k1;j++) if(g[j]==rule[i].reason&&g[j]!=m_g) break; if(j==k1) { g[++k1]=rule[i].reason; strcpy(s1,rule[i].reason); s2=strtok(s1,","); k--; while(s2!=NULL) { str.Format("%s",s2); goal[++k].reason=str; goal[k].result=rule[i].result; s2=strtok(NULL,","); } } else continue; break;
}
我自己建立的规则库的界面示意图如下:
(4)字符串匹配函数设计:
BOOL com(CString str1[],int n,CString str2) {
char s1[50],*s2; CString str[100]; strcpy(s1,str2); s2=strtok(s1,",");
int m=0; while(s2!=NULL) {
运行程序后的正向推理结果图如下:
五 实验总结:
本次实验基本实现了书中要求的功能,在实际上机操作过 程中我遇到了一些小麻烦,比如运行不顺畅,没有注意中英 文切换造成无法获取结果等情况出现,希望自己以后更加细 致小心,总结经验。
{ CString reason; CString result; BOOL t;}
Rule[100];
(2)建立初值规则库:
rule[0].reason=_T("有奶"); rule[0].result=_T("哺乳动物"); rule[0].t=false; rule[1].reason=_T("哺乳动物,吃肉"); rule[1].result=_T("食肉动物"); rule[1].t=false; rule[2].reason=_T("哺乳动物,有蹄"); rule[2].result=_T("有蹄动物"); rule[2].t=false; rule[3].reason=_T("食肉动物,黄褐色,有黑色条纹");//有毛,吃肉,黄褐色,有黑色条纹 rule[3].result=_T("老虎"); rule[3].t=true; rule[4].reason=_T("食肉动物,黄褐色,有黑色斑点"); rule[4].result=_T("金钱豹"); rule[4].t=true; rule[5].reason=_T("有蹄动物,长腿,长脖子,黄褐色,有暗斑点"); rule[5].result=_T("长颈鹿"); rule[5].t=false;
运行程序后的正向推理结果图如下:
2 反向推理: (1)动态数据库与目标链的定义:
CString db[50]; RULE goal[50]; CString g[50];
(2)事实(条件)与目标的输入; (3)反向推理程序设计:
CDC *pDC=GetDlgItem(IDC_RESULT)->GetDC(); if(rule[0].reason=="") {
pDC->TextOut(100,15,rule[i].result); t=0; } for(i=0;i<num;i++) if(com(db,n,rule[i].reason)&&!bz[i]) {
wait[k].reason=rule[i].reason; wait[k++].result=rule[i].result; bz[i]=1; } if(k==0) { pDC->TextOut(10,10,"推理失败!"); t=0; } for(i=0;i<k;i++) db[i+n]=wait[i].result; n+=k; k=0; } }
} return(true); }
(5)正向推理程序设计:
CDC *pDC=GetDlgItem(IDC_RESULT)->GetDC(); if(rule[0].reason=="") { MessageBox("没有规则库!");
return; } CString db[50]; RULE wait[50]; CString str; char s1[50],*s2; int n=0; strcpy(s1,m_f); s2=strtok(s1,",");
str[m++].FormaBiblioteka Baidu("%s",s2); s2=strtok(NULL,","); } int t=0;
for(int j=0;j<m;j++) { for(int i=0;i<n;i++)
if(str1[i]==str[j]) {t=1;break;}
if(t==0) return(false); t=0;
三 产生式推理的运行:
1 正向推理及其主要算法: 从初始实时数据出发,正向使用规则进行推理,朝目标
方向前进。 (1)将初始事实/数据置入动态数据库。 (2)用动态数据库中的事实匹配目标条件,若目标条件满 足,推理成功,结束。 (3)用规则库中各规则的前提匹配动态数据库中的事实, 将匹配成功的规则前提移除数据动态库,并将匹配成功的规 则组成待用规则集。 (4)若待用规则集为空,则运行失败,退出。 (5)将待用规则集中各规则移出,并将结论加入动态数据 库,或者执行其动作,转步(2)。
(5)若该目标是初始目标,则推理失败,退出。
(6)将该目标的父目标移回目标链,取代该目标及其兄弟
目标,转步(3)。
四 实验主要步骤及代码:
1 正向推理:
(1)建立规则库:在对话框类定义内添加规则库的数据结
构定义及存放规则个数的变量,主要代码如下:
Class CMyDlg:public CDialog { public: struct RULE
rule[6].reason=_T("有蹄动物,白色,有黑色条纹"); rule[6].result=_T("斑马"); rule[6].t=true; rule[7].reason=_T("鸟,不会飞,长腿,长脖子,黑白色"); rule[7].result=_T("鸵鸟"); rule[7].t=true; rule[8].reason=_T("鸟,不会飞,会游泳,黑白色"); rule[8].result=_T("企鹅"); rule[8].t=true; rule[9].reason=_T("鸟,善飞,不怕风浪"); rule[9].result=_T("海燕"); rule[9].t=true; rule[10].reason=_T("有毛"); rule[10].result=_T("哺乳动物"); rule[10].t=false; rule[11].reason=_T("有羽毛"); rule[11].result=_T("鸟"); rule[11].t=false; rule[12].reason=_T("会飞,生蛋"); rule[12].result=_T("鸟"); rule[12].t=false; rule[13].reason=_T("哺乳动物,有爪,有犬齿,目盯前方,吃肉"); rule[13].result=_T("食肉动物"); rule[13].t=false; num=14; CDC *pDC=GetDlgItem(IDC_RULE)->GetDC(); for(int i=0;i<num;i++) {
pDC->TextOut(5,i*20+5,rule[i].reason); pDC->TextOut(410,i*20+5,rule[i].result); } }
(3)添加规则:
rule[num].reason=m_r; rule[num].result=m_s; rule[num].t=m_t; CDC *pDC=GetDlgItem(IDC_RULE)->GetDC(); pDC->TextOut(5,num*20+5,rule[num].reason); pDC->TextOut(410,num*20+5,rule[num].result); num++; MessageBox("成功添加!");
二 实验基础知识:
产生式系统:包括产生式规则库、推理机、动态数据库三部 分; (1)动态数据库:它是产生式系统的数据结构中心,是一 个动态数据结构,用来存放初始事实数据、中间结果和最后 结果; (2)产生式规则库:由领域规则组成,在机器中以某种数 据结构进行组织,每条规则都有一定条件,若动态数据库中 内容满足这些条件可调用这条规则; (3)推理机:控制执行机构,负责产生式规则的前提条件 测试或匹配、规则的调度和选取、规则体的解释和执行。
}
} }
if(i==num) if(goal[k].reason==m_g) { pDC->TextOut(10,10,"推理失败!"); t=0; } else { str=goal[k].result; for(i=k;i>=0;i--) if(goal[k].result!=str) break; k=i+1; goal[k].reason=str; }
人工智能实验报告-基于产生式规则的机器推理
专 业: 计算机科学与技术
班 级:
1320701
学 号: 201320070115
学生姓名 :
许志捷
指导教师 :
钟国韵
一 实验目的:
(1)熟练了解、掌握机器推理产生式规则的定义及使用; (2)熟练掌握基于产生式规则的推理模式; (3)了解并熟悉产生式系统的整个结构比如:动态数据库、 产生式规则库、推理机等; (4)熟练掌握正向反向推理的步骤及思想。
2 反向推理及其主要算法: 从目标出发,反向使用规则进行推理,朝初始事实或数据
方向前进。 (1)将初始事实/数据置入动态数据库,将目标条件置入目 标链。 (2)若目标链为空,则推理成功,结束。 (3)取出目标链中第一个目标,用动态数据库中的事实同 其匹配,若匹配成功,转步(2)。 (4)用规则集中的各规则的结论同该目标匹配,若匹配成 功,则将第一个匹配成功且从未使用过的规则的前提作为新 的目标,并取代原来的父目标加入目标链,转步(3)。
db[n++].Format("%s",s2); s2=strtok(NULL,","); } int k=-1,k1=-1; goal[++k].reason=m_g; goal[k].result=m_g; g[++k1]=m_g; while(t) { if(k==-1) {
pDC->TextOut(10,15,"推理结果:"); pDC->TextOut(100,15,m_g); t=0; } for(int i=0;i<n;i++) if(goal[k].reason==db[i])
while(s2!=NULL) {
db[n++].Format("%s",s2); s2=strtok(NULL,","); } int k=0,t=1; BOOL bz[100]={100*0}; while(t) { for(int i=0;i<num;i++)
if(com(db,n,rule[i].reason)&&rule[i].t) { pDC->TextOut(10,15,"推理结果:");
break; if(i<n) {
k--;continue; } for(i=0;i<num;i++)
if(rule[i].result==goal[k].reason) {
for(int j=0;j<k1;j++) if(g[j]==rule[i].reason&&g[j]!=m_g) break; if(j==k1) { g[++k1]=rule[i].reason; strcpy(s1,rule[i].reason); s2=strtok(s1,","); k--; while(s2!=NULL) { str.Format("%s",s2); goal[++k].reason=str; goal[k].result=rule[i].result; s2=strtok(NULL,","); } } else continue; break;
}
我自己建立的规则库的界面示意图如下:
(4)字符串匹配函数设计:
BOOL com(CString str1[],int n,CString str2) {
char s1[50],*s2; CString str[100]; strcpy(s1,str2); s2=strtok(s1,",");
int m=0; while(s2!=NULL) {
运行程序后的正向推理结果图如下:
五 实验总结:
本次实验基本实现了书中要求的功能,在实际上机操作过 程中我遇到了一些小麻烦,比如运行不顺畅,没有注意中英 文切换造成无法获取结果等情况出现,希望自己以后更加细 致小心,总结经验。
{ CString reason; CString result; BOOL t;}
Rule[100];
(2)建立初值规则库:
rule[0].reason=_T("有奶"); rule[0].result=_T("哺乳动物"); rule[0].t=false; rule[1].reason=_T("哺乳动物,吃肉"); rule[1].result=_T("食肉动物"); rule[1].t=false; rule[2].reason=_T("哺乳动物,有蹄"); rule[2].result=_T("有蹄动物"); rule[2].t=false; rule[3].reason=_T("食肉动物,黄褐色,有黑色条纹");//有毛,吃肉,黄褐色,有黑色条纹 rule[3].result=_T("老虎"); rule[3].t=true; rule[4].reason=_T("食肉动物,黄褐色,有黑色斑点"); rule[4].result=_T("金钱豹"); rule[4].t=true; rule[5].reason=_T("有蹄动物,长腿,长脖子,黄褐色,有暗斑点"); rule[5].result=_T("长颈鹿"); rule[5].t=false;