1、第七章交通信息管理技术第七章交通信息管理技术-专家系统专家系统 专家系统专家系统(Expert System,ES)是一种模拟人类专家解决领域问题的计算机软件系统。专家系统内部含有大量的某个领域的专家水平的知识与经验,能够运用人类专家的知识和解决问题的方法进行推理和判断,模拟人类专家的决策过程,来解决该领域的复杂问题。7.1专家系统概述7.1.1 专家系统研究的意义专家系统研究的意义(1)专家系统研究是计算机科学的应用和发展的需要.(2)专家系统为人类保存、传播、使用和评价知识提供了一种有效的手段.(3)专家系统研究可以产生巨大的经济效益.7.1.2 专家系统的结构与开发方法1 专家系统的结构
2、专家系统的结构 知识库以某种存储结构存储领域专家的知识。全局数据库亦称为“黑板”,它用于存储求解问题的初始数据和推理过程中得到的中间数据,以及最终的推理结论。推理机推理机根据全局数据库的当前内容,从知识库中选择匹配成功的可用规则,并通过执行可用规则来修改数据库中的内容,直至推理来出问题的结论。解释器解释器用于向用户解释专家系统的行为。用户接口用户接口是系统与用户进行对话的界面。知识获取模块知识获取模块把知识工程师提供的知识转换为知识内部表示模式存入知识库中,在知识存储的过程中,对知识进行一致性、完整性检测。图7.1 专家系统结构框图7.2 专家系统的开发(1)自一九六八年由费根鲍姆主持研制完成
3、的第一个专家系统DENDRAL(质谱数据分析、推断化学分子结构的系统)以来,已经在各行各业中研制了大量的专家系统。专门为专家系统设计的语言软件Lisp和Prolog也已诞生。(2)尽管有报道说某些专家系统的分析判断能力超过了专家水平,并创造了大量社会财富。但是绝大多数的专家系统只能达到或接近专家水平。(3)在专家系统的研制过程中,人们越来越感到专家知识的获取并转换成计算机能够接受的形式是专家系统研究的瓶颈。7.2.1 LISP语言的特点1 LISP语言的特点语言的特点 (1)函数性 (2)递归性 (3)数据与程序的一致性 (4)自动进行存储分配 (5)语法简单7.2.2 LISP语言的基本函数
4、1 数值运算函数数值运算函数 (1)算术运算函数 算术运算函数有:加函数+、减函数-、乘函数*、除函数/、加1函数1+、减1函数1-等。+、-、*、/等函数可对多个数或已经赋值的符号进行数值运算。(2)超越函数(3)数的逻辑运算函数 数的逻辑运算函数可把指定的多个十进制整数先转换成二进制数,然后把这多个二进制数的对应位进行逻辑运算,把运算结果再转换成十进制整数作为函数返回值。逻辑运算函数有:逻辑或运算函数logior、逻辑异或运算函数logxor、逻辑与运算函数logand、逻辑非运算函数lognot 等。2 求值与赋值函数求值与赋值函数 (1)禁止求值函数 禁止求值函数quote对指定的表说
5、明表中元素都是数。例如(quote (a b c )的返回值是表(a b c)。quote函数的缩写为“”。(2)赋值函数 赋值函数setq用于对变元赋值,对一个变元赋的值可以是一个数、一个符号表达式、一个表或者另一个变元。setq函数可以对多个变元依序赋值,例如 (setq x (1 2)y x)3 表处理函数表处理函数 (1)取表部分内容的函数 car函数:取表的第一个元素,例如(car (a b c)a cdr函数:取表中除掉第一个元素的余下表,例如 (cdr (a b c)(b c)函数car和cdr可对一个表连续作用,例如(car(cdr(cdr(cdr (a b c d e f)可
6、表示为 (cadddr (a b c d e f)(2)构造表的函数 cons函数:把指定的两个元素构造成一个表,如果第2个元素是一个表,则把第1个元素加到第2个元素的表头。例如 (cons a (b c)(a b c)(cons (a b)(c d)(a b)c d)list函数:把指定的多个元素按顺序构造成一个表。例如(list a b c d)(a b c d)(list (a b)(c d)(a b)(c d)append函数:把指定的多个表拼接成一个表。例如(append (a b)(c d)(a b c d )(3)其他表函数)其他表函数 list-length函数返回指定的一个表
7、的元素个数。例如 (list-length (a (b c)2 member函数表达式为 (member item list)如果item是表list中的一个元素,则member返回list中从元素item开始的余下表;否则,返回空表(),也即是返回nil。(member b (a b c d))(b c d)(member (a b)(a b c d)()(member (b c)(a (b c)d)(b c)d)4 逻辑函数逻辑函数 (1)数据类型判断函数 atom函数:判断其后的对象是否是原子,若是一个原子,则返回t;否则,返回nil。listp函数:判断其后的对象是否是一个表,若是一个
8、表(包括空表),则返回t;否则,返回nil。null函数:判断其后的对象是否是一个空表,若是一个空表,则返回t;否则,返回nil。(2)数的比较函数 数的比较函数用于比较两个数的大小,有大于比较函数小于比较函数大于等于比较函数=小于等于比较函数等于比较函数=不等于比较函数/=若指定的两个数满足函数的比较关系,则返回t;否则,返回nil。(3)等值函数 数的等于比较函数“=”用于比较两个数是否相等,若要判别两个表或符号是否相等,则要用等值函数equal。(equal (a b c)(a b c)t(equal ()nil)t(equal (a b c)(a (b c)nil (4)逻辑运算函数
9、and 函数:当且仅当其各元素的值均为非nil,则返回值为t;否则,返回nil。or函数:当且仅当其各元素中只要有一个元素的值为非nil,则返回值为t;否则,返回nil。not函数:当且仅当其元素的值为nil,则返回值为t;否则,返回nil。5 条件函数条件函数 (1)if函数函数 if函数的表达式为 (if test then else)若测试条件表达式test的值为非nil,则对表达式then求值,且if函数的返回值就是then的值;否则,对表达式else求值并作为if函数的返回值,如果没有else,则if函数返回nil。if函数表达式中,else部分是可缺省的。表达式中用方括号 括起来的
10、部分表示是可缺省的。(2)when函数函数 when函数的表达式为 (when test form*)其中,test为测试条件表达式,form为符号表达式,form*表示可有多个符号表达式。若test的值为非nil,则顺序对多个form求值,且以最后一个form的值作为when函数的返回值;否则,when函数返回nil。(3)unless函数函数 unless函数的表达式为 (unless test form*)若测试条件表达式test的值为nil,则顺序对多个符号表达式form求值,且以最后一个form的值作为unless函数的返回值;否则,unless函数返回nil。(4)cond函数函数
11、 cond函数的表达式为 (cond (exp11 exp12 )(exp21 exp22 )(expn1 expn2 )cond函数顺序对n个表进行处理,一个表(expi1 expi2 )称为一个cond分句分句。每个分句中的第一个元素expi1是这个分句的测试条件表达式,其后各元素是符号表达式。cond函数顺序计算各分句expi1的值,若expi1的值为非nil,则计算这个分句各表达式的值,且以最后一个表达式的值作为cond函数的返回值;若所有分句的条件表达式的值均为nil,则cond函数返回nil。一种特殊情况是:若某个cond分句中只有expi1且expil的值为非nil,则cond函
12、数返回这个expi1的非nil值。6 自定义函数自定义函数 derfun自定义函数的表达式为(derfun name lambda-list form*)其中 name是新函数的函数名,lambda-list是新函数name的变量表,form*是由多个表达式组成的新函数name的定义体。例例7.17.1 用自定义函数用自定义函数defundefun定义比较函数定义比较函数comparecompare。解解:可如下定义函数compare:(defun compare (x y)(cond (=x y)(print“numbers are same”)(x y)(print“fist is big
13、ger”)(t (print“first is smaller”)一个新的函数被定义后就可如同LISP的基本函数一样被直接调用。例如(compare (3 5)“first is smaller”7 结构迭代函数结构迭代函数 do函数的表达式为:(do (var1 init1 upd1)(var2 init2 upd2))(condition action1 action2 )form*)(condition action1 action2)是循环是否结束的判断子句,若condition的值为非nil,则循环结束,并对action1,action2,依序求值,把最后一个表达式action的值作
14、为do函数的返回值;否则,执行循环体form*。例例7.47.4 用结构迭代方式来定义计算阶乘用结构迭代方式来定义计算阶乘n n!的函!的函数数factorial(factorial(n n)。解解:可如下定义:(defun factorial (n)(do (i 1 (1+i)(result 1)(i n)result)(setq result (*i result)调用时,用实参代替函数factorial的形参n。例如(factorial 4)248 非结构迭代函数非结构迭代函数 prog函数的表达式为 (prog (var1 init1)(var2 init2)exp1 exp2 )在表
15、达式序列exp1,exp2,中可以有多个表达式含有go函数表达式,至少有一个表达式含有return函数表达式。若没有go和return,则对各表达式顺序求值后退出prog,且函数prog的返回值为nil。go函数的表达式为(go symbol)在prog中找名为symbol的表达式(原子),若未找到,则prog函数返回出错信息;若找到,转到名为symbol的原子之后的表达式继续执行。return函数的表达式为(return form)对form求值后退出prog,且函数prog的返回值为form的值。7.3 知识库与推理机7.3.1 产生式规则与规则库的存储结构产生式规则与规则库的存储结构7.
16、3.2 正向推理机正向推理机7.3.3 反向推理机反向推理机7.3.1 产生式规则与规则库的存储结构1 产生式规则的存储结构 (F1F2F3)(F4F5)H1H2可等价变换为下述4条规则:R11:F1F2F3 H1 R12:F4F5 H1 R21:F1F2F3 H2 R22:F4F5 H2用与/或图表示规则的事实和结论之间的与或关系:F1F2F3F4F5H2H1图图7.3 产生式规则与产生式规则与/或图或图 产生式规则与条件语句之间存在以下根本的区别根本的区别:产生式规则具有自含性。可用规则的执行将取决于产生式系统的冲突消解策略。在LISP中,一条产生式规则的存储结构是一个表:(规则名(规则名
17、 (if(条件(条件1)(条件)(条件2)(条件(条件n)(then(结论(结论1)(结论)(结论2)(结论(结论m)2 规则库的存储结构规则库的存储结构 例例7.57.5 建立动物识别专家系统的规则库,规则名分别是rule1,rule2,rule15,规则库的符号名为rules。(setq rules (rule1 (if (animal has hair)若动物有毛发(F1)(then (animal is mammal)则动物是哺乳动物(M1)(rule2 (if(animal gives milk)若动物有奶(F2)(then(animal is mammal)则动物是哺乳动物(M1)
18、(rule3 (if(animal has feathers)若动物有羽毛(F9)(then(animal is bird)则动物是鸟(M4)(rule4 (if(animal flies)若动物会飞(F10)(animal lays eggs)且生蛋(F11)(then(animal is bird)则动物是鸟(M4)(rule5 (if(animal eats meat)若动物吃肉(F3)(then(animal is carnivore)则动物是食肉动物(M2)(rule6 (if(animal has pointed teeth)若动物有犀利牙齿(F4)(animal has claw
19、s)且有爪(F5)(animal has forword eyes)且眼向前方(F6)(then(animal is carnivore)则动物是食肉动物(M2)(rule7 (if(animal is mammal)若动物是哺乳动物(M1)(animal has hoofs)且有蹄(F7)(then(animal is ungulate)则动物是有蹄类动物(M3)(rule8 (if(animal is mammal)若动物是哺乳动物(M1)(animal chews cud)且反刍(F8)(then(animal is ungulate)则动物是有蹄类动物(M3)(rule9 (if(an
20、imal is mammal)若动物是哺乳动物(M1)(animal is carnivore)且是食肉动物(M2)(animal has tawny color)且有黄褐色(F12)(animal has dark sports)且有暗斑点(F13)(then(animal is cheetah)则动物是豹(H1)(rule10 (if(animal is mammal)若动物是哺乳动物(M1)(animal is carnivore)且是食肉动物(M2)(animal has tawny color)且有黄褐色(F12)(animal has black stripes)且有黑色条纹(F1
21、5)(then(animal is tiger)则动物是虎(H2)(rule11 (if(animal is ungulate)若动物是有蹄类动物(M3)(animal has long neck)且有长脖子(F16)(animal has long legs)且有长腿(F14)(animal has dark spots)且有暗斑点(F13)(then(animal is giraffe)则动物是长颈鹿(H3)(rule12 (if(animal is ungulate)若动物是有蹄类动物(M3)(animal has black stripes)且有黑色条纹(F15)(then(anima
22、l is zebra)则动物是斑马(H4)(rule13 (if(animal is bird)若动物是鸟(M4)(animal does not fly)且不会飞(F17)(animal has long neck)且有长脖子(F16)(animal has long legs)且有长腿(F14)(animal is black and white)且有黑白二色(F18)(then(animal is ostrich)则动物是鸵鸟(H5)(rule14 (if(animal is bird)若动物是鸟(M4)(animal does not fly)且不会飞(F17)(animal swim
23、s)且会游泳(F19)(animal is black and white)且有黑白二色(F18)(then(animal is penguin)则动物是企鹅(H6)(rule15 (if(animal is bird)若动物是鸟(M4)(animal flies well)且善飞(F20)(then(animal is albatross)则动物是信天翁(H7)R1:F1 M1 R2:F2 M1R3:F9 M4 R4:F10F11 M4R5:F3 M2 R6:F4F5F6 M2R7:F7M1 M3 R8:F8M1 M3R9:F12F13M1M2 H1 R10:F12F15M1M2 H2R11
24、:F13F14F16M3 H3 R12:F15M3 H4R13:F14F16F17F18M4 H5 R14:F17F18F19M4 H6R15:F20M4 H7图图7.4 动物识别专家系统规则库与动物识别专家系统规则库与/或图或图7.3.2 正向推理机1 函数函数recall 函数表达式:(recall fact)函数功能:判断变量fact中的一个事实是否在表facts中,若是,recall返回值是fact中的事实;否则,返回nil。(defun (recall fact)(cond (member fact facts)fact)(t nil)2 函数函数test-if 函数表达式:(tes
25、t-if rule)函数功能:判断变量rule中的一条规则的前件包含的全部事实是否在表facts中,若是,test-if返回t;否则,返回nil。(defun (test-if rule)(prog (ifs)(setq ifs (cdadr rule)loop (cond (null ifs)(return t)(recall (car ifs)(t (return nil)(setq ifs (cdr ifs)(go loop)3 函数函数remember 函数表达式:(remember new)函数功能:判断变量new中的一个事实是否在表facts中,若是,remember返回nil;否
26、则,将new中的事实添加到表facts的表头,且remember返回new中的事实。(defun (remember new)(cond (member new facts)nil)(t (setq facts (cons new facts)new)4 函数函数use-then 函数表达式:(use-then rule)函数功能:判断变量rule中的一条规则的后件包含的全部结论是否在表facts中,若全部结论都在facts中,则use-then返回nil;否则,将不在facts中的结论逐一添加到表facts中,且use-then返回t。(defun (use-then rule)(prog
27、(thens success)(setq thens (cdddr rule)loop (cond (null thens)(return success)(remember (car thens)(print(car rule)(print|DEDUCES|(car thens)(setq success t)(setq thens (cdr thens)(go loop)5 函数函数try-rule 函数表达式:(try-rule rule)函数功能:判断规则变量rule中的一条规则的前件包含的全部事实是否在表facts中,若全部事实都在facts中,且规则后件有不在facts中的结论,则
28、把不在facts中的结论逐一添加到表facts中,try-rule返回t;否则,try-rule返回nil。(defun (try-rule rule)(and (tesr-if rule)(use-then rule)6 函数函数step-forward 函数表达式:(step-forward rules)函数功能:逐次扫描规则库rules中的规则,若发现rules中有一条可用规则,即该规则的前件包含的全部事实在表facts中,则把该规则的后件中不在facts中的所有结论添加facts中,且step-forward返回t;若rules中没有一条可用规则,则step-forward返回nil。
29、(defun (step-forward rules)(prog (rule-list)(setq rule-list rules)loop (cond (null rule-list)(return nil)(try-rule (car rule-list)(return t)(setq rule-list (cdr rule-list)(go loop)7 正向推理机函数正向推理机函数deduce 函数表达式:(deduce facts)函数功能:连续不断地从规则库rules中选择可用规则,每选择到一条可用规则,就把该规则的后件中不在facts中的所有结论添加到facts中,对facts扩
30、充,由扩充了的facts来选择下一条可用规则对facts再次扩充,直至没有可用规则可选为止。若曾找到一条可用规则对facts进行过一次扩充,则deduce返回t;否则,deduce返回nil。(defun (deduce facts)(prog (progress)loop (cond (step-forward rules)(steq progress t)(t (return progress)(go loop)例例7.67.6 对于动物识别专家系统,若已知的初始事实是F13、F12、F3和F1,应用正向推理机deduce,说明推理过程和得出的推理结论。(setq facts (anima
31、l has dark spots)(animal has tawny color)(animal eats meat)(animal has hair)即有facts=(F13 F12 F3 F1)。调用正向推理机(deduce facts),推理过程:执行R1,扩充facts为facts=(M1 F13 F12 F3 F1 )。执行R5,扩充facts为facts=(M2 M1 F13 F12 F3 F1)。执行R9,扩充facts为facts=(H1 M2 M1 F13 F12 F3 F1)。经过4步推理,正向推理终止,推理机函数deduce返回的变量progress的值为t。解释器取当前
32、facts中的第一个元素得出推理的结论是H1,即(animal is cheetah)。7.3.3 反向推理机1 函数函数thenp 函数表达式:(thenp fact rule)函数功能:判断fact是否在规则变量rule中的一条规则的后件中,若是,则函数thenp返回规则后件从fact开始的余下表;否则,thenp返回nil。(defun (thenp fact rule )(member fact (cdddr rule)2 函数函数inthen 函数表达式:(inthen fact )函数功能:从规则库表rules中送出所有的可用规则组成一个可用规则表,表中每个元素是一条可用规则。若规
33、则的后件含有fact,则这条规则是一条可用规则,且函数inthen返回可用规则表。若没有一条可用规则,则inthen 返回空表。(defun (inthen fact )(apply append (mapcar (lambda (rule)(cond (thenp fact rule )(list rule )(t nil )(rules )3 函数函数test-if+函数表达式:(test-if+rule)函数功能:直接或间接地反向推理确认规则变量rule 中的一条规则的前件包含的所有条件是否都为真,若是,则函数test-if+返回t;否则,test-if+返回nil。(defun (te
34、st-if+rule )(prog (ifs)(setq ifs (cdadr rule)loop (cond (null ifs )(return t )(verify (car ifs )(t (return nil )(setq ifs (cdr ifs )(go loop )4 函数函数try-rule+函数表达式:(try-rule+rule)函数功能:若规则变量rule中的一条规则的前件包含的所有条件都能直接或间接地反向推理确认为真,且规则的后件中有不在facts中的结论,则把规则后件中不在facts 中的结论添加到facts中,函数try-rule+返回t;否则,try-rule
35、+返回nil。(defun (try-rule+rule )(and (test-if+rule )(use-then rule )函数函数verify 函数表达式:(verify fact)函数功能:直接或间接地反向推理确认变量fact中的一个假设是否为真,若为真,则函数verify返回t;否则,verify返回nil。(defun (verify fact )(prog (relevant1 relevant2 )(cond (recall fact )(return t )(setq relevant1 (inthen fact )(setq relevant2 relevant1 )(
36、cond (null relevant1)(cond (member fact askes )(return nil )(and (print|IS THIS TRUE:|fact )(read )(remember fact )(return t )(t (steq asked (cons fact asked )(return nil )loop1 (cond (null relevant1)(go loop2 )(try-rule(car relevant1)(return t )(setq relevant1 (cdr relevant1 )(go loop1 )loop2 (cond
37、 (null relevant2 )(go exit )(try-rule+(car relevant2 )(return t )(setq relevant2 (cdr relevant2 )(go loop2 )exit (return nil )6 反向推理机函数反向推理机函数diagnose 函数表达式:(diagnose hypo )函数功能:逐一确定假设表hypo中多个假设的真或假,对确定为真的假设给出屏幕输出说明。(defun (diagnose hypo )(prog (poss)(steq poss hypo )loop (cond (null poss)(print|NO
38、HYPOTHESES CAN BE CONFIRMED|)(return )(verify (car poss )(print|HYPOTHESES|(car poss )(print|IS TRUE|)(setq poss (cdr poss )(go loop )例例5.75.7 对于动物识别专家系统,若用户要求确定的假设是H1,应用反向推理机diagnose确定假设H1是否成立,说明推理过程。解解:使用setq函数把假设H1 赋给假设表 hypo:(setq hypo (animal is cheetah )即有hypo=(H1 )。调用反向推理机(diagnose hypo),推理过程
39、:由(diagnose hypo)先复制poss=(H1),然后调用(verify H1),此时,facts=()。首先调用(recall H1),由于fact=H1,不在facts中,调用(inthen H1),从rules中选出后件含有H1的可用规则只有R9,故 relevant1=relevant2=(R9 )。由于relevant1=(R9)(),调用(try-rule R9),因为R9的前件的全部条件不在facts中,故对H1进行间接反向推理。由于relevant2=(R9)(),调用(try-rule+R9)。它首先调用(test-if+R9 ),把R9的前件包含的全部条件赋给if
40、s,即有ifs=(F12 F13 M1 M2)。在(test-if+R9 )中,将顺序调用:(verify F12)(verify F13 )(verify M1)(verify M2)调用(verify F12),此时,facts=()。首先调用(recall F12 ),由于fact=F12不在facts中,调用(inthen F12),从rules中找不到后件含有F12的可用规则,故relevant1=relevant2=()由于relevant1=(),屏幕出现提示:“IS THIS TRUE:F12”若用户确认F12为真,则把F12加到facts的表头,使facts=(F12)。调用
41、(verify F13),此时,facts=(F12)。类似(verify F12),若用户在屏幕提示:“IS THIS TRUE:F13”的询问下,确认F13为真,则把F13加到facts的表头,使 facts=(F13 F12)。调用(verify M1),此时,facts=(F13 F12)。首先调用(recall M1),由于fact=M1不在facts中,调用(inthen M1 ),从rules中选出后件含有M1的可用规则有R1和R2,故relevant1 =relevant2 =(R1 R2)。由于relevant1=(R1 R2),顺序调用(try-rule R1 )(tuy-
42、rule R2)因为R1的前件条件F1和R2的前件条件F2都不在facts中,故对M1进行间接反向推理。由于relevant2=(R1 R2),顺序调用(try-rule+R1 )(try-rule+R2)。前者首先调用(test-if+R1),把R1的前件条件赋给ifs,即有ifs=(F1)。在(test-if+R1)中将调用(verify F1)。同样,后者将产生调用(verify F2)。调用(verify F1),类似(verify F12),若用户在屏幕提示:“IS THIS TRUE:F1”的询问下,确认F1为真,则把F1加到facts的表头,使facts=(F1 F13 F12)
43、。调用(verify F2),若用户在屏幕提示:“IS THIS TRUE:F2”的询问下,确认F2为真,则把F2加到facts的表头,使facts=(F2 F1 F13 F12)。调用(verify M2),此时,facts=(F2 F1 F13 F12)首先调用(recall M2),由于fact=M2不在facts中,调用(inthen M2),从rules中选出后件含有M2的可用规则R5和R6,故relevant1=relevant2=(R5 R6)。由于relevant1=(R5 R6),顺序调用(try-rule R5)(try-rule R6)因为R5的前件条件F3与R6的前件包
44、含的全部条件F4、F5和F6都不在facts 中,故对M2进行间接反向推理。由于relevant2=(R5 R6),顺序调用(try-rule+R5)(try-rule+R6)前者产生调用(verify F3)。后者产生调用(verify F4)、(verify F5)和(verify F6)。在执行这4个调用时,若用户在相应屏幕提示下分别确认F3、F4、F5和F6为真,则使facts=(F6 F5 F4 F3 F2 F1 F13 F12)。至此,调用(verify H1)执行完毕,屏幕输出:“HYPOTHESES H1 IS TRUE”。由(setq poss (cdr poss)使poss为空表,反向推理机(diagnose hypo )终止。专家系统在交通中的应用事故处理专家系统 知识库,知识库存放的内容有事故交通处理专家的知识和经验,交通事故处理的法规、条例(如道路交通管理条例、治安管理条例、道路交通事故处理办法)、事故案例总结等。数据库模型库存有大量事故模型,每个模型代表一种交通事故专家系统在交通中的应用事故处理专家系统(续)推理机专家系统(续)