产生式系统

产生式系统

       产生式系统用来描述若干个不同的以一个基本概念为基础的系统,这个基本概念就是产生式规则或产生式条件和操作对。在产生式系统中,论域的知识分为两部分:用事实表示静态知识;用产生式规则表示推理过程和行为。

1.自己建造产生式系统(包括规则库和事实库),然后进行推理,即可以自己输入任何的事实,并基于原有的规则和输入的事实进行推理。

2.建造动物识别系统,能根据输入的动物特征判断是那种动物或给出相应的回答。

3.算法设计

①首先建立事实库

事实库是在程序的开始直接输入的,用户根据需要选择,即要求用户先输入特征个数,然后输入动物的特征,进行识别。如果未识别出来,则可以重新选择,或者退出。

动物的特征如下:

1有奶 2有毛发 3有羽毛 4会飞 5生蛋 6有爪 7有犬齿 

8目盯前方 9吃肉 10有蹄 11反刍食物 12黄褐色 13黑色条纹

14黑色斑点 15长腿 16长脖子 17暗斑点 18白色 19不会飞

    20黑白色 21会游泳 22善飞 23不怕风浪

    24哺乳动物 25鸟 26食肉动物 27有蹄动物 28偶蹄动物

    29海燕 30老虎 31金钱豹 32长颈鹿 33斑马 34鸵鸟 35企鹅

②建立静态规则库

即建立产生式规则,本算法采用了产生中间事实的方法,便于建立和使用规则。为了便于设计,我们把要识别的动物限于7种,这样所需要的产生式规则就比较少。本算法共有15种规则,如下:

R1: 如果动物有奶,则它是哺乳动物

R2: 如果动物有毛发,则它是哺乳动物

R3: 如果动物有羽毛,则它是鸟

R4: 如果动物会飞且生蛋,则它是鸟

R5: 吃肉的哺乳动物是食肉动物

R6: 有爪有犬齿木钉前方的哺乳动物是食肉动物

R7: 有蹄的哺乳动物是有蹄动物

R8: 反刍食物的有蹄动物是偶蹄动物

R9: 黄褐色有黑条纹的食肉动物是老虎

R10:黄褐色有黑色斑点的食肉动物是金钱豹

R11:长腿长脖子有黄褐色暗斑点的有蹄动物是长颈鹿

R12:有黑白条纹的有蹄动物是斑马

R13:不会飞长腿长脖的鸟是鸵鸟

R14:不会飞会游泳黑白色的鸟是企鹅

R15:善飞不怕风浪的鸟是海燕

具体表示如下:

R1:  1->24

R2:  2->24

R3:  3->25

R4:  4*5->25

R5:  6*7*8*24->26

R6:  9*24->26

R7:  10*24->27

R8:  11*27->28

R9:  12*13*24->30

R10: 12*14*24->31

R11: 12*15*16*17*27->32

R12: 13*18*27->33

R13: 15*16*19*25->34

R14: 19*20*21*25->35

R15: 22*23*25->29

③正向推理过程

(1)将初始事实数据置入动态数据库。

(2)用动态数据库中的事实匹配目标条件,若目标条件满足,推理成功,结束。

(3)用规则库中各规则的前提匹配动态数据库中的事实,将匹配成功的规则前提移除数据动态库,并将匹配成功的规

(4)若待用规则集为空,则运行失败,退出。

(5)将待用规则集中各规则移出,并将结论加入动态数据库,或者执行其动作,转步(2)

如有多条匹配规则需从中选一条作为使用规则,本算法是根据规则的顺序依次选择,且规则中不存在同一组事实对应多条匹配规则。

④流程图

⑤测试结果及分析

本系统的规则库是静态的,不能动态增加新的规则。这使得在规则变化的情况下不能及时改变,但是该系统已经能基本满足需要,对输入的事实能给出相应的回答,判断出是何种动物。

代码:

