专家系统实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

“专家系统”实验报告
专业:智能科学与技术
班级:1102
学号:**********
姓名:***
2014年6月5日
实验1 专家系统与CLIPS
实验内容提要:
专家系统不仅是具有特定的结构,同时,它还有多种知识表示形式,及其相应的知识推理方法。

因此,直接采用程序设计语言实现专家系统是比较困难的,而采用适当的专家系统开发工具则可以大大降低系统开发的难度。

因此,本章结合麦粒肿系统专断专家系统开发的需要,首先安排了对专家系统及其开发工具CLIPS基本理论知识,以及CLIPS基本理论知识,以及CLIPS基本使用方法的概要介绍,目的是为第6章“麦粒肿诊断专家系统开发”做好准备。

实验重点:
➢专家系统的一般结构
➢产生式规则的表示及其正向推理
➢专家系统开发工具的结构和特点
➢专家系统开发工具CLIPS的基本语法
➢专家系统开发工具CLIPS的基本使用
实验目的
➢掌握专家系统的一般结构
➢掌握产生式规则的表示及其正向推理
➢掌握专家系统开发工具的结构和特点
➢了解专家系统开发工具CLIPS的设计目标与特点
➢掌握专家系统开发工具CLIPS的基本语法
➢掌握专家系统开发工具CLIPS的基本使用
实验内容及要求
➢学习专家系统的一般结构
➢学习产生式规则的表示及其正向推理
➢学习专家系统开发工具的结构和特点
➢学习专家系统开发工具CLIPS的设计目标与特点
➢学习专家系统开发工具CLIPS的基本语法
➢学习专家系统开发工具CLIPS的基本使用
实验步骤
本实验包括以下六个具体步骤,分别是:学习专家系统的一般结构、学习产
生式规则的表示及其正向推理、学习专家系统开发工具的结构和特点、学习专家系统开发工具CLIPS的设计目标与特点、学习专家系统开发工具CLIPS的基本语法,以及学习专家系统开发工具CLIPS的基本使用。

1 学习专家系统的一般结构:
专家系统(ES,Expert System)是利用大量专家知识,运用只是推理方法解决特定领域中实际问题的计算机程序系统。

专家系统由产生式规则专家系统发展而来,主要包括知识库、推理机、综合数据库、知识获取程序、人机接口,以及解释程序六大部分。

其中,知识库、推理机、综合数据库,以及人际接口是目前大多数专家系统的主要内容,而知识获取程序和解释则是所有专家系统都期望具有的两个模块。

在专家系统的一般结构中,知识库用于存放各领域专家提供的经验性知识:综合数据库用于存放关于问题求解的初始数据、中间结果、假设、目标,以及最终求解结果(事实);推理机在一定的控制策略下针对综合数据库中的当前信息,识别和选取知识库中对当前问题求解有用的知识进行推理;知识获取程序完成把专家只是按一定表示形式输入到知识库中,部分代替知识工程师进行知识的自动获取,实现专家系统的字学习,不断完善知识库;解释程序可以根据用户提问,对系统给出的结论、求解过程,以及系统当前求解状态提供说明,便于用户理解系统的问题求解,增加用户对系统求解结果的信任程度,在知识库的完善过程中,便于专家或知识工程师发现和定位知识库中的错误,便于各领域的专业人员或初学者能够从问题的求解过程中得到直观学习;人机接口将专家爱或用户的输入信息翻译为系统可接受的内部形式,同时,也把系统向专家或用户输出的信息转化成人类易于理解的外部形式。

2 学习产生式规则的表示及其正向推理
目前,用于专家系统的知识表示形式主要有谓词逻辑、产生式规则、语义网络、框架,以及剧本。

其中,采用产生式规则知识表示形式建立的专家系统最为流行和广泛,这主要因为:首先,产生式规则知识表示容易被人理解;其次,它基于演译推理,保证了推理结果,的准确性;最后,大量产生式规则可以连接成多棵推理树,树的宽度反映了实际问题的范围,树的深度反映了问题的难度。

