一、基本概念
模型检测(model checking)是一种很重要的自动验证技术。它最早由Clarke和Emerson以及Quielle和Sifakis在1981年分别提出的,主要通过显式状态搜索或隐式不动点计算来验证有穷状态并发系统的模态/命题性质。由于模型检测可以自动执行,并能在系统不满足性质时提供反例路径,因此在工业界比演绎证明更受推崇。尽管限制在有穷系统上是一个缺点,但模型检查可以应用于许多非常重要的系统,如硬件控制器和通信协议都是有穷状态系统。很多情况下,可以把模型检测和各种抽象与归纳原则结合起来验证非有穷状态系统(如实时系统)。
模型检测的基本思想是用状态迁移系统(S)表示系统的行为,用模态逻辑公式(F)描述系统的性质。这样“系统是否具有所期望的性质”就转化为数学问题“状态迁移系统S是否是公式F的一个模型?”,用公式表示为S╞F。对有穷状态系统,这个问题是可判定的,即可以用计算机程序在有限时间内自动确定。
模型检测已被应用于计算机硬件、通信协议、控制系统、安全认证协议等方面的分析与验证中,取得了令人瞩目的成功,并从学术界辐射到了产业界。
模型检测应用过程中,需要考虑增加效率和减少内存空间需求,此外,需要研究减少模型本身或验证性质的复杂性,主要方法有不同类型的抽象、程序切片、模型分解、验证性质的分解等。
1)抽象的基本方法是抽掉系统中的细节、用尽可能少的状态来刻画系统的动作过程。
2)程序切片的基本十法界将程序中不影响所要验证的性质的语句去年以减少模型的复杂性。
2)模型分解的方法是将一个模型分解成若干部分,或者分别验证,或者提供一个较好的组合方法以降低验证的复杂性。同样,一个需要验证的性质也有可能分解成若干部分,然后分别验证。
二、模型检测的自动化工具
1)SMV-美国CMU大学开发,用于检测一个有限状态系统是否满足CTL(computing tree logic,计算树逻辑)公式,以模块为单位,模块可以同步或异步组合。基本方法是以二叉图表示状态转换关系,以计算不动点的方法检测状态的可达性及其所满足的性质。
2)SPIN-美国贝尔实验室开发,用于检测一个有限状态系统是否满足PLTL(Propositional Linear Temporal Logic,命题线性时序逻辑)公式及其他一些性质。
3)CWB及其不同版本-英国爱丁堡大学及美国北卡大学相继开发,用于检测系统间的等价关系、PRE-ORDER关系及系统是否满足mu演算公式,其建模语言是CCS语言或LOTOS(language of temporal ordering specification)语言,但其建模语言存在局限性且模型检测方法复杂,其应用性与上述两种工具差。
4)Murphi:http://verify.stanford.edu/dill/murphi.html。
ACTL(action based temporal logical基于行为的时序逻辑
谓词逻辑—+模态算子:模态逻辑,模态逻辑有三种常用的:计算树逻辑、命题线性时序逻辑及mu演算,各自有其相应的模态算子,其中,mu演算主要缺点是不易读懂(最小、最大不动点的交错嵌套),但优势在于表示能力比较强,CTL和PLTL都可嵌入到它的真子集中,且相应的子集具有与CTL和PLTL相同的复杂度的模型检测算法。mu演算可作为模型检测的一般框架来研究。
模态算子比如:某个分枝、所有分枝、下一状态等。
三、延伸
模型检验的成功之处在于它用自动搜索代替手动证明来解决验证的问题。模型检验包括三部分:1。基于命题时态逻辑的规范语言,2。表示被验证系统的编码状态机的方法,3。验证算法,对状态空间的智能搜索以确定规范是真还是假。如果规范没有被实现,模型检验能够给出反例。这一条非常重要,因为它帮助我们debug。如图所示。
四、小结
模型检验(model checking)自从1981年提出来以后,受到各种非议。至今28年过去了,才得到了学术界和工业界的广泛关注。这是很正常的。要求一个学术成果马上用于实际,很不现实。中国某些干部就这么急功近利。算法的设计验证包括三步:(1)需求规范;(2)建立可执行的系统模型;(3)开发可扩展的算法,一是去检验需求,二是当需求不能满足时进行诊断。