string m_facts[24] = { “毛发”,“哺乳动物”,“有奶”,“羽毛”,“鸟”,
“会飞”,“生蛋”,“吃肉”,“食肉动物”,“有爪”,
“犀利牙齿”,“眼向前方”,“有蹄”,“蹄类动物”,“反刍”,
“黄褐色”, “暗斑点”, “黑色条纹”,“长腿”,“长颈”,
“黑白色”, “不会飞”, “会游泳”,“善飞” };
string m_animal[7] = { “豹”,“虎”,“长颈鹿”,“斑马”,“鸵鸟”,“企鹅”,“信天翁” };
string m_code[31] = { “毛发”,“哺乳动物”,“有奶”,“羽毛”,“鸟”,
“会飞”,“生蛋”,“吃肉”,“食肉动物”,“有爪”,
“犀利牙齿”,“眼向前方”,“有蹄”,“蹄类动物”,“反刍”,
“黄褐色”, “暗斑点”, “黑色条纹”,“长腿”,“长颈”,
“黑白色”, “不会飞”, “会游泳”,“善飞”, “豹”,“虎”,
“长颈鹿”,“斑马”,“鸵鸟”,“企鹅”,“信天翁” };
运行截图:
代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Rule {
public:
int tezhengnum;//规则所需特征数量
int tezhengs[5];//规则所需所有特征id
int result_id;//结果id
bool endresult_if;//是否能推出最终结果
bool use_if;//是否使用过
};
vector<Rule> rules;//规则库
vector<int> SS;//已知事实
vector<int> ZJ;//中间事实
class AnimalData {
public:
string m_facts[24] = { "毛发","哺乳动物","有奶","羽毛","鸟",
"会飞","生蛋","吃肉","食肉动物","有爪",
"犀利牙齿","眼向前方","有蹄","蹄类动物","反刍",
"黄褐色", "暗斑点", "黑色条纹","长腿","长颈",
"黑白色", "不会飞", "会游泳","善飞" };
string m_animal[7] = { "豹","虎","长颈鹿","斑马","鸵鸟","企鹅","信天翁" };
string m_code[31] = { "毛发","哺乳动物","有奶","羽毛","鸟",
"会飞","生蛋","吃肉","食肉动物","有爪",
"犀利牙齿","眼向前方","有蹄","蹄类动物","反刍",
"黄褐色", "暗斑点", "黑色条纹","长腿","长颈",
"黑白色", "不会飞", "会游泳","善飞", "豹","虎",
"长颈鹿","斑马","鸵鸟","企鹅","信天翁" };
int num_animal = 7;
int num_facts = 24;
int num_code = 31;
void print_animal(int a); // 0 打印动物 1 打印特征 2打印编码
};
void AnimalData::print_animal(int a)
{
// 0 打印动物 1 打印特征 2打印编码
cout << endl;
if (a == 0) {
cout << "可识别动物" << endl;
for (int i = 0; i < num_animal; i++)
{
if ((i + 1) % 5 == 0) cout << endl;
cout << i + 1 << "." << m_animal[i] << " ";
}
}
else if (a == 1) {
cout << "特征" << endl;
for (int i = 0; i < num_facts; i++)
{
if ((i + 1) % 5 == 0) cout << endl;
cout << i + 1 << "." << m_facts[i] << " ";
}
}
else {
cout << "编码" << endl;
for (int i = 0; i < num_code; i++)
{
if ((i + 1) % 5 == 0) cout << endl;
cout << i + 1 << "." << m_code[i] << " ";
}
}
cout << endl;
}
//更新事实库
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)
{
AnimalData a;
cout << "查找成功:" << a.m_code[x] << endl;
return 1;
}
else {
int flag = 0;
for (int i = 0; i < b.size(); i++)
{
if (b[i] == x) {
flag = 1;
}
}
if (flag == 0) {
b.push_back(x);
}
}
}
}
}
}
update(b);
return 0;
}
int main()
{
//初始化animaldata类
AnimalData data;
data.print_animal(0);
data.print_animal(1);
//初始化规则库
int Rule_num = 15;
Rule G1;
int r1[15] = { 1,1,1,2,1,
3,2,2,4,4,
4,2,5,4,2 };
int r2[][5] = { {1},{3},{4},{6,7},{8},
{10,11,12},{2,13},{2,15},{2,9,16,17},{2,9,16,18},
{14,17,19,20},{14,18},{5,19,20,21,22},{5,21,22,23},{5,24} };
int r4[] = { 2,2,5,5,9,
9,14,14,25,26,
27,28,29,30,31 };
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);
}
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 << data.m_code[*it - 1] << 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;
}