产生式规则一般表示为:如果A成立,则B成立,简记为A->B,其中A是前提,B是结论。

一般来说,不同的产生式规则之间都是有联系的,即谋条产生式规则的前提实力外一条产生式规则的结论。

如果把规则库(知识库)中所包含的总目标(某些规则的结论)作为根节点,按规则的前提和结论展开形成树的形式,则形成的树就被称为推理树或知识树,它把规则库中的所有规则都连接了起来。

产生式规则的推理分为正向推理和逆向推理两种,这里主要介绍正向推理。

产生式规则的正向推理过程是:逐条搜索规则库,对每一条规则的的前提条件检查实事库(综合数据库)中是否存在。

若再事实库中前提条件的个子项不是全部存在,则放弃该条规则;若在事实库总全部存在,则实行该规则,把结论放入事实库中。

反复循环执行上述过过程,直至推出目标,并存入事实库中为止。

3学习专家系统开发工具的结构和特点
开发专家系统主要有三条途径:直接使用程序设计语言,如LISP或PROLOG等;使用知识获取工具,如知识获取系统(KAS,Knowledge Acquisition System)到等;利用专家系统开发工具,如CLIPS或M.1等。

专家系统开发工具一般包括开发环境和运行环境两部分。

其中,开发环境有知识编辑、编译模块,知识库查询、维护模块,数据库查询、维护模块,知识库,以及实事库组成;运行环境有推理机,解释机制,人机交互,知识库,以及实事库组成。

知识库和实时库即被包括在开发环境中,同时也被包括在运行环境中,它们都有一定的格式要求,知识和事实由开发环境输入,提供给运行环境使用。

从专家系统开发工具的结构可以看出,专家系统开发工具具有一下特点:首先,工具有开发环境和运行环境组成,开发环境用于建立知识库、实事库、并修改、查询知识库和事实库;对指定知识表示形式的推理机和解释机制预先已经做好;运行环境的目的在于支持实际系统的运行。

其次,工具提供了一套用于开发专家系统的语言,包括知识标示语言和工具操作语言。

其中,只是表示语言用于完成外部知识到内部知识的编译;利用工具操作语言可以使用工具中的开发环境,实行运行环境中的功能。

4学习专家系统开发工具CLIPS的设记目标与特色
CLIPS(C Language Integrated Production System)是由美国国家航天局约翰逊空间中心人工智能部在1985年推出的专家系统开发工具,其设计目标和特色包括:
➢可用于管理、工业、商业、文教等各种领域的专家系统开发,具有广泛的通用性;
➢适用于各种型号的计算机,从IBM PC及其兼容机,到V AX,HP,SUNMACINTOSH,直到CRAY,都可以运行CLIPS,具有对机型的广泛适用性
➢与已有的普通软件系统易于集成,同Fortran、ADA等高级程序设计语言均有接口,为用户提供了方便
➢用C语言写成,运行速度快
➢具有不确定性下进行推理的能力
正是由于上述设计目标与特色,加之美国国家航天局对CLIPS采取公开化,以及免费使用的政策,CLIPS在众多的专家系统开发工具中深受欢迎,CLIPS研制小组也因而获得美国航天科技奖
CLIPS与比它早的专家爱系统开发工具ART、OPSS有很密切的关系,继承与吸收了ART、OPSS的长处与优点。

但是由于CLIPS最求的简单实用,以极高度的可移植性,因此,只提供了正向推理能力、CLIPS的发展历史证明,这并不影响他成为一个有效的专家系统开发工具。

5学习专家系统开发工具CLIPS的基本语法
为了支持麦粒肿诊断专家系统CLIPS程序的编写,以下将分别从符号体系、语言符号、事实、规则、注释、printout命令、变量、字符通配符、特权、read 函数,以及其他常用命令等11各方面,对CLIPS的基本语法进行概要介绍。

