八卦一下模型验证(三)

CSDN的大大们啊,求求你们了啊。修复这坨不能自动上传图片的错误啊。好像已经三个月了啊。图多的时候发文章真地很痛苦啊。Orz Orz Orz

准备八卦Edmund等人算法时才想起,人1986年成名作是讨论用CTL (Computational Tree Logic) 作规范语言的模型验证算法,而第一篇八卦失心疯只介绍了LTL。虽说也有算法对付Kripke结构上的LTL模型验证,但一来该算法的复杂度为P-SPACE,远不如在Kripke结构上玩儿CTL的算法复杂度来得震撼;二来经典的LTL模型验证方法是将LTL公式转换为Büchi Automata后表演自动机理论与搜索算法的花活。三来俺的初衷是介绍今年图灵奖得主Edmund等人的工作,铺垫半天后突然跳到跟自动机理论有关的LTL模型验证,大有相亲却看中女方伴娘的架势,不够厚道。所以这次先八卦CTL。下次再谈算法。其实Büchi Automata这类有限状态的无穷自动机妙趣无方,足够另开系列细细八卦。

幸好有LTL垫底,CTL也不难。同LTL一样,CTL也支持时序操作符G, F, X, U。不同的是,CTL规定,这些时序操作符前必须加上路径量词A或者E。路径量词A表示从当前状态开始所有的路径,路径量词E则表示从当前开始某些路径。这同一阶谓词逻辑里的全称量词¼以及存在量词½类似。将A、E同G、F、X、U结合起来,我们就有了如下的基本操作符:

  • AG(φ): 在任何路径上,公式φ永远为真。
  • AF(φ): 在任何路径上,公式j在某个时刻一定会为真
  • AX(φ): 在任何路径上,下一个时刻公式j为真
  • A(φ U y):在任何路径上,公式j一直为真,直到公式y为真
  • EG(φ): 至少在一条路径上,公式φ永远为真。
  • EF(φ): 至少在一条路径上,公式j在某个时刻一定会为真
  • EX(φ): 至少在一条路径上,下一个时刻公式j为真
  • E(φ U y):至少在一条路径上,公式j一直为真,直到公式y为真

下面有一堆图示。每幅图都代表系统状态的转移。每坨节点表示系统在某一时刻的状态。路径表示系统状态在不同时刻间的转移。当前状态是每坨状态图的根节点。当p在节点代表的状态里为真时,该节点涂成白色。如果p在节点代表的状态里为假,该节点涂成黑色。节点涂成灰色,表示我们不关心p的值—p可以为真也可以为假(是滴,排中律在这里不重要。去掉排中律,我们就得到了Intuitionistic Logic。不过这是后话了)。

clip_image005

从上图可以看出,CTL可以用来描述未来的多种可能性。系统在每一时刻都可能发展多个平行小宇宙。换句话说,在每一时刻系统的未来都可能“分叉”。所以CTL属于分支时间逻辑(Branching Time Logic)。因为节点可能分叉,CTL计算的结果是棵树。这也是CTL全称Computational Tree Logic的由来。相比之下,LTL总是同时描述单条路径的情况。因此,可以把LTL计算的结果是一个集合。举个例子。假设下图是系统的状态转换。标签A,B,C指代每坨状态。如果状态下有字母P,则表示P在该状态为真。否则表示该状态为假。

clip_image007

如果用LTL描述这套系统,我们只关心单个路径。所以可能的情况无非是在最左边的节点陷入循环:Aw(这里的指数符号w表示A无限重复),要么是从左边开始,经过一定循环后,在最右边陷入循环:AnBCw。换句话说,我们可以判定:不管哪条路径,p最终会永远为真。用LTL的公式表达就是:FG p。

用CTL描述上面的系统就要复杂多了。比如在节点A,任意时刻都面临两个选择:要么继续在A循环,要么到B。所以在CTL的描述下,系统是一颗无限展开的树。我们可以用CTL判定在任何路径上,最终某条分支 上p在所有状态上都为真。用公式表达就是:AF EG p.

clip_image008

初学CTL和LTL时,容易错误地以为CTL是LTL的超集 – 在LTL公式的操作符前加上路径量词A不就是CTL了?可惜数学就是奇妙得让人沮丧。就用上面的系统作例子。我们找不到对应LTL描述FG p的CTL公式。给FG p加上路径量词,我们得到AF AG p。可惜AF AG p在上述系统中不成立,因为不管在哪条途径上,我们都可以拐到节点B上,使得AG p为假。那LTL是不是CTL的超集嗫?很可惜,也不是。比如AG EF p, 在LTL里就找不到对应表达。

有不兼容,便有比较。有比较,便有人要分个高下。于是长达30年的LTL vs. CTL辩论便从1977年Pnuelli发表那篇时序逻辑的论文时开始。Flame war不是程序员的专利。总的来说,从逻辑的角度看。两种语言各有长短。实际用于模型验证时,众多老大的意见是LTL的表达能力更强。但从计算的角度看,实现CTL模型验证相对简单。最后的结果是,模型验证早期,弱即是强的KISS原则占了上风,以SMV为代表的CTL模型验证软件占统治地位。不过风水轮流转,后来大家又发现LTL写的系统描述更容易理解,再加上LTL模型验证的算法有长足进步,Cadence’s SMV和SPIN这类用LTL的验证软件开始崛起。

阅读更多
文章标签: 八卦 算法 J# F#
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