基于回溯推理的小型专家系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《基于回溯推理的小型专家系统》
实验报告
2011年5月1日
目录
一、实验题目............................................ 错误!未定义书签。
二、实验目的 (3)
三、实验要求 (6)
四、实验步骤 (6)
基本设计思路 (8)
流程框图 (10)
数据测试 (12)
五、实验方案设计实现 (16)
六、实验程序使用说明 (8)
八、实验心得体会 (15)
九、源程序清单 (22)
一、实验要求
利用产生式规则构建一个简单的专家系统
a)题目自拟(手机选择、电脑选择、玉石选择……)
b)要求:
1、确定推理方法(正向还是反向),并根据问题设计实现一个简单的不通用推理机(匹配、冲突消解)
2、规则库要求至少包含15条规则
3、初始事实可以任意给定,输入初始事实后能够得到推理结果
4、设计人机界面,解释模块提供查询规则的功能
5、可以不考虑知识库管理模块
6、提交实验报告,实验名称为:基于回溯推理的小型专家系统
7、报告中要有推理树
二、实验目的
通过编写设计专家推理系统,加深对产生式表示的理解。
三、实验步骤
基本设计思路
步1 将初始事实置入动态数据库;
步2 用动态数据库中的事实,匹配目标条件,若目标条件满足,则推理成功,结束。
步3 用待测试规则集中各规则的前件匹配动态数据库中的事实,将匹配成功的规则组成冲突集;
步4 若冲突集为空,则运行失败,退出。
步5 对冲突集做冲突消解,对选择执行的各规则,将其结论加入动态数据库,或执行其动作,转步2。
流程框图
数据测试
//Unicode编码_测试数据_规则集.txt
它种子的胚有两个子叶∨它的叶脉为网状=它是双子叶植物
它种子的胚有一个子叶=它是单子叶植物
它的叶脉平行=它是单子叶植物
(它是双子叶植物∧它的花托呈杯形)∨(它是双子叶植物∧它的花为两性∧它的花瓣有5枚)=它是蔷薇科植物
它是蔷薇科植物∧它的果实为核果=它是李亚科植物
它是蔷薇科植物∧它的果实为梨果=它是苹果亚科植物
它是李亚科植物∧它的果皮有毛=它是桃
它是李亚科植物∧它的果皮光滑=它是李
它的果实为扁圆形∧它的果实外有纵沟=它是桃
它是苹果亚科植物∧它的果实里无石细胞=它是苹果
它是苹果亚科植物∧它的果实里有石细胞=它是梨
它的果肉为乳黄色∧它的果肉质脆=它是苹果
// Unicode编码_测试数据_初始事实.txt
它种子的胚有两个子叶
它的果肉为乳黄色
它的果实里无石细胞
它的果实为梨果
它的果实无毛
它的花托呈杯形
四、实验方案设计实现
由于规则集和初始事实集可能非常大,所以这里采用读入文件的方法。为了支持中文,这里采用了Unicode编码,文本文件保存时,必须选择以Unicode的形式保存,否则会出现乱码。对文本进行解剖的过程比较麻烦,主要是因为Unicode文本中含有很多不可视的控制字符,两个字符串,看上去一模一样,但进行比对操作后并不相等,就是因为这些不可视的控制字符导致的。所以对文本进行解剖的过程中,必须多加注意对不可视控制字符的过滤。为了让用户能看清整个推理过程,设了一个“推理下一步”的按钮,让用户一步步执行。比较棘手的是前提是否成立的验证过程,运算符有∧)∨(,还要考虑运算符优先级问题。这里模仿了利用栈进行四则运算的过程。使用两个栈,一个保存运算符,一个保存操作数。在表达式最后面加一个”#”作为结束符,不断提取前提中的下一个元素,当为操作数时,进操作数栈。当为运算符时,对比它和运算符栈里最后一个运算符的优先级,如果栈中的那个优先级低,直接进栈。否则要以栈中那个运算符为运算符,操作数栈最后两个为操作数,进行一次运算。结果为真时,用字符串”@true”表示,结果为假时,用”@false”表示。当匹配成功,把结论增加到事实集中,把该规则从“待测试规则”转移到“匹配规则集”列表中。为了画面简洁,这里用规则号表示规则,用户如果要查看详细规则的说明,点击“查看规则”,就会弹出一个新的对话框。在MFC中,我们用一个类对表示这个对话框,当用户点击按钮时,我们将其实例化,并调用ShowWindows。为了从父对话框更新子对话框的控件,子对话框的类中,设计了专门的接口。
enum MATCH_RESULT
{
MATCH_RESULT_SUCCESSED,
MATCH_RESULT_FAILED,
};
enum OPERATOR_CMP_RESULT
{
OPERATOR_CMP_LESS,
OPERATOR_CMP_EQUAL,
OPERATOR_CMP_GREATER,
};
CString OpenAndReadFile(CString &str);
void PrintStr(vector
void PrintInt(vector
void SeperateRule(const CString &rule,CString &left,CString &right);
MATCH_RESULT Match(CString pre,vector
OPERATOR_CMP_RESULT OperatorCmp(CString a,CString b);
CString Calcute(CString a,CString oper,CString b,vector
void NextElement(CString &res,CString &str);
bool IsOperator(WCHAR oper);
bool Find(vector
void NextLine(CString &res,CString &str);
bool IsEmptyWChar(WCHAR ch);