人工智能产生式系统实验报告资料文档格式.docx
《人工智能产生式系统实验报告资料文档格式.docx》由会员分享,可在线阅读,更多相关《人工智能产生式系统实验报告资料文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
![人工智能产生式系统实验报告资料文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/24/5c4cd96d-7f07-4a95-b3b2-981ce46133fb/5c4cd96d-7f07-4a95-b3b2-981ce46133fb1.gif)
建立静态规则库
即建立产生式规则,本算法采用了产生中间事实的方法,便于建立和使用规则。
为了便于设计,我们把要识别的动物限于7种,这样所需要的产生式规则就比较少。
本算法共有15种规则,如下:
R1:
如果动物有奶,则它是哺乳动物
R2:
如果动物有毛发,则它是哺乳动物
R3:
如果动物有羽毛,则它是鸟
R4:
如果动物会飞且生蛋,则它是鸟
R5:
吃肉的哺乳动物是食肉动物
R6:
有爪有犬齿木钉前方的哺乳动物是食肉动物
R7:
有蹄的哺乳动物是有蹄动物
R8:
反刍食物的有蹄动物是偶蹄动物
R9:
黄褐色有黑条纹的食肉动物是老虎
R10:
黄褐色有黑色斑点的食肉动物是金钱豹
R11:
长腿长脖子有黄褐色暗斑点的有蹄动物是长颈鹿
R12:
有黑白条纹的有蹄动物是斑马
R13:
不会飞长腿长脖的鸟是鸵鸟
R14:
不会飞会游泳黑白色的鸟是企鹅
R15:
善飞不怕风浪的鸟是海燕
具体表示如下:
1->
24
2->
3->
25
4*5->
6*7*8*24->
26
9*24->
10*24->
27
11*27->
28
12*13*24->
30
12*14*24->
31
12*15*16*17*27->
32
13*18*27->
33
15*16*19*25->
34
19*20*21*25->
35
22*23*25->
29
正向推理过程
从已知事实出发,通过规则库求得结论,或称数据驱动方式。
推理过程是:
Ø
规则集中的规则前件与事实库中的事实进行匹配,得匹配的规则集合。
从匹配规则集合中选择一条规则作为使用规则。
执行使用规则的后件,将该使用规则的后件送入事实库中。
重复这个过程直至达到目标。
如有多条匹配规则需从中选一条作为使用规则,本算法是根据规则的顺序依次选择,且规则中不存在同一组事实对应多条匹配规则。
实验流程图
实验结果及分析
如输入如下事实:
有羽毛、善飞、不怕风浪。
系统的推理过程如下:
先从规则库中取出第一条规则R1,检查其前提是否可与事实库中的已知事实相匹配。
R1的前提是“有奶”,但事实库中无此事实,故匹配失败;
然后取R2,匹配失败;
接着取R3,该前提与已知事实“有羽毛”相匹配,故R3被执行,并将其结论“鸟”作为新的事实加入到事实库中。
此时,事实库的内容变为:
有羽毛、善飞、不怕风浪、鸟;
此后,R4~R14均匹配失败,接着取R15,该前提“善飞+不怕风浪+鸟”与已知事实相匹配,R15被执行,并推出“该动物是海燕”。
由于“海燕”已是目标集合中的一个结论,即已推出最终结果,故问题求解过程结束。
下面是程序运行的结果:
【实验程序】
#include<
stdio.h>
#defineN23
voidmain()
{
inti,j,k,a,b,c;
intnum;
intfact[N],temp[N];
intflag=1;
while(flag==1)
{
printf("
动物的特征如下:
\n"
);
1有奶2有毛发3有羽毛4会飞5生蛋\n6有爪7有犬齿8目盯前方9吃肉10有蹄\n11反刍食物12黄褐色13黑色条纹14黑色斑点15长腿\n16长脖子17暗斑点18白色19不会飞20黑白色\n21会游泳22善飞23不怕风浪\n"
请输入描述该动物特征的个数:
"
scanf("
%d"
&
num);
请输入对这只动物的特征描述的序号(按序号由小到大):
for(i=0;
i<
num;
i++)
scanf("
a);
fact[i]=a;
}
//********************************for(i=0;
if(fact[i]==1)
{
fact[num]=24;
num++;
printf("
使用规则1,新增加的事实为:
哺乳动物\n"
break;
}
if(fact[i]==2)
使用规则2,新增加的事实为:
if(fact[i]==3)
fact[num]=25;
使用规则3,新增加的事实为:
鸟\n"
//********************************k=0;
if(fact[i]==4)
temp[k]=fact[i];
k++;
continue;
if(fact[i]==5)
if(temp[0]==4&
&
temp[1]==5)
fact[num]=25;
num++;
printf("
使用规则4,新增加的事实为:
if(fact[i]==6)
if(fact[i]==7)
if(fact[i]==8)
if(fact[i]==24)
if(temp[0]==6&
temp[1]==7&
temp[2]==8&
temp[3]==24)
fact[num]=26;
使用规则5,新增加的事实为:
食肉动物\n"
if(fact[i]==9)
if(temp[0]==9&
temp[1]==24)
使用规则6,新增加的事实为:
if(fact[i]==10)
if(temp[0]==10&
fact[num]=27;
使用规则7,新增加的事实为:
有蹄动物\n"
if(fact[i]==11)
if(fact[i]==27)
if(temp[0]==11&
temp[1]==27)
fact[num]=28;
使用规则8,新增加的事实为:
偶蹄动物\n"
if(fact[i]==12)
if(fact[i]==13)
if(temp[0]==12&
temp[1]==13&
temp[2]==24)
fact[num]=30;
//num++;
使用规则9,新增加的事实为:
老虎\n该动物为老虎\n"
if(fact[i]==14)
temp[1]==14&
fact[num]=31;
使用规则10,新增加的事实为:
金钱豹\n该动物为金钱豹\n"
if(fact[i]==15)
if(fact[i]==16)
if(fact[i]==17)
temp[1]==15&
temp[2]==16&
temp[3]==17&
temp[4]==27)
fact[num]=32;
使用规则11,新增加的事实为:
长颈鹿\n该动物为长颈鹿\n"
if(fact[i]==18)
if(temp[0]==13&
temp[1]==18&
temp[2]==27)
fact[num]=33;
使用规则12,新增加的事实为:
斑马\n该动物为斑马\n"
if(fact[i]==19)
if(fact[i]==25)
if(temp[0]==15&
temp[1]==16&
temp[2]==19&
temp[3]==25)
fact[num]=34;
使用规则13,新增加的事实为:
鸵鸟\n该动物为鸵鸟\n"
if(fact[i]==20)
if(fact[i]==21)
if(temp[0]==19&
temp[1]==20&
temp[2]==21&
fact[num]=35;
使用规则14,新增加的事实为:
企鹅\n该动物为企鹅\n"
if(fact[i]==22)
if(fact[i]==23)
if(temp[0]==22&
temp[1]==23&
temp[2]==25)
fact[num]=29;
使用规则15,新增加的事实为:
海燕\n该动物为海燕\n"
//********************************if(fact[num]<
29)
现有事实无法推断出结果!
继续请按1,退出按其它数字键:
c);
if(c==1)
flag=c;
elsebreak;
}
【小结或讨论】
本系统的规则库是静态的,不能动态增加新的规则。
这使得在规则变化的情况下不能及时改变,但是该系统已经能基本满足需要,对输入的事实能给出相应的回答,判断出是何种动物。