#include<stdio.h>
#define N 23
int main(void)
{
	int i,j,k,a,b,c;
 	int num;
 	int fact[N],temp[N];
 	int flag=1;
 	while(flag==1)
 	{
 		printf(" 动物的特征如下 :\n");
 		printf("1 有奶  2 有毛发  3 有羽毛  4 会飞  5 生蛋 \n6 有爪  7 有犬齿  8 目盯前方  9 吃肉  10 有蹄 \n11 反刍食物  12 黄褐色  13 黑色条纹  14 黑色斑点  15 长腿 \n16 长脖子  17 暗斑点  18 白色  19 不 会飞  20 黑白色 \n21 会游泳  22 善飞  23 不怕风浪 \n");
 		printf(" 请输入描述该动物特征的个数 :");
 		scanf("%d",&num);
 		printf(" 请输入对这只动物的特征描述的序号 ( 按序号由小到大 ):\n");
 		for(i=0;i<num;i++)
 		{
   			scanf("%d",&a);
   			fact[i]=a;
 		}
 //******************************** 
  		for(i=0;i<num;i++)
 		{
   			if(fact[i]==1)
   			{
     			fact[num]=24;
    			num++;
     			printf(" 使用规则 1, 新增加的事实为 :  哺乳动物 \n");
     			break;
   			}
 		}
 //********************************  
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==2)
   			{
     			fact[num]=24;
     			num++;
     			printf(" 使用规则 2, 新增加的事实为 :  哺乳动物 \n");
     			break;
   			}
 		}
 //********************************  
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==3)
   			{
     			fact[num]=25;
     			num++;
     			printf(" 使用规则 3, 新增加的事实为 : 鸟 \n");
     			break;
   			}
 		}
 //********************************  
 		k=0;
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==4)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==5)
   			{
     			temp[k]=fact[i];
     			break;
   			}
 		}
 		if(temp[0]==4&&temp[1]==5)
 		{
   			fact[num]=25;
   			num++;
   			printf(" 使用规则 4, 新增加的事实为 : 鸟 \n");
 		}
 //******************************** 
 		k=0;
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==6)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==7)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==8)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==24)
  	 		{
     			temp[k]=fact[i];
     			break;
   			}
 		}
 		if(temp[0]==6&&temp[1]==7&&temp[2]==8&&temp[3]==24)
 		{
   			fact[num]=26;
   			num++;
   			printf(" 使用规则 5, 新增加的事实为 : 食肉动物 \n");
 		}
 //********************************  
 		k=0;
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==9)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==24)
   			{
     			temp[k]=fact[i];
     			break;
   			}
 		}
 		if(temp[0]==9&&temp[1]==24)
 		{
   			fact[num]=26;
   			num++;
   			printf(" 使用规则 6, 新增加的事实为 : 食肉动物 \n");
 		}
 //********************************  
 		k=0;
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==10)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==24)
   			{
     			temp[k]=fact[i];
     			break;
   			}
 		}
 		if(temp[0]==10&&temp[1]==24)
 		{
   			fact[num]=27;
   			num++;
   			printf(" 使用规则 7, 新增加的事实为 : 有蹄动物 \n");
 		}
 //********************************  
 		k=0;
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==11)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}	
   			if(fact[i]==27)
   			{
     			temp[k]=fact[i];
     			break;
   			}
 		}
 		if(temp[0]==11&&temp[1]==27)
 		{
   			fact[num]=28;
   			num++;
   			printf(" 使用规则 8, 新增加的事实为 : 偶蹄动物 \n");
 		}
 //********************************  
 		k=0;
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==12)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==13)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==24)
   			{
     			temp[k]=fact[i];
     			break;
   			}
 		}
 		if(temp[0]==12&&temp[1]==13&&temp[2]==24)
 		{
   			fact[num]=30;
   			//
			num++;
   			printf(" 使用规则 9, 新增加的事实为 : 老虎 \n 该动物为老虎 \n");
 		}
 //********************************  
 		k=0;
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==12)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==14)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==24)
   			{
     			temp[k]=fact[i];
     			break;
   			}
 		}
 		if(temp[0]==12&&temp[1]==14&&temp[2]==24)
 		{
   			fact[num]=31;
   			//
			num++;
   			printf(" 使用规则 10, 新增加的事实为 : 金钱豹 \n 该动物为金钱豹 \n");
 		}
 //********************************  
 		k=0;
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==12)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==15)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==16)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==17)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==27)
   			{
     			temp[k]=fact[i];
     			break;
   			}
 		}
 		if(temp[0]==12&&temp[1]==15&&temp[2]==16&&temp[3]==17&&temp[4]==27)
 		{
   			fact[num]=32;
   			//
			num++;
   			printf(" 使用规则 11, 新增加的事实为 : 长颈鹿 \n 该动物为长颈鹿 \n");
 		}
 //********************************  
 		k=0;
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==13)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==18)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==27)
   			{
     			temp[k]=fact[i];
     			break;
   			}
 		}
 		if(temp[0]==13&&temp[1]==18&&temp[2]==27)
 		{
   			fact[num]=33;
   			//
			num++;
   			printf(" 使用规则 12, 新增加的事实为 : 斑马 \n 该动物为斑马 \n");
 		}
 //********************************  
 		k=0;
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==15)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==16)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==19)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==25)
   			{
     			temp[k]=fact[i];
     			break;
   			}
 		}
 		if(temp[0]==15&&temp[1]==16&&temp[2]==19&&temp[3]==25)
 		{
   			fact[num]=34;
   			//
			num++;
  	 		printf(" 使用规则 13, 新增加的事实为 : 鸵鸟 \n 该动物为鸵鸟 \n");
 		}
 //********************************  
 		k=0;
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==19)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==20)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==21)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==25)
   			{
     			temp[k]=fact[i];
     			break;
   			}
 		}
 		if(temp[0]==19&&temp[1]==20&&temp[2]==21&&temp[3]==25)
 		{
   			fact[num]=35;
   			//
			num++;
   			printf(" 使用规则 14, 新增加的事实为 : 企鹅 \n 该动物为企鹅 \n");
 		}
 //********************************  
 		k=0;
 		for(i=0;i<num;i++)
 		{
   			if(fact[i]==22)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==23)
   			{
     			temp[k]=fact[i];
     			k++;
     			continue;
   			}
   			if(fact[i]==25)
   			{
     			temp[k]=fact[i];
     			break;
   			}
 		}
 		if(temp[0]==22&&temp[1]==23&&temp[2]==25)
 		{
   			fact[num]=29;
   			//
			num++;
  	 		printf(" 使用规则 15, 新增加的事实为 : 海燕 \n 该动物为海燕 \n");
 		}
 //********************************  
 		if(fact[num]<29)
   			printf(" 现有事实无法推断出结果 !\n");
 		printf("\n");
 		printf(" 继续请按 1, 退出按其它数字键 :");
 		scanf("%d",&c);
 		if(c==1) 
   			flag=c;
 		else 
		 	break;
 	}
 	return 0;
}

 

 

 

  • 12
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值