符号体系
CLIPS的符号体系包括以下三种类型。

➢需要完全照样输入计算机的字和字符,即不被<>、[ ]、{ }所括住的所有内容,比如(example)。

方括号表示其中的内容可有可无,比如在(example[1])中,方括号中的1是任选的,即输入(example)和(example 1)都是允许的。

尖括号表式其中的字所表示的意义要用一个相应的任意值代替,比如(example <integer>)表示在example后面一定要跟一个任意整数,即应输入(example 1)、(example 5)或者(example -20)等。

➢对于用双尖括号括住的描述,表示任意多个(包括0个)与其中的自相应的值,比如<<integer>>,见到这一描述,可以输入1,1 2,1 2 3,1 4 8,或-15,也可以不输入任何内容。

对于用三尖括号括住的描述,表示任意多个(但不包括0个)与其中的字相应的值,比如<<<integer>>>,相当于<integer> <<integer>>。

➢用于大括号括住的描述表示选用其中的任意一项(必须一项,但也仅一项)输入,比如{all,none,some},可以输入all,或者输入none,或者输入some。

语言符号
在CLIPS主要的语言符号单位是“字段”,也称为“域”(field)。

字段包括以下三种类型。

➢字(word)。

字以可以打印的ASCII字符开始,后随零个或多个字符。

但是“<”、“|”、“&”、“$”、“?”、“+”、“-”、“()”字符及其组合不能作为字的开始字符。

另外,字中间也不能包含“<”、“|”、“&”、“()”字符,因为这些字符在CLIPS中有特殊用途,即作为字的界限符,
表示字的结束。

最后,CLIPS认为统一字母的大、小写是两个不同的字。

根据一项规定,以下均为有效的CLIPS字:
emergency
fire
emergency-fire
activate-sprinkler-system
notify-fire-department
shut-down=electrical-junction-387
!?#$^*
➢字串(string)。

字串以引号开始和结束,双引号和结束,双引号本身是字串的一部分,期间可以有零个或任意个字符,比如“Activate the sprinkler system”。

➢数值字段或简称数值(number),表示浮点数。

在CLIPS中,所有的数,包括整型值的数,都以浮点数形式存储。

数值字段包括三个部分:符号、值和指数。

其中,符号和指数是任选的。

呼号或为+,或为-;值包括一个或多个数字,以及一个任选的小数点;指数包括字母e或E,后随任选的+或-,其后是一个或多个数字。

根据以上规定,1,1.2,.7,+3,-1,65,3.5e10都是CLIPS 中有效的数值字段
数值
为了解题,CLIPS程序必须有据以推理的数据或信息,这在CLIPS中被称为“事实”(fact)。

事实由配对的左、右圆括号括住的一个或多个字段组成,比如(single-field)和(two fields)。

CLIPS所承认的事实都保存在事实表(fact-list)中,新的事实用assert命令加入事实表,其语法格式为:(assert<<<fact>>>)。

比如表示发生火警的事实(emergency fire)就可以使用命令(assert(emergency fire))加入到事实表中。

虽然CLIPS不接受重复输入的事实,但是可以使用一个assert命令同时输入多个事实。

比如,可以使用命令(assert (emergency fire)(emergency flood))将两个事实(emergency fire)(emergency flood)同时加入事实表中。

撤销事实表中已经窜在的事实使用retract命令,其语法格式为:(retract <<<fact-index>>>)。

其中,fact-index称为事实索引号,是CLIPS赋予事实的标识,用于区分事实表众不同的事实。

使用一个retract命令可以一次同时撤销一个或多个事实。

比如,使用命令(retract 1)可以撤销事实表中事实索引号为1的一个事实,而使用命令(retract 1 2 3)则可以同时撤销事实表中事实索引号为1、2、3的三个事实。

使用facts命令可以显示当前事实表中存在的所有事实.
规则
规则用以表示推理和行为的过程,它描述了题的状态转移、性质变化等内容。

