实验一产生式系统实验.docx
《实验一产生式系统实验.docx》由会员分享,可在线阅读,更多相关《实验一产生式系统实验.docx(7页珍藏版)》请在冰豆网上搜索。
![实验一产生式系统实验.docx](https://file1.bdocx.com/fileroot1/2023-1/25/016f9f47-c7bc-47ff-85b1-ddf66d49c123/016f9f47-c7bc-47ff-85b1-ddf66d49c1231.gif)
实验一产生式系统实验
实验一:
产生式系统实验
一、实验目的:
熟悉和掌握产生式系统的运行机制,掌握基于规则推理的基本方法。
二、实验原理
产生式系统用来描述若干个不同的以一个基本概念为基础的系统,这个基本概念就是产生式规则或产生式条件和操作对。
在产生式系统中,论域的知识分为两部分:
用事实表示静态知识;用产生式规则表示推理过程和行为。
产生式系统是由一组规则组成的、能够协同作用的推理系统。
其模型是设计各种智能专家系统的基础.产生式系统主要由规则库、综合数据库和推理机三大部分组成。
本实验环境主要提供一个能够实现模拟产生式专家系统的验证、设计和开发的可视化操作平台。
学生既能用本系统提供的范例进行演示或验证性实验,也能够用它来设计并调试自己的实验模型。
三、实验条件:
1、产生式系统实验程序。
2、IE6.0以上,可以上Internet
四、实验内容:
1.对已有的产生式系统(默认的例子)进行演示,同时可以更改其规则库或(和)事实库,进行正反向推理,了解其推理过程和机制。
2.自己建造产生式系统(包括规则库和事实库),然后进行推理,即可以自己输入任何的规则和事实,并基于这种规则和事实进行推理。
这为学生亲手建造产生式系统并进行推理提供了一种有效的实验环境。
五、实验步骤:
1.定义变量,包括变量名和变量的值。
2.建立规则库,其方法是,(a)输入规则的条件:
每条规则至少有一个条件和一个结论,选择变量名,输入条件(符号);选择变量值,按确定按钮就完成了一条条件的输入。
重复操作,可输入多条条件;(b)输入规则的结论:
输入完规则的条件后,就可以输入规则的结论了,每条规则必须也只能有一个结论。
选择变量名,输入条件(符号),选择变量值,按确定按钮就完成了一个结论的输入。
重复以上两步,完成整个规则库的建立。
3.建立事实库(总数据库):
建立过程同步骤2。
重复操作,可输入多条事实。
4.然后按“开始”或“单步”按钮即可。
此外,利用实例演示,可以运行系统默认的产生式系统,并且可以进行正反向推理。
其他的可参见其帮助文件。
六、实验流程图和结果:
七、程序清单:
#include
#include
usingnamespacestd;
char*animal[]={"企鹅","海燕","鸵鸟","斑马","长颈鹿","虎","金钱豹"};
char*feature[]={"有毛","产奶","有羽毛","会飞","会下蛋","吃肉","有犬齿","有爪","眼睛盯前方","有蹄","反刍","黄褐色","有斑点",
//0123456789101112"有黑色条纹","长脖","长腿","不会飞","会游泳","黑白两色","善飞","哺乳类","鸟类","肉食类","蹄类",
//1314151617181920212223
"企鹅","海燕","鸵鸟","斑马","长颈鹿","虎","金钱豹"};
//24252627282930
typedefstruct//存放规则的结构体
{
intrelation[5];
intname;
}Rule;
Rulerule[15]={
{{0,-1},20},//规则0
{{1,-1},20},//规则1
{{2,-1},21},//规则2
{{3,4,-1},21},//规则3
{{20,5,-1},22},//规则4
{{6,7,8,-1},22},//规则5
{{20,8,-1},23},//规则6
{{20,9,-1},23},//规则7
{{22,11,12,-1},30},//规则8
{{22,11,13,-1},29},//规则9
{{23,14,15,12,-1},28},//规则10
{{23,13,-1},27},//规则11
{{21,14,15,16,-1},26},//规则12
{{21,19,-1},25},//规则13
{{21,17,18,16,-1},24}};//规则14
intflag[23]={0};//标记各个特征是否选择
intIsAnimal(inta);
intinference();
voidinput();
voidmenu();
voidmenu()
{
inti=0;
for(i=0;i<24;i++)
{
if(i%4==0&&i!
=0)
{
cout<}
printf("%-3d.%-15s",i,feature[i]);
}
}
voidinput()
{
intti=0;
for(inti=0;i<24;i++)
{
flag[i]=0;
}
while(ti!
=-1)
{
cout<<"\n输入选择(-1结束):
";
cin>>ti;
if(ti>=0&&ti<=23)
flag[ti]=1;
elseif(ti!
=-1)
{
cout<<"输入错误!
请输入0~23之间的数字!
"<cin.clear();//清除流错误错误标记
cin.sync();////////////清空输入缓冲区
}
}
}
intIsAnimal(inta)
{
if(a>=24&&a<=30)
return1;
return0;
}
intinference()//正向推理
{
intti;
inti,j;
inttres;
cout<for(i=0;i<15;i++)
{
j=0;
ti=rule[i].relation[j];
while(ti!
=-1)//-1作为结束
{
if(flag[ti]==0)
break;
j++;
ti=rule[i].relation[j];
}
if(ti==-1)//ti==-1代表规则满足
{
tres=rule[i].name;
flag[tres]=1;
printf("运用了规则%d:
",i);
j=0;
while(rule[i].relation[j]!
=-1)
{
cout<j++;
}
cout<<"====>"<if(IsAnimal(tres))
{
return1;
}
}
}
if(i==15)
{cout<<"没有这种动物";}
return-1;
}
charq;
voidmain()
{
while(q!
='n')
{
menu();
input();
inference();
cout<<"\n继续?
(Y/N)"<cin>>q;
system("cls");
}
}