zoukankan      html  css  js  c++  java
  • 八卦一下模型验证(三) (g9老大的八卦系列)

    准备八卦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的验证软件开始崛起。

    None
  • 相关阅读:
    jQuery length 和 size()区别
    HTML5中Web Sql学后总结
    HTML5中的history API的理解和使用
    js中同步与异步的理解
    字符编码理解
    excel之VBA总结
    android29之UI控件的抽屉式实现方法之一(DrawerLayout和NavigationView)
    Linux环境下django初入
    Springboot整合MybatisPlus(超详细)完整教程~
    自定义持久层框架设计实现思路
  • 原文地址:https://www.cnblogs.com/yuxc/p/2029761.html
Copyright © 2011-2022 走看看