在CLIPS中,定义规则使用的defrule命令,其语法格式为:
(defrule <rule-name>[optional comment]
<<patterns>>
=>
<<actions>>)
其中,命令的第一行是规则标题,由三部分组成,分别是:关键字defrule;规则明rule-name,可以为任意有效地CLIPS字,但必须唯一,如果新输入的规则明与已经存在的规则明相同,则已经存在的规则将被新规则所取代;注解optional comment,可有可无u,但必须是一双引号开始和结尾的字串。

命令的第二行是零个或多个模式pattern,也就是规则的左端条件部分。

每个模式由一个或多个字段组成。

对于无模式的情况,系统将自动加入一个模式(initial-fact)。

命令的第三行是一个箭头,由一个等号和一个大于号组成。

命令的第四行是规则的右端动作部分,它给出了动作表,这部分也可以为空。

一下是一个使用defrule 命令,定义一个名为fire-emergency的规则的例子,其含义是“如果发生的紧急情况是火灾,那么就启动喷淋装置”
(defrule fire-emergency "An example rule"
(emergency fire)
=>
(assert (action activate-sprinkler-system)))
使用rules命令或pprule命令可以显示当前规则库中的规则。

其中,使用rules 命令将显示当前规则库总存在的所有规则的名称;而使用pprule命令则可以显示某个规则的文本内容
注释
为了方便对程序逻辑的理解,增强代码的可读性,应该在代码中加入必要的注释。

CLIPS中,注释以“;”开头,一会可换行结束,比如一下代码:
;***************************
;* 题目:火灾报警*
;* 日期:2006年7月*
; ***************************
实验结果图如下
实验二麦粒肿诊断专家系统开发
内容提要:
学习专家系统基本理论知识及其开发工具最终目的是为了进行实际系统的开发。

因此,在上一章内容的基础上,本章首先安排了对专家系统开发过程的概要介绍。

然后,结合相应的基本理论知识,详细介绍了麦粒肿诊断推理树的绘制、麦粒肿诊断专家系统CLIPS程序的编写,以及以批处理方式运行麦粒肿诊断专
家系统的具体过程。

本章重点
➢专家系统的开发过程。

➢绘制麦粒肿诊断推理树。

➢编写麦粒肿诊断专家系统CLIPS程序。

➢以批处理方式运行麦粒肿诊断专家系统。

实验目的
➢掌握专家系统的开发过程。

➢掌握根据产生式规则绘制相应推理树的方法。

➢掌握使用记事本编写CLIPS应用程序的方法。

➢掌握以批处理方式运行CLIPS应用程序的方法。

实验内容与要求
➢学习专家系统的开发过程。

➢根据以下给出的麦粒肿诊断产生式规则绘制相应的麦粒肿诊断推理树。

●R1:毛囊皮根微红肿→轻型。

●R2:鼻塞流涕→外感风热。

●R3:舌苔薄黄∧胃纳差→胃肠积热。

●R4:眼睑局部明显红肿→重型。

●R5:眼睑局部红肿∧顶尖有脓点→重型。

●R6:脓点破溃→晚期。

●R7:轻型∧外感风热→轻风热型。

●R8:重型∧外感风热→重风热型。

●R9:重型∧胃肠积热→重积热型。

●R10:轻型→散瘌法。

●R11:晚期→外敷药物。

●R12:轻风热型→散癞加罐。

●R13:重风热型→挑瘌加罐。

●R14:重积热型→放血法。

为了后续编码的方便,在推理树的绘制过程中,首先,应以汉语拼音首字母的形式为每一条产生式规则的前提和结论进行编码,如“散癞法”可以编码为“SLF”。

其次,对于单前提的规则,在相应的推理树弧上应标出其相应的规则编号,而对于具有两个或多个前提,且前提间具有“并且”关系的规则,
则应在其相应的推理树弧之间使用带有规则编号的曲线来表示。

1) 参考绘制的推理树,使用记事本编写麦粒肿诊断专家系统CLIPS 程序。

系统运行时,首先对所有的症状进行提问,收集“yes”或“no”的回答;然后,根据提出的产生式推理规则进行正向推理,如果能够推出治疗方法,则显示治疗方法,并提示是继续开始新一轮的推理还是退出程序;如果不能推出治疗方法,则直接提示是继续开始新一轮的推理还是推出程序。

2) 以批处理方式运行麦粒肿诊断专家系统。

3) 编写麦粒肿诊断专家系统开发实验报告书。

具体格式参考附录A 。

实验步骤
本实验包括以下五个具体步骤,分别是:学习专家系统的开发过程、绘制麦粒肿推理树、编写麦粒肿诊断专家系统CLIPS 程序、以批处理方式运行麦粒肿诊断专家系统,以及编写麦粒肿诊断专家系统开发实验报告。

1 学习专家系统的开发过程
专家系统一般是由专家和知识工程师共同配合研制而成的。

专家可以不懂计算机,但他一定是某个实际领域经验丰富的人,而知识工程师则是既懂计算机和专家系统原理,同时又具有编程专家系统能力的人。

专家系统的开发一般遵循如图2-1所示的过程:首先,在知识工程师的引导和启发下,专家提供解决实际领域中问题的基本知识和经验;其次,知识工程师根据对专家知识及专家系统的理解设计知识库、推理机等模块;最后,知识工程师利用知识工程语言编制知识库、推理机等模块程序,并将模块程序集成为专家系统。

同2-1 专家系统开发过程 2 绘制麦粒肿诊断推理树
根据上述的专家系统开发过程,由于进行麦粒肿诊断的产生式规则已经专 家 引导和启发 知识和经验 知识工程师 建立专家系统 设计知识库 设计推理机等模块
在实验要求2)中给出,而根据第5章实验4对专家系统开发工具的结构和特点,以及CLIPS的介绍可知,针对产生式规则的知识表示,相应的正向推理机和解释机制也已经在CLIPS中预先做好。

因此,利用CLIPS开发麦粒肿诊断专家系统的主要工作就只剩下编写代码,将实验要求2)中给出的产生式规则放入规则库(知识库),最终建立麦粒肿诊断专家系统。

为了方便对麦粒肿诊断专家系统的编码,建议首先根据已知的产生式规则绘制出相应的推理树。

如果把规则库(知识库)中所包含的总目标(某些规则的推论)作为根节点,按规则的前提和结论展开形成树的形式,这样形成的树就被称为推理树或知识树,它把规则库中的所有规则都连接起来。

根据上述对推理树的定义,以及在实验要求2)中给出的14条麦粒肿诊断产生式规则,首先,以治疗麦粒肿的五种具体方法(散瘌法、散癞加罐、挑瘌加罐、放血法和外敷药物)作为根节点。

然后,将所有规则的其他前提和结论作为其他节点,规则作为连接结点间的弧,按规则的前提和结论展开,就可以形成如图2-2所示的麦粒肿诊断推断树。

图2-2 麦粒肿诊断推理树
需要说明的是:在图2-2的推理树绘制过程中,为了后续编码的方便,首先,以汉语拼音首字母的形式为每一条产生式规则的前提和结论进行了编码,规则的前提和结论于编码的对应关系如表2-1所示。

表2-1 规则的前提和结论与编码的对应关系
其次,对于但前提的规则,在相应的推理树弧上都标出了其相应的规则编号,比如,在“SLF”和“QX”之间的弧上标出了“R10”,而对于具有两个前提,且前提间具有“并且”关系的规则,则在其相应的推理树弧之间使用带有规则编号的曲线来表示,比如,在分别连接“QFRX”与“QX”,以及“QFRX”与“WGFR”的两条弧之间使用了标有“R7”的曲线。

