论文原文.docx
- 文档编号:23753961
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:31
- 大小:33.54KB
论文原文.docx
《论文原文.docx》由会员分享,可在线阅读,更多相关《论文原文.docx(31页珍藏版)》请在冰豆网上搜索。
论文原文
基于算子分量矩阵模型的IMP程序诊断
第一章绪论
1.1引言
智能诊断是人工智能研究中的一个重要领域。
这个研究领域自二十世纪七十年代初开始形成[1],在最近的三十年取得了飞速的发展,因为其具有广泛的实用性,受到各方面研究者的重视,至今仍是人工智能中十分活跃的领域。
智能诊断系统从本质上来说是基于知识的系统,诊断系统的质量主要依赖于所使用的知识库的质量。
从所使用的知识库的类型来说,智能诊断系统可以分成两类,一类是基于经验的诊断系统,另一类是基于模型的诊断系统。
基于经验的诊断系统使用的是经验知识,什么是经验知识?
就是可以根据系统的表现直接得出故障或可能故障的结论,这是从经验中得出的。
而基于模型的诊断系统,使用的是关于模型本身的知识,它是通过对模型的观察和预期输出的差异,并根据模型的内部结构和行为通过计算和推理演算来判断那个部件或哪些部件是异常的。
早期的智能诊断是专家系统中关于人类疾病的诊断,美国斯坦福大学的MYCIN系统是这类诊断系统的先驱和代表[1]。
此后,人们又研制了各种各样的诊断专家系统。
这类系统都是基于经验的诊断系统,系统的知识库存贮的是专家关于诊断领域的知识,为研制这类系统,人们需要把专家知识收集起来,转换成计算机能够使用的形式,诊断的输入信息是病人的症状和化验结果,诊断的结果是指出待诊断对象可能患有的某种疾病,给出治疗意见。
电子,电器,软件等产品的故障诊断在诊断的所依据的知识上与诊断的目标上与上述的诊断有很大的不同,为解决这类产品的智能诊断问题,Reiter提出了基于模型的诊断[2],以后的许多研究者又做了大量的后续研究工作[3][4][5][6],使其成为人工智能的一个热门研究方向。
这类系统的知识库主要使用系统的结构性知识[4][7],也就是关于待诊断系统的组成,系统各元件的功能,各元件之间的连接知识。
诊断系统的主要思想[8][9][10]是:
利用系统的结构性知识构建出系统的模型,在给定系统输入的情况下,系统的模型会产生预期的输出,如果这个预期的输出与观察到的实际系统的输出不同,则提出了诊断问题。
诊断的目的是找出那些可能有毛病的元件,然后通过更换有毛病的元件来修复系统。
基于模型诊断又可细化为诊断的产生,诊断的测试和诊断的鉴别等步骤。
值得注意的是,模型是一个很广义的概念,关于系统的结构模型称为模型,而关于系统的故障模型也可以称为模型,但两者是截然不同的,后者的故障模型实际使用的还是基于经验的知识,它描述的是系统的表现直接到它的故障结论(不是通过系统描述推理得到的,而是凭经验得到的)的一个基于经验的推理模型,不是关于系统本身结构知识的。
有一些学者将基于故障模型的诊断,如故障决策树模型等也归到基于模型的诊断,这是不严格的。
本文所说的基于模型的诊断均特指基于系统结构模型的诊断,这与国际上公认的基于模型的诊断的定义也是相符的。
以下所讨论的模型都是关于系统结构性知识的模型。
1.2基于模型的诊断
基于逻辑的模型诊断方法中,不仅用一阶逻辑来表示目标系统的结构和行为,还用它来表示刻画特定诊断问题的观察集。
这里的模型是指目标系统的表示,而不是指逻辑上的关于一组公式的可满足的解释。
这种基于逻辑的方法的一个前提条件是,模型能够正确描述目标系统的结构和行为,或者故障的因果关系。
从逻辑的角度上,可以将“诊断”认为是对所观察到的行为的一种“解释”,目前主要有两大类关于这种“解释”的概念,一类是基于逻辑一致性的概念(基于一致性的诊断),一类是溯因的概念(溯因诊断)。
基于一致性的诊断(Consistency-baseddiagnosis)是由Reiter于1987年首次提出的[2]。
该方法用一阶逻辑子句的集合SD表示目标系统的描述,SD包含了刻画系统部件间的连接关系的公理集和描述每一个部件行为的公理集。
用谓词ab(.)表示部件是异常的,那么对于部件c的正确行为必须加上一个前件Øab(c),即用蕴含式Øab(c)®Output=f(Inputs)来表示部件c的正确行为。
用观察集OBS表示系统系统的异常行为。
在假定所有的部件都正常工作下,如果OBS与SD不一致,就意味着观察行为与预期行为之间有差异。
一个诊断就是这样的一个关于部件的集合D,在该集合内的部件是异常,而其他部件都是正常的情况下,观察OBS和系统描述SD是一致的。
设系统的所有部件的集合为COMPS,则形式化描述如下:
定义1.1[3]设DÍCOMPS,关于(SD,COMPS,OBS)的基于一致性诊断为D(D,COMPS-D),使得SDÈOBSÈ{D(D,COMPS-D)}是一致的。
溯因推理是指在某个域给定的事件集合中产生一个解释的过程。
溯因诊断起源于一个基于疾病和征状的因果模型的医疗诊断方法。
将这种方法推广到基于逻辑公式的器件的诊断上后,模型T就是指包含了那些描述故障因果关系的公理。
故障对应于一个特定的表征或假设的集合。
Poole首先给出了溯因诊断的定义。
定义1.2[11]设E是一个极小的关于故障原因的假设集合,T是系统的模型,OBS是观察集。
我们称E是一个溯因诊断,当且仅当EÈT是一致的,且EÈTÞOBS。
为了将基于一致性的诊断和溯因诊断统一起来,将故障产生原因的假设集也用非正常部件的集合D表示,模型用SD表示,Reiter对溯因诊断给出了新的定义如下。
定义1.3[12]设DÍCOMPS,关于(SD,COMPS,OBS)的溯因诊断为D(D,COMPS-D),使得:
SDÈ{D(D,COMPS-D)}是一致的,且SDÈ{D(D,COMPS-D)}ÞOBS。
Console和Torassi将定义1.1和定义1.3统一起来,建立了一个基于模型的诊断的定义谱系:
定义1.4[13]设O’ÍOBS,DÍCOMPS,称D(D,COMPS-D)为关于(SD,COMPS,OBS)的基于模型的诊断,当且仅当
(1)OBSÈ{D(D,COMPS-D)}是一致的。
(2)SDÈ{D(D,COMPS-D)}ÞO’。
从以上定义可以看出,当O’从f到OBS变化时,可得到从基于一致性诊断到溯因诊断一系列不同的逻辑定义。
由此可见,溯因诊断对诊断空间的限制最强,即要求所有观测被逻辑推出,而基于一致性的诊断限制最弱,即不要求任何观测被逻辑推出。
基于模型诊断是智能诊断在思想上的一个大的突破,它的优点是:
(1)智能诊断是依赖知识的系统[7][14][15][16],而基于经验的诊断仅仅使用了专家的知识,缺乏对系统结构描述的知识。
这些知识在某些诊断中占有十分重要的地位。
在缺乏这些知识的情况下,无论我们对基于经验的诊断系统做何种改进,都不会对诊断系统的质量有显著的提高。
因此,基于模型的诊断是我们在提高诊断系统质量时必须认真考虑的有效途径。
(2)基于经验的诊断类似于中医的诊断,给予模型的诊断类似于西医的诊断。
在中医的诊断中,医生的诊断全凭经验,不考虑人的身体结构,不考虑人体各器官的功能和连接,因此也就无法像西医那样对病人做手术治疗,例如换心,换肾等手术。
而对于电子,电器,软件产品来说,这种诊断的思路是不适用的。
对电子,电器产品来说,诊断的目的是找出有毛病的元件,然后更换这些元件,使系统恢复正常工作。
这类诊断需要大量的关于系统结构的知识。
而模型就是对系统结构性知识的描述[7]。
(3)当前,电子,电器,软件等产品的更新换代的步伐非常迅速,这类产品的生命周期一般都很短。
而基于经验的诊断主要依赖于专家知识。
专家知识的形成,总结和积累需要一个较长的过程。
等到专家知识积累起来,再依据这些知识研制出诊断系统,它所要诊断的产品可能已经淘汰了,或者已经过时了。
而对基于模型的诊断而言,只要有了系统的设计,就可以从设计抽取出系统的模型,把系统的模型嵌入到诊断系统中,就可以形成对新产品的诊断系统。
于是,在新产品推向市场的同时,产品的诊断软件系统就可以同时开发并投入使用。
(4)基于模型的诊断依据待诊断系统的结构知识,其诊断结果是指出那些功能上有问题的元件,对系统故障能给出合理的解释。
有利于系统的修复。
1.3基于模型的诊断面临的问题
虽然基于模型的诊断有许多优点,作为人工智能研究的一个新的领域,它也面临一些新的问题和挑战,期待着我们去解决。
现在这个领域存在的问题是:
(1)模型的构建问题
选择合适的模型是基于模型的诊断的关键[17]。
这是因为如果模型正确,那么观测和预言行为之间的所有差异都是源于设备的故障部件,并且通过沿着具有因果关系的路径往回跟踪,一定能找到故障部件。
但从理论上看,模型永远是不完备的,它只是设备的近似,因此必须在复杂性和完备性之间进行权衡。
要想完备,诊断推理必须沿着每一个可能的相互作用路径考虑所有可能出错的东西。
但这种推理无疑复杂性高。
为此,必须作出某些简化假设(比如,忽略某些路径),但这样就要失去完备性。
因为有可能故障正出在被忽略的路径上,这样,系统就永远不会诊断出该类故障部件。
因此,有待解决的问题是找到能帮助我们选择、组织简化假设的一般性准则。
比如,一些应用指出虽然定性模型[18][19]很有用,但某些形式的定量推理也很重要[20][21],尤其是在故障检测和诊断辨别阶段。
因此,研究定性和定量推理(或半定量推理)的结合是很重要的。
(2)动态系统诊断问题
复杂性尤其体现在具有动态行为的设备中,在模型化、预测机制、推理机制上都需比诊断简单的静止设备复杂得多,对动态设备诊断方面的研究虽然有了一定的成果[22][23],但这些工作主要集中于从模型化角度减少行为预测的复杂性——动态设备诊断的一个主要困难。
然而,还存在其它的困难,如可能得不到辨别诊断所需的足够信息;如何选择合适的探测点;如何处理相互依赖的故障等至今,动态设备的诊断仍是基于模型诊断领域有待研究的问题之一。
(3)复杂系统的诊断效率问题
基于模型的诊断对于大型复杂系统,诊断范围太大,给诊断鉴别造成了困难,诊断效率偏低,因此使得基于模型的诊断还很难投入到实际的使用。
(4)难以利用不确定性知识和经验知识的问题
在诊断中不能使用经验知识,使诊断的知识在经验方面有很大缺陷;在诊断中不能使用不确定知识;诊断的精度不够,诊断的结果给出一些怀疑是有毛病的元件集合(诊断),但是给出的诊断集合一般说来都比较多,又没有一个可靠性度量对这些诊断集合加以区别,增加了后面的诊断鉴别的难度,给用户修复造成了困难。
(5)领域独立性问题
基于模型的诊断是独立于设备的。
我们所做的任何一件事都不是针对某一特定的设备,比如,只要给出一不同电路的新描述,可马上使用同样的推理过程工作。
然而,我们对于这些技术有多大程度的领域独立性却不很清楚。
VMBD项目的成功已揭示出要想在新的应用领域使用VMBD技术[85],需要研究者和使用者双方的共同努力、相互理解和相互协调,还需要AI其它领域研究者的合作。
1.4基于模型诊断的研究和应用现状
基于模型的诊断技术在近几年发展非常迅速,也取得了很多成果。
在模型构建方法上,提出了分级结构抽象方法[24][25][26]、基于状态转换的历程重构方法[27][28]、依赖于任务的定量抽象方法[29]以及利用过程代数描述方法[30][31]等。
在基于模型诊断的理论基础和推理方法上,提出了基于第一原理的诊断推理方法[33]、基于因果关系的诊断方法[34][35][36]、约束模型诊断方法[37][38]、基于模型的中心诊断[39][40]以及模糊诊断方法[41][42][43][44]等。
现在,基于模型的诊断已应用于很多不同的领域。
除了电路故障查找系统和医学诊断系统外,基于模型的诊断已经向更实用化的方向发展,如大型VHDL程序的故障检测与定位[45],大型异步离散事件系统的诊断[46][47][48],网络通讯故障诊断,汽车故障诊断[49],燃气轮机监视[19][50][51]等。
最近几年,许多学者将基于模型诊断方法应用于汽车诊断上,这是一个很有前途且富有挑战性的领域。
Mosterman等在1998年提出了诊断雪佛莱发动机的方法[86],在VMBD项目进行过程中设计出了RAZ’R,它是一个模型化和诊断的开发和运行环境,已被保时捷和沃尔沃采用。
VMBD项目的目标就是将基于模型的诊断技术既应用于在生产车间内的汽车,又应用于正在行驶的汽车。
它是一个欧盟基金项目,合作者包括汽车制造商、供应商和大学。
这一项目推动了基于模型诊断的发展,它使得生产商和供应商有机会来考察基于模型的诊断技术。
我国也有一批学者从事这方面的研究,如清华大学应明生[52]研究了诊断知识库语义说明,以及在诊断知识库的转换和合并后如何为新的诊断知识库构造新的合适的诊断方法问题。
他的研究成果发表在国际顶级人工智能杂志《ArtificialIntelligence》上,这也是近年来我国在人工智能领域最高水平的研究成果。
中国科学院软件研究所的刘剑和林惠民[53]研究了诊断信息的自动生成问题。
姜云飞教授在前几年带领他的博士生们完成了两个有关基于模型的诊断的国家自然科学基金项目,姜云飞教授的一些博士生如今在该领域非常活跃,比如欧阳丹彤[39][40]和李占山[15][54](吉林大学)研究了各种诊断关系和诊断分解问题,陈荣(大连海事大学)在约束诊断问题[58][59]、程序诊断[60][61]方面发表了一系列高水平的论文,林笠[55][56][57](现在澳洲)在极小碰集的求解方法上也发表了一些重要成果。
1.5基于模型的诊断在程序诊断上的应用
基于模型的诊断比较多地应用在物理元件组成的系统的诊断上,利用模型诊断技术来进行程序诊断却是一个较新的课题。
由于程序逻辑模型的复杂性和多样性,使得将模型诊断技术应用于程序诊断上增加了很多难度。
基于模型的程序诊断与传统的程序调试技术的不同在于模型诊断技术更多的利用了程序的逻辑模型的信息,更少的依赖于人工的干预,并且可以发现更多的隐藏的逻辑上的错误。
这对于程序正确性的保证有着传统的调试方法不可替代的作用。
Console、Friedrich和Dupre于1993年首先提出将基于模型的诊断方法应用在程序调试中[62],以逻辑程序为诊断对象,基本思想是通过增加、删除和替代程序中的子句,使得目标程序能够正确回答某个测试询问。
这项研究以逻辑程序的描述性语言特性和清晰的语义为基础做了深入的试验,但是不能够应用在大型程序上。
1999年Mateis,Stumptner和Wotawa研究了面向对象的程序设计语言Java的模型诊断方法[63]。
目前对于程序诊断的方法主要建立在程序分片[64]的思想基础上,主要有基于依赖的模型和基于值的模型[65][66][67]。
2004年陈荣等将值依赖扩展到标记依赖[94],进一步改善了诊断效果。
近年,基于模型的程序诊断已更加趋近于实用,一些学者对面向对象的程序的诊断方法进行了研究。
从2004年起,RongChen(陈荣)和Wotawa等对Java程序的诊断进行了研究,提出了Java程序的对象存储模型[87][88],研究了其抽象模型[89]和更多的程序特性,如对别名[93]和数据结构类错误[90][91][92]的诊断,对Java程序的诊断取得了较大进展。
1.5.1基于依赖的模型
对于一个命令式程序,其依赖模型[65][67]定义了一组函数依赖(),表示变量的第i次出现,表示的取值所依赖的变量出现的集合。
如果中某个变量出现用于(在赋值语句中)计算的值,则称为数据依赖;如果中的某个变量出现在某一选择或循环条件中,该条件影响对的值的计算,则称为控制依赖。
比如,对于如下程序(如图1.1):
if(from£to)then
{start:
=from;
stop:
=to}
else
{start:
=to;
stop:
=from};
i:
=start;
s:
=0;
while(i£stop)do
{s:
=s+i;
i:
=i+1}
图1.1一个命令式程序例子
该程序的依赖模型可以用下图(如图1.2)表示。
通过对依赖模型图的搜索,我们可以得到某个变量的第i次出现的取值相关(具有数据依赖或控制依赖关系)的从入口开始的所有语句的集合,这些语句的集合也即是关于该变量第i次出现的静态程序分片,如果对该变量第i次出现的实际值的观察和期望的取值不一致,则该分片构成一个冲突集。
通过对这样一些冲突集求极小碰集,可以得到对该程序的极小诊断。
在基于依赖的模型中,将一条语句作为一个诊断部件,该模型可以从对源代码的分析得到,但是该模型的表示太过复杂,特别是对于有多个循环或分支语句嵌套的情形,更加难以描述。
有些学者采用层次超图的表示方法,但是该方法仍然不够简洁和直观。
本文提出的用算子分量矩阵的建模方式大大简化了依赖关系的表示,且非常直观和清晰。
图1.2基于依赖的模型
1.5.2基于值的模型
基于值的模型需要分析程序的语义,建立基于语义的逻辑模型,因此该逻辑依赖于具体的程序设计语言,并由诊断程序通过逻辑推理方法进行求值分析。
在基于值的模型[65][67]中,表达式和语句都作为诊断的部件,并且用逻辑公式的形式来表示表达式和语句的语义。
当某两个部件对应的表达式或语句之间有信息流存在时,则此两者间有一连接。
对图1.1所示的程序,其基于值的模型如图1.3所示。
根据程序的语义,可以在基于值的模型中显示了所有可能的求值轨迹,在某个特定的测试用例下,通过求值轨迹可以得到关于某个变量出现的一个动态程序分片。
从而通过动态程序分片来可以进行诊断。
基于值的模型通过求值关系给出对被观察的变量出现的相关求值代码,比静态的依赖分析得到的程序分片更小,因而能得到更加精确的诊断。
图1.3基于值的模型
1.6基于模型的程序诊断存在的问题
目前对于程序模型的分析都是建立在对程序元素的语义分析的基础上的。
基于依赖的模型是根据变量间的数据依赖和控制依赖关系建立分片(即冲突集),从而得到诊断。
基于值的模型是根据变量值的变化轨迹建立分片,从而得到诊断。
前者对于逻辑关系紧密的程序,通过依赖关系求得的程序分片可能范围很大,有的甚至覆盖了整个待诊断程序。
如果程序的每一条语句都是候选的诊断,那么其实相当于没有得出任何诊断。
而后者其实是一种动态建模的方法,这种方法的致命弱点在于,动态模型太依赖于测试用例,不同的测试用例对应的求值轨迹可能差异很大。
而且由于控制语句或控制变量求值的错误使得求值轨迹本身就不正确,从而失去了诊断的依据。
导致诊断结果不完备或者不正确。
基于模型的诊断的一个前提条件要求给出的模型是正确的(不要求是完备的),因为这个模型是我们诊断的依据。
但是目前在所有基于模型的程序诊断方法中,这个模型都是在被诊断的程序本身的基础上建立的,因此模型本身是不正确的,而诊断的依据实际上是一个隐含的黑盒模型,即所给定的测试用例的输入和期望输出所隐含的一个黑盒模型。
我们不能利用该模型的内部结构和各元素之间的关系来分析。
那为什么这些方法又可以实现基于模型的诊断呢?
它实际上采取的是一种变通的方式,即反过来将预期输出作为“观察”,而将模型的输出(这里模型的输出和程序的输出是一致的,即程序的实际输出)作为“期望输出”,这样的话我们就可以将这个模型作为一个“正确”的模型,通过比较“观察”和“期望输出”的不一致来得到冲突集(程序分片),从而得到诊断。
针对在程序诊断中的这种特殊情况,WolfgangMayer对基于模型的诊断在程序诊断中的定义作了一些修改[68],即观察OBS中含有测试用例的期望结果,实际的结果从错误的程序中获得。
同时,OBS不只限制为纯粹的输入输出说明,也包含了中间结果。
我们针对目前基于模型的诊断在程序诊断领域中的问题,提出了一种全新的模型作为一种解决方案,即基于算子矩阵模型的程序诊断模型[69][70]。
它也是从待诊断的源程序导出的,但它是一个形式化的模型,是对源程序的结构,也即变量空间的转换过程的一种抽象,只有当每个形式算子被赋以确定的算子含义,才可以得到确定的输出。
源程序只是对该模型的一个解释,同构的假定意味着存在一个“正确”的程序也可以是对该模型的一个解释。
我们的目的就是怎样通过这个形式化的模型以及输入输出样本,取得一个正确的解释,然后将这个正确的解释同源程序对应的解释进行比较,从而得出程序的诊断。
我们使用这种建模方法,在同构假定的基础上,建立了模型与正确程序间的一个对应关系,从而奠定了我们建模的“依据”,是经典的建模方法不具备的。
第二章IMP程序设计语言及其语义
2.1IMP程序设计语言的语法
为了便于今后的讨论,我们首先选用一种最简单的命令式语言IMP编写[71]的程序来作为我们诊断的对象,将来可以再逐步扩展这种语言,并使我们的诊断能力逐步增强。
本章的内容大部分节选自文献[71],作为一个背景知识,以下不做特别的引用。
IMP语言的语法集合有:
l数集N,它是正整数()、负整数()和零(0)的集合。
l真值集T={true,false}
l存储单元集Loc
l算术表达式集Aexp
l布尔表达式集Bexp
l命令集Com
我们使用BNF的一种变形形式,作为书写这些语法集合的元素的构造规则,构造规则形如:
如果和是算术表达式,则也是算术表达式。
显然符号和被用于表达任意算术表达式,称和为元变量。
我们用元变量来表示语法集合的元素。
在描述IMP的语法中还约定几个特定的字母:
l表示数集N中的元素
l表示存储单元集Loc中的元素
l表示算术表达式集Aexp中的元素
l表示布尔表达式集Bexp中的元素
l表示命令集Com中的元素
IMP语言完整的构造规则如下:
Aexp:
Bexp:
Com:
2.2IMP的操作语义
一般来说,人们在理解用IMP编写的程序的行为时脑海里都会有一个直观的模型。
这些模型的思想主要是:
存储单元的内容决定了状态。
对于每个状态,算数表达式的求值结果都是一个整数,布尔表达式的求值结果都是一个真值。
求值的结果影响命令的执行,从而引起状态的变化。
本文对IMP的行为的形式化描述也体现了这一思想。
我们首先定义程序运行的状态,然后定义算术表达式的求值,最后定义命令的执行。
2.2.1算术表达式的求值
状态集合S由存储单元集到数集的函数组成。
于是,是状态下存储单元X的值或内容。
用序偶来表示在状态下表达式等待求值,并把这个序偶与数集间的求值关系定义为
它表示在状态下表达式的求值结果是。
程序偶为算术表达式的格局。
语法制导下算术表达式的求值关系按以下规则指定。
(规则的横线上方为前提,下方为结论。
没有前提的规则称为公理。
)
整数求值:
存储单元求值:
加法求值:
,其中是与的和
减法求值:
,其中是与的差
乘法求值:
,其中是与的积
2.2.2布尔表达式的求值
布尔表达式的求值为真值(true,flase)的规则如下:
,如果等于
,如果不等于
,如果小于等于
,如果大于
,当且时为true,否则为false
,当或时为true,否则为false
2.2.3命令的执行
原子命令:
顺序命令:
条件命令:
while循环命令:
2.3IMP的指称语义
指称语义在更抽象的层次来描述程序的语义,我们用状态集上的部分函数来表示命令的指称,并称这种新的语义描述风格为指称语义。
它可以描述包括IMP这种简单程序设计语言在内的几乎所有的程序设计语言。
我们用结构归纳法定义语义函数:
例如,对于命令,当我们给每条命令c定义一个部分函数时,假定c的子命令已有定义
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 论文 原文