⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dwsb.cpp

📁 这个系统是人工智能产生式实验:动物识别系统。给大家参考下
💻 CPP
字号:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<iomanip.h>

struct cause{
	int cau;
	cause *next;
} *datacause;

struct rule{
	int used; //标志规则是否已用    
	int result;//标志规则推出的结论;  
	int flag;//标志是否为终止性规则
	int count;//标志规则所含前提的个数
	cause *causep;// 规则的事实即前提部分
	rule *next;  // 指向下一条规则
} *knorule=NULL;

void list();
void input_rule();
void input();
void output(cause *cp,rule *rp);
bool match(cause *cp,rule *rp);
bool  newcause(cause *cp,rule *rp);
//各函数的声明

void main()
{
	input_rule();
	list();
  //while(1){
	input();
	cout<<"正在进行推理........"<<endl;
	rule *head1=knorule;
	cause *head2=datacause;
	while(knorule)
	{
		if(knorule->used==1)
			knorule=knorule->next;
			else if(match(datacause,knorule))
					if(knorule->flag==1)
					{
					cout<<"你所要识别的动物是:"<<endl;
					switch(knorule->result)
					{
					case 24:cout<<"猎豹"<<endl;break;
					case 25:cout<<"老虎"<<endl;break;
					case 26:cout<<"长颈鹿"<<endl;break;
					case 27:cout<<"斑马"<<endl;break;
					case 28:cout<<"鸵鸟"<<endl;break;
					case 29:cout<<"企鹅"<<endl;break;
					case 30:cout<<"海燕"<<endl;break;
					}
	
					cout<<"☆★ 成功 ☆★"<<endl;
					break;
					}
				else if(newcause(datacause,knorule))
				{
					cout<<"产生了一个中间事实!!!"<<endl;
					cause *cp=new cause;
					cp->cau=knorule->result;
					cp->next=datacause;
					datacause=cp;
					knorule=head1;
					//exit(1);
				}	
					 else	knorule=knorule->next;
			else knorule=knorule->next;
		}
	if(knorule==NULL)
		cout<<"很抱歉,没有找到你要识别的动物"<<endl;
	//  }

	cout<<endl<<endl;

}
void list()
{   
    cout<<"********************************************************************************"<<endl;
    cout<<"                   "<<"☆★☆★☆★  ~_~  ~_~  ~_~  ☆★☆★☆★"<<endl<<endl;
    cout<<"                         "<<"☆★欢迎使用动物识别系统☆★"<<endl<<endl;
    cout<<"           "<<"☆★选择你所需要匹配的事实,动物识别系统的事实如下所示:☆★"<<endl;
	cout<<endl;
	cout<<setiosflags(ios::left);
	cout<<setw(15)<<"1 有毛发";
	cout<<setw(15)<<"2 有奶";
	cout<<setw(15)<<"3 有羽毛";
	cout<<setw(15)<<"4 会飞或善飞";
	cout<<setw(15)<<"5 会下蛋"<<endl;
	cout<<setiosflags(ios::left);
	cout<<setw(15)<<"6 会吃肉";
	cout<<setw(15)<<"7 有犬齿";
	cout<<setw(15)<<"8 有爪";
	cout<<setw(15)<<"9 眼盯前方";
	cout<<setw(15)<<"10 是哺乳动物"<<endl;
	cout<<setiosflags(ios::left);
	cout<<setw(15)<<"11 有蹄";
	cout<<setw(15)<<"12 会反刍";
	cout<<setw(15)<<"13 是食肉动物";
	cout<<setw(15)<<"14 是黄褐色";
	cout<<setw(15)<<"15 有暗斑点"<<endl;
	cout<<setiosflags(ios::left);
	cout<<setw(15)<<"16 有黑色条纹";
	cout<<setw(15)<<"17 有长脖子";
	cout<<setw(15)<<"18 有长腿";
	cout<<setw(15)<<"19 不会飞";
	cout<<setw(15)<<"20 有黑白二色"<<endl;
	cout<<setiosflags(ios::left);
	cout<<setw(15)<<"21 会游泳";
	cout<<setw(15)<<"22 是鸟";
	cout<<setw(15)<<"23 有蹄动物"<<endl<<endl;
	cout<<"       "<<"☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl<<endl;
    cout<<"********************************************************************************"<<endl<<endl;

}
void input()
{
	int m;
	cause *cp;
	datacause=NULL;
	cout<<"请输入你所要识别的动物的特征, 以0结束:"<<endl;
	cin>>m;
	while(1)
	{
		if(m==0)
			break;
		cp=new cause;
		cp->cau=m;
		cp->next=datacause;
		datacause=cp;
		cin>>m;
	}
}
void input_rule()  //从rule.txt文中读入规则
{
	cause *cp=NULL;
	rule  *rp=NULL;
	int j,n;
	ifstream fp("rule.txt",ios::in|ios::nocreate);
	if(!fp){
		cerr<<"rule.txt file not open!"<<endl;
		exit(1);
	}
	while(fp>>n)  
	{   
		j=n;
		rp=new rule;
		rp->causep=NULL;
		rp->count=j;
		rp->used=0;
		for(int i=1;i<=j;i++)
		{
			fp>>n; 
			cp=new cause;
			cp->cau=n;
			cp->next=rp->causep;
			rp->causep=cp;
		}
		fp>>n;
		rp->result=n;
		fp>>n;
		rp->flag=n;
		rp->next=knorule;
		knorule=rp;
	}
	fp.close() ;
}


void output(cause *cp,rule *rp) //输出函数
{
	while(rp){
		while(rp->causep){
			cout<<rp->causep->cau<<" ";
			rp->causep=rp->causep->next;
		}
	    cout<<rp->flag<<endl;
		rp=rp->next;
	}
	while(cp){
		cout<<cp->cau<<" ";
		cp=cp->next;
	}
	cout<<endl;
} 

bool match(cause *cp,rule *rp)  //匹配函数
{
	int i=0;
	rp->used=1;
	while(cp)
	{
		cause *cp1=rp->causep;
		while(cp1)
		{
			if(cp->cau==cp1->cau)
			{
				i=i+1;
				break;
			}
			cp1=cp1->next;
		}
		cp=cp->next;
	}
		if(i==rp->count)
			return true;
	return false;
}

bool newcause(cause *cp,rule *rp)
{
	while(cp)
	{
		if(cp->cau==rp->result)
			return 0;
		cp=cp->next;
	}
	return 1;
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -