1、实验目的
理解和掌握产生式系统的推理方法,能够用选定的编程语言实现推理机。
2、实验内容和要求
(1)以实验1的动物识别系统的规则库和综合数据库为基础;
(2)用选定的编程语言开发一个推理机,该推理机能利用实验1的规则库和综合数据库进行推理。
话不多说,直接上代码
C++版本
运行截图
#include #include #include #include #include using namespace std; const int fact_num = 31; //知识库中的知识:31种知识 const int rule_num = 15; //知识库中的规则:15条规则 const int rule_volume = 4; //规则中每个结果最多有4个前提条件 const int object_range_begin = 25; //从第25个知识开始 const int object_range_end = 31; //到第31个知识为目标结论 const int object_middle_begin = 21; //中间结果起始位置 string fact[fact_num] = {
"有毛发","产奶","有羽毛","会飞","会下蛋", "吃肉","有犬齿","有爪","眼盯前方","有蹄", "反刍","黄褐色","有斑点","有黑色条纹","长脖", "长腿","不会飞","会游泳","黑白二色","善飞", "哺乳类","鸟类","食肉类","蹄类","金钱豹", "虎","长颈鹿","斑马","鸵鸟","企鹅","信天翁" }; int rule_prerequisite[rule_num][rule_volume] = {
{
1,0,0,0}, {
2,0,0,0}, {
3,0,0,0}, {
4,5,0,0}, {
21,6,0,0}, {
7,8,9,0}, {
21,10,0,0}, {
21,11,0,0}, {
23,12,13,0}, {
23,12,14,0}, {
24,15,16,13}, {
24,14,0,0}, {
22,15,16,4}, {
22,18,19,4}, {
22,20,0,0} }; int rule_result[rule_num] = {
21, 21, 22, 22, 23, 23, 24, 24, 25, 26, 27, 28, 29, 30, 31 }; bool backward_reasoning(int num,int message[]) ; bool inference(int num,int message[]) //迭代推理机{
int ii, ij, ik,im,in; int hit_num = 0; //输入前提也规则前提重合数 int prerequisite_num; //规则前提数 int *message_c; //迭代前提 int num_c; //迭代前提数量 for (ik = 0; ik < num; ik++) //剪枝函数 {
if (message[ik] >= object_range_begin&&message[ik] <= object_range_end) {
cout << "归并信息:" << fact[message[ik] - 1] << endl; cout << "推理成功!" << endl<<endl; system("pause"); exit(0); } } for (ii = 0; ii < rule_num; ii++) //遍历规则匹配 {
prerequisite_num = 0; hit_num = 0; for (ij = 0; ij < rule_volume; ij++) //计算规则集前提数 {
if (rule_prerequisite[ii][ij] == 0) {
break; } prerequisite_num++; } for (ij = 0; ij < prerequisite_num; ij++) {
for (ik = 0; ik < num; ik++) {
if (rule_prerequisite[ii][ij] == message[ik]) {
hit_num++; } } } if (hit_num == prerequisite_num) //满足某个规则集全部前提 {
bool flag; for (ik = 0; ik < num; ik++) {
if (message[ik] == rule_result[ii]) {
break; } } if (ik == num) {
num_c=num - hit_num+1; flag = true; } else {
num_c = num - hit_num; flag = false; } message_c = new int[num_c]; in = 0; for (ik = 0; ik < num; ik++) {
for (im = 0; im < hit_num; im++) {
if (rule_prerequisite[ii][im] == message[ik]) {
break; } } if (im < hit_num) {
continue; } message_c[in++] = message[ik]; } if (flag == true) {
message_c[in] = rule_result[ii]; } cout << "推导信息:"; for