实现思路总结:
该程序通过规则推理系统实现了一个简单的知识推理引擎,核心目标是根据已有事实和规则库中的规则,不断推导出新的结论,直到得出最终结论或无法继续推理为止。
1. 规则(Rule)类:
- 规则类是推理引擎的核心部分,每条规则包含:
- 前提条件(
pre
):该规则的前提条件(即规则生效所需的事实)。是一个字符串列表,表示多个条件。 - 结论(
nxt
):如果所有前提条件成立,则推导出的结论。 - 是否为最终结论(
finish
):布尔值,用于标识该规则的结论是否为最终结论。如果是最终结论,推理停止。
- 前提条件(
isApplicable
方法:检查当前规则的前提条件是否全部满足事实库中的事实。如果满足,返回true
,规则可应用。
2. 规则库(RuleBank)类:
- 存储所有规则。采用
list<Rule>
类型来保存规则,因为list
支持高效的插入和删除操作。 addRule
方法:向规则库中添加规则。
3. 事实(Fact)类:
- 存储事实库,使用
set<string>
来避免重复事实。事实库中存储的每个事实可以是任意字符串。 addFact
方法:将新的事实加入事实库。hasFact
方法:检查事实库中是否已经存在某个事实。
4. 推理引擎:
- 主程序 (
main
函数) 中实现了推理引擎的核心逻辑。程序不断遍历规则库,检查每条规则的前提条件是否成立。如果某条规则的前提条件成立且结论尚未存在于事实库中,则将结论加入事实库,并输出推导出的新事实。 - 若推导出新的事实,程序会继续推理,直到推导出最终结论或无法推导出更多事实为止。
- 最终结论:一旦推导出标记为最终结论的事实,程序会终止并输出该结论。
5. 推理过程的终止:
- 程序的推理过程在两种情况下终止:
- 得到最终结论:如果某条规则的结论标记为最终结论(
finish == true
),程序立即输出该结论并终止。 - 无法推导出新的结论:如果在某次推理循环中没有推出新的事实,程序会输出无法继续推理的信息,并终止。
- 得到最终结论:如果某条规则的结论标记为最终结论(
6. 算法流程:
- 初始化事实库,并根据需求将初始事实添加进去。
- 创建规则库,添加若干规则。每条规则包含前提条件、结论和是否为最终结论的信息。
- 进入推理循环,遍历规则库:
- 对每条规则,检查它是否可以应用(即前提条件是否已经存在于事实库中)。
- 如果可以应用且结论尚未在事实库中,则将结论加入事实库,并继续进行下一轮推理。
- 如果推理出最终结论,则输出该结论并退出。
- 如果无法推理出新事实,退出推理过程。
实现代码:
#include <bits/stdc++.h>
using namespace std;
// 规则类
class Rule {
public:
vector<string> pre; // 前提条件容器
string nxt; // 结论
bool finish; // 标记是否是最终结论
// 构造函数,用来新建规则
Rule(vector<string> preconditions, string conclusion, bool isFinish = false)
: pre(preconditions), nxt(conclusion), finish(isFinish) {}
// 判断规则是否可应用
bool isApplicable(const set<string>& factSet) {
for (const string& condition : pre) {
if (factSet.find(condition) == factSet.end()) {
return false; // 如果前提条件不成立,规则不可应用
}
}
return true; // 如果所有前提条件都存在于事实库中,则规则可应用
}
};
// 规则库类
class RuleBank {
public:
list<Rule> Rule_list; // 规则链表
// 插入规则的方法
void addRule(const Rule& rule) {
Rule_list.push_back(rule);
}
};
// 事实类
class Fact {
public:
set<string> factSet; // 事实库,使用集合来避免重复事实
// 添加事实的方法
void addFact(const string& fact) {
factSet.insert(fact);
}
// 检查是否存在某个事实
bool hasFact(const string& fact) {
return factSet.find(fact) != factSet.end();
}
};
// 主程序类
int main() {
// 创建事实库并添加初始事实
Fact factBase;
factBase.addFact("动物有奶");
factBase.addFact("动物有蹄");
factBase.addFact("动物有长脖子");
factBase.addFact("动物有长腿");
factBase.addFact("动物有暗斑");
// 创建规则库并添加规则
RuleBank ruleBank;
ruleBank.addRule(Rule({"动物有奶"}, "动物是哺乳动物"));
ruleBank.addRule(Rule({"动物有蹄", "动物是哺乳动物"}, "动物是有蹄类动物"));
ruleBank.addRule(Rule({"动物是有蹄类动物", "动物有长脖子", "动物有长腿", "动物有暗斑"}, "动物是长颈鹿", true)); // 标记为最终结论
// 推理引擎,进行推理直到得出最终结论
while (true) {
bool newFactAdded = false;
// 遍历规则库,寻找可应用的规则
for (auto& rule : ruleBank.Rule_list) {
if (rule.isApplicable(factBase.factSet) && !factBase.hasFact(rule.nxt)) {
// 如果规则可应用并且结论尚未在事实库中
factBase.addFact(rule.nxt); // 将结论添加到事实库
cout << "推理出新事实: " << rule.nxt << endl;
if (rule.finish) {
// 如果是最终结论
cout << "最终结论: " << rule.nxt << endl;
return 0; // 退出程序
}
newFactAdded = true;
break; // 一旦推理出新的事实,重新开始推理
}
}
// 如果没有推理出新的事实,则退出循环
if (!newFactAdded) {
cout << "无法推理出新的结论,推理结束。" << endl;
break;
}
}
return 0;
}
标签:结论,人工智能,识别系统,导论,Rule,库中,规则,推理,事实
From: https://blog.csdn.net/qq_73301411/article/details/143650183