3 编写麦粒肿诊断专家系统CLIPS程序
由于CLIPS的当前版本还不能正确地处理中文,而在编写代码的过程中,使用中文注释可以有效地提高代码的可读性,因此,本节在编写麦粒肿诊断专家系统代码时没有直接使用CLIPS提供的编辑环境,而是借助了windows操作系统自带的记事本(notpad)应用程序,使用记事本编写麦粒肿诊断专家系统代码的具体步骤如下。

单击操作系统桌面左下方的“开始”—“所有程序”—“附件”—“记事本”选项,启动记事本程序。

单击记事本程序菜单栏上的“文件”—“保存”选项,在弹出的“另存为”对话框文件名右侧的下拉框中输入“mlzzdzjxt.clp”,更换存储路径为“c:\jczcyzjxt\zjxt”,修改“保存类型”下拉框为“所有文件”,然后,单击“保存”按钮,保存文件。

;******************************* ;** 麦粒肿诊断专家系统** ;******************************* ;******************************** ;rule init:
; 初始化程序
;********************************
(defrule init
(declare (salience 9980))
?x <- (initial-fact)
=>
(retract ?x)
(assert (start)))
;****************************
; rule end:
; 结束程序,退出CLIPS
;****************************
(defrule end
(declare (salience 9200))
?w <- (stop)
=>
(exit))
;****************************
;rule ckMNPGWHZ:
; 进行程序描述,提问毛囊皮根微红肿;****************************
(defrule ckMNPGWHZ
(declare (salience 100))
?x <- (start) =>
(printout t crlf crlf crlf
"这个程序将帮助你一步步地进行麦粒肿的诊断" crlf crlf
"毛囊皮根微红肿吗?" crlf
"选择y / n -> ")
(retract ?x)
(assert (MNPGWHZ =(read))))
;****************************
;rule ckBSLT:
; 提问鼻塞流涕
;****************************
(defrule ckBSLT
(declare (salience 100))
(MNPGWHZ ?)
=>
(printout t crlf crlf
"鼻塞流涕吗?" crlf
"选择y / n -> ")
(assert (BSLT =(read))))
;**************************** ;rule ckYJJBMXHZ:
; 提问眼睑局部明显红肿
;****************************
(defrule ckYJJBMXHZ (declare (salience 100))
(BSLT ?)
=>
(printout t crlf crlf
"眼睑局部明显红肿吗?" crlf
"选择y / n -> ")
(assert (YJJBMXHZ =(read))))
;**************************** ;rule ckYJJBHZ:
; 提问眼睑局部红肿
;****************************
(defrule ckYJJBHZ
(declare (salience 100)) (YJJBMXHZ ?)
=>
(printout t crlf crlf
"眼睑局部红肿吗?" crlf
"选择y / n -> ")
(assert (YJJBHZ =(read))))
;**************************** ;rule ckDJYND:
; 提问顶尖有脓点
;****************************
(defrule ckDJYND
(declare (salience 100)) (YJJBHZ ?)
=>
(printout t crlf crlf
"顶尖有脓点吗?" crlf
"选择y / n -> ")
(assert (DJYND =(read))))
;**************************** ;rule ckSTBH:
; 提问舌苔薄黄
;****************************
(defrule ckSTBH
(declare (salience 100)) (DJYND ?)
=>
(printout t crlf crlf
"舌苔薄黄吗?" crlf
"选择y / n -> ")
(assert (STBH =(read))))
;**************************** ;rule ckWNC:
; 提问胃纳差
;****************************
(defrule ckWNC
(declare (salience 100)) (STBH ?)
=>
(printout t crlf crlf
"胃纳差吗?" crlf
"选择y / n -> ")
(assert (WNC =(read))))
;**************************** ;rule ckNDPK:
; 提问脓点破溃
;****************************
(defrule ckNDPK
(declare (salience 100))
(WNC ?)
=>
(printout t crlf crlf
"脓点破溃吗?" crlf
"选择y / n -> ")
(assert (NDPK =(read))))
;****************************
;**************************** ;rule rule1:
; 规则1
;****************************
(defrule rule1a
(declare (salience 99)) (MNPGWHZ y)
=>
(assert (QX y)))
(defrule rule1b
(declare (salience 99)) (MNPGWHZ n)
=>
(assert (QX n)))
;****************************
;**************************** ;rule rule2:
; 规则2
;****************************
(defrule rule2a
(declare (salience 99))
(BSLT y)
=>
(assert (WGFR y)))
(defrule rule2b
(declare (salience 99))
(BSLT n)
=>
(assert (WGFR n)))
;****************************
;**************************** ;rule rule3:
; 规则3
;****************************
(defrule rule3a
(declare (salience 99)) (STBH y)
(WNC y)
=>
(assert (WCJR y)))
(defrule rule3b
(declare (salience 99)) (STBH n)
=>
(assert (WCJR n)))
(defrule rule3c
(declare (salience 99))
(WNC n)
=>
(assert (WCJR n)))
;****************************
;**************************** ;rule rule4:
; 规则4
;**************************** (defrule rule4a
(declare(salience 99))
(YJJBMXHZ y)
=>
(assert (ZX y)))
;**************************** ;rule rule5:
; 规则5
;****************************
(defrule rule5a
(declare (salience 99)) (YJJBHZ y)
(DJYND y)
=>
(assert (ZX y)))
(defrule rule5b
(declare (salience 99)) (YJJBMXHZ n)
(YJJBHZ y)
(DJYND n)
=>
(assert (ZX n)))
(defrule rule5c
(declare (salience 99)) (YJJBMXHZ n)
(YJJBHZ n)
(DJYND y)
=>
(assert (ZX n)))
;****************************
;**************************** ;rule rule6:
; 规则6
;****************************
(defrule rule6a
(declare (salience 99)) (NDPK y)
=>
(assert (WQ y)))
(defrule rule6b
(declare (salience 99)) (NDPK n)
=>
(assert (WQ n)))
;****************************
;**************************** ;rule rule7:
; 规则7
;****************************
(defrule rule7a
(declare (salience 98))
(QX y)
(WGFR y)
=>
(assert (QFRX y)))
(defrule rule7b
(declare (salience 98))
(QX n)
=>
(assert (QFRX n)))
(defrule rule7c
(declare (salience 98)) (WGFR n)
=>
(assert (QFRX n)))
;****************************
;**************************** ;rule rule8:
; 规则8
;****************************
(defrule rule8a
(declare (salience 98)) (WGFR y)
(ZX y)
=>
(assert (ZFRX y)))
(defrule rule8b
(declare (salience 98)) (WGFR n)
=>
(assert (ZFRX n)))
(defrule rule8c
(declare (salience 98))
(ZX n)
=>
(assert (ZFRX n))) ;****************************
;**************************** ;rule rule9:
; 规则9
;****************************
(defrule rule9a
(declare (salience 98))
(ZX y)
(WCJR y)
=>
(assert (ZJRX y)))
(defrule rule9b
(declare (salience 98))
(ZX n)
=>
(assert (ZJRX n)))
(defrule rule9c
(declare (salience 98)) (WCJR n)
=>
(assert (ZJRX n)))
;****************************
;**************************** ;rule rule10:
; 规则10
;****************************
(defrule rule10a
(declare (salience 98))
(QX y)
=>
(assert (SLF y)))
(defrule rule10b
(declare (salience 98))
(QX n)
=>
(assert (SLF n)))
;****************************
;**************************** ;rule rule11:
; 规则11
;****************************
(defrule rule11a
(declare (salience 98))
(WQ y)
=>
(assert (WFYW y)))
(defrule rule11b
(declare (salience 98))
(WQ n)
=>
(assert (WFYW n)))
;****************************
;**************************** ;rule rule12:
; 规则12
;****************************
(defrule rule12a
(declare (salience 97)) (QFRX y)
=>
(assert (SLJG y)))
(defrule rule12b
(declare (salience 97)) (QFRX n)
=>
(assert (SLJG n)))
;****************************
;**************************** ;rule rule13: ; 规则13
;****************************
(defrule rule13a
(declare (salience 97))
(ZFRX y)
=>
(assert (TLJG y)))
(defrule rule13b
(declare (salience 97))
(ZFRX n)
=>
(assert (TLJG n)))
;****************************
;**************************** ;rule rule14:
; 规则14
;****************************
(defrule rule14a
(declare (salience 97))
(ZJRX y)
=>
(assert (FXF y)))
(defrule rule14b
(declare (salience 97))
(ZJRX n)
=>
(assert (FXF n)))
;****************************
;**************************** ;rule result1:
; 诊断结果1:采用散癞法
;****************************
(defrule result1
(declare (salience 96))
(SLF y)
=>
(printout t crlf crlf
"诊断结果:可以采用散瘌法。

" crlf crlf) (assert (succeed)))
;****************************
;****************************
;rule result2:
; 诊断结果2:采用外敷药物
;****************************
(defrule result2
(declare (salience 96))
(WFYW y)
=>
(printout t crlf crlf
"诊断结果:可以采用外敷药物。

" crlf crlf)
(assert (succeed)))
;****************************
;****************************
;rule result3:
; 诊断结果3:采用散瘌加罐
;****************************
(defrule result3
(declare (salience 96))
(SLJG y)
=>
(printout t crlf crlf
"诊断结果:可以采用散瘌加罐。

" crlf crlf)
(assert (succeed)))
;****************************
;****************************
;rule result4:
; 诊断结果4:采用挑瘌加罐
;**************************** (defrule result4
(declare (salience 96))
(TLJG y)
=>
(printout t crlf crlf
"诊断结果:可以采用挑瘌加罐。

" crlf crlf)
(assert (succeed)))
;****************************
;****************************
;rule result5:
; 诊断结果5:采用放血法
;****************************
(defrule result5
(declare (salience 96))
(FXF y)
=>
(printout t crlf crlf
"诊断结果:可以采用放血法。

" crlf crlf) (assert (succeed)))
;****************************
;****************************
;rule resultSucceed:
; 有诊断结果
;****************************
(defrule resultSucceed
(declare (salience 95))
(succeed)
=>
(printout t crlf crlf
"以上是诊断结果,你可以选择:" crlf crlf
"1)继续诊断;"crlf
"2)退出程序。

"crlf
"请输入数字1或2:")
(assert (choice_a =(read))))
;****************************
;****************************
;rule fail:
; 没有诊断结果
;****************************
(defrule fail
(declare (salience 95))
(SLF n)
(WFYW n)
(SLJG n)
(TLJG n)
(FXF n)
=>
(printout t crlf crlf
"没有诊断结果,你可以选择:" crlf crlf "1)重新诊断;"crlf
"2)退出程序。

"crlf
"请输入数字1或2:")
(assert (choice_b =(read))))
;****************************
;****************************
;rule choice1a:
; 选择1:有诊断结果,重新诊断
;****************************
(defrule choice1a
(choice_a 1)
=>
(printout t crlf crlf crlf crlf
"重新诊断;" crlf crlf)
(reset))
;****************************
;****************************
;rule choice2a:
; 选择2:有诊断结果,退出程序
;****************************
(defrule choice2a
(choice_a 2)
=>
(printout t crlf crlf crlf crlf
"退出程序。

" crlf crlf)
(assert (stop)))
;****************************
;****************************
;rule choice1b:
; 选择1:没有诊断结果,重新诊断;****************************
(defrule choice1b
(choice_b 1)
=>
(printout t crlf crlf crlf crlf
"重新诊断:" crlf crlf) (reset))
;****************************
;****************************
;rule choice2b:
; 选择2:没有诊断结果,退出程序;****************************
(defrule choice2b
(choice_b 2)
=>
(printout t crlf crlf crlf crlf
"退出程序。

" crlf crlf)
(assert (stop)))
;********************。

相关文档
最新文档