#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//表示特征的结构体
typedef struct tezheng
{
int tzid;//特征id
string tz;//特征
}tezheng;
//表示规则的结构体
typedef struct guize
{
int tezhengnum;//规则所需特征数量
int tezhengs[5];//规则所需所有特征id
int result_id;//结果id
bool endresult_if;//是否能推出最终结果
bool use_if;//是否使用过
}guize;
vector<tezheng> TZK;//特征库
vector<tezheng> JGK;//结果库
vector<guize> rules;//规则库
vector<int> SS;//已知事实
//初始化特征库
void initK()
{
tezheng TEMP;
string tzs[]={"毛发","哺乳动物","产乳","羽毛","鸟类动物",
"飞行","生蛋","吃肉","食肉动物","爪子",
"利齿","眼睛前视","有蹄","有蹄动物","反刍",
"黄褐色","深色斑点","黑色条纹","长腿","长颈",
"白色","黑白色","不会飞","游水","善于飞"};
string jgs[]={"猎豹","老虎","长颈鹿","斑马","鸵鸟","企鹅","海燕"};
int num_count1=sizeof(tzs)/sizeof(tzs[0]);
int num_count2=sizeof(jgs)/sizeof(jgs[0]);
cout<<"可识别动物"<<endl;
for(int i=0;i<num_count2;i++)
{
if((i+1)%5 ==0) cout<<endl;
cout<<i+1<<"."<<jgs[i]<<" ";
}
cout<<endl<<"特征"<<endl;
for(int i=0;i<num_count1;i++)
{
if((i+1)%5 ==0) cout<<endl;
cout<<i+1<<"."<<tzs[i]<<" ";
}
//特征库初始化
for(int i=0;i<num_count1;i++)
{
TEMP.tzid = i+1;
TEMP.tz = tzs[i];
TZK.push_back(TEMP);
}
//结果库初始化
for(int i=0;i<num_count2;i++)
{
TEMP.tzid = i+1;
TEMP.tz = jgs[i];
JGK.push_back(TEMP);
}
}
//初始化规则库
void initRule()
{
int Rule_num = 15;
guize G1;
int r1[]={1,1,1,2,2,4,3,2,3,3,5,3,4,3,2};
int r2[][5]={{1},{3},{4},{6,7},{2,8},{2,10,11,12},{2,13,14},{2,15},{9,16,17},{9,16,18},{14,16,17,19,20},{14,18,21},{5,19,20,23},{5,23,24},{5,25}};
int r4[]={2,2,5,5,9,9,14,14,1,2,3,4,5,6,7};
bool r5[]={false,false,false,false,false,false,false,false,true,true,true,true,true,true,true};
for(int i=0;i<Rule_num;i++)
{
G1.tezhengnum = r1[i];
for(int j=0;j<r1[i];j++)
{
G1.tezhengs[j]=r2[i][j];}
G1.result_id = r4[i];
G1.endresult_if = r5[i];
G1.use_if = false;
rules.push_back(G1);
}
}
//更新事实库
void update(vector<int> a)//a:遍历规则后得到的数组
{
int asize=a.size();
for(int i=0;i<asize;i++)
{
SS.push_back(a[i]+1);
}
sort(SS.begin(), SS.end());
}
//匹配规则,将结论得到的id存储,进行事实库更新,return 0 代表未搜索到最终结果
int comparerules(vector<int> a,vector<int> b)//a:已知事实库 b:中间结果库
{
int asize = a.size();
int bsize = rules.size();
for(int j=0;j< bsize;j++)//遍历规则
{
if(!rules[j].use_if)//未使用
{
int pos = 0;//匹配个数
if(asize>=rules[j].tezhengnum)//足够规则数量
{
for(int k=0;k<rules[j].tezhengnum;k++)
{
for(int i=0;i<asize;i++)
{
if(rules[j].tezhengs[k] == a[i])//匹配前提
{
++pos;
}
}
}
if( pos == rules[j].tezhengnum)//全部匹配
{
int x=rules[j].result_id-1;
rules[j].use_if=true;
if(rules[j].endresult_if)
{
cout<<"查找成功:"<<JGK[x].tz<<endl;
return 1;}
else{b.push_back(x);}
}
}
}
}
update(b);
return 0;
}
int main()
{
//初始化特征库 打印特征库 初始化结果库 打印结果
initK();
//初始化规则库
initRule();
cout<<endl<<"输入已知事实,0代表输入结束"<<endl;
int inputss;
while(cin>>inputss)//输入事实
{
if(inputss==0) break;
else {int temp = inputss;SS.push_back(temp);}
}
sort(SS.begin(), SS.end());//排序
bool exit_if = false;
while(!exit_if)
{
//规则匹配
int endresult=0;
endresult=comparerules(SS,ZJ);
if(!endresult)
{
cout<<"未能搜索到结果,已知事实如下:"<<endl;
for (vector<int>::iterator it = SS.begin(); it != SS.end(); it++)
{
cout << *it << TZK[*it -1].tz << endl;
}
int patternif=1;
while(patternif)
{
cout<<"请选择是否添加事实(y/Y or n/N):"<<endl;
char addif;
cin>>addif;
if(addif=='n' || addif =='N') {cout<<"本次查找失败!"<<endl;exit_if=true;patternif=0;}
else if(addif=='y' || addif =='Y')
{
patternif=0;
cout<<"输入事实,0代表输入结束"<<endl;
while(cin>>inputss)//输入事实
{
if(inputss==0) break;
else {int temp = inputss;SS.push_back(temp);}
}
sort(SS.begin(), SS.end());//排序
comparerules(SS,ZJ);
}
else cout<<"格式错误,请重新输入"<<endl;
}
}
else{exit_if=true;}
}
return 0;
}