基于回溯推理的小型专家系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 &vec,HWND wnd,INT itemId);

void PrintInt(vector &vec,HWND wnd,INT itemId);

void SeperateRule(const CString &rule,CString &left,CString &right);

MATCH_RESULT Match(CString pre,vector &truths);

OPERATOR_CMP_RESULT OperatorCmp(CString a,CString b);

CString Calcute(CString a,CString oper,CString b,vector &truths);

void NextElement(CString &res,CString &str);

bool IsOperator(WCHAR oper);

bool Find(vector &vec,CString v);

void NextLine(CString &res,CString &str);

bool IsEmptyWChar(WCHAR ch);

相关文档
最新文档