【面向计算机的数理逻辑/软件理论基础笔记】面向CTL的模型检测

198 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

@TOC

模型检测

  • 定义:在定理证明中,形式验证把待证明的性质直接作为一个数学定理来证明,也称为演绎式验证。
  • 基本思想:和逐一证明一个结构下所有数据在一个公式下是否都正确相比,直接检验这个结构是否满足该公式来说更加容易。
  • 原理:模型通常是迁移系统或有限状态的自动机,用M\mathcal{M}表示,系统的性质用逻辑公式进行规约,用ϕ\phi表示,时态逻辑是极其重要的性质规约逻辑。把系统的性质用模型进行规约,表示为Mϕ\mathcal{M} \vDash \phi,核心是有穷状态空间上的遍历策略和算法。如果Mϕ\mathcal{M} \vDash \phi成立,则输出为Yes,如果Mϕ\mathcal{M} \vDash \phi不成立,则输出为No。

标记算法

  • 通俗理解:就好像一个适配器,为了让CTL公式ϕ\phi能够更好的用于模型检测,通过改变连接词的方式,将其转换为等价公式,有利于模型检测。需要考虑的连接词为,,,AF,EU,EX\top,\perp,\wedge,AF,EU,EX,当公式中出现这样的连接词时,我们才会考虑用标记算法让公式更有助于模型检测。
  • 基本思想:若状态ss满足ϕ\phi,则在ss处进行标记公式ϕ\phi,具体是以ϕ\phi的结构进行标记。
  • 定义:设ψ\psiϕ\phi的子公式且满足ψ\psi的所有直接子公式的状态都已标记了,现在来标记ψ\psi,标记算法如下:
    • \perp:没有状态用\perp标记
    • pp:若pL(s)p \in L(s),则状态ss标记pp
    • ψψ\psi \wedge \psi:若ss已标记了ψ1\psi_1ψ2\psi_2,则ss标记ψψ\psi \wedge \psi
    • ¬ψ1\neg \psi_1:若ss没有标记ψ1\psi_1,则ss标记¬ψ1\neg \psi_1
    • AFψ1AF \psi_1
      • 若状态ss标记了ψ1\psi_1,则状态ss标记AFψ1AF \psi_1
      • 若状态ss的所有后继都标记了AFψ1AF \psi_1,则状态ss标记AFψ1AF \psi_1,直到不再发生变化
    • E[ψ1Uψ2]E[\psi_1 U \psi_2]
      • 若状态ss标记了ψ2\psi_2,则状态ss标记E[ψ1Uψ2]E[\psi_1 U \psi_2]
      • 若状态ss标记了ψ1\psi_1ss有一个后继标记了E[ψ1Uψ2]E[\psi_1 U \psi_2],则状态ss标记E[ψ1Uψ2]E[\psi_1 U \psi_2],直到不再发生变化
    • EXψ1EX \psi_1:若状态ss的一个后继标记了ψ1\psi_1,则状态ss标记EXψ1EX \psi_1

不动点

  • 单调函数:设SS是一状态集,2S2^S是S的幂集,F:2S2SF:2^S \to 2^S是一函数
    • FF是单调函数,若X,Y2S\forall X,Y \in 2^S,当XYX \subseteq Y时,有F(X)F(Y)F(X) \subseteq F(Y)
    • SS的子集XX称为FF的不动点,即F(X)=XF(X) = X
  • 符号Fi(X)F^i (X)表示函数FF作用在集合XXii次,即 F(X)={X,i=0F(Fi1(X)),i1F(X)= \left\{\begin{matrix} & X,&i=0 \\ & F(F^{i-1}(X)),&i\geq 1 \end{matrix}\right.
  • Knaster-Tarski不动点定理:设SS是含有n+1n+1个元素的集合,F2S2SF:2^S \to 2^S是单调函数,则Fn+1(ϕ)F^{n+1}(\phi)FF的最小不动点,Fn+1(S)F^{n+1}(S)FF的最大不动点
  • 范例:设Y2S,s0SY \in 2^S,s_0 \in S,定义F(Y)=Y{s0}F(Y) = Y \cup \{s_0\},则FF2S2^S上的单调函数,且对于任一YSY \subseteq S都有F(Y)F(Y)FF的不动点。最小不动点是{s0}\{s_0\},最大不动点是SS
  • 定义:给定模型M=(S,,L)\mathcal{M} =(S,\to,L),设YSY \subseteq S。定义:
    • pre(Y)={sS存在sS,使得sssY}pre_\exists (Y) = \{s \in S | 存在s' \in S,使得s \to s'且s' \in Y \},即若ss有一个后继在YY中,则sspre(Y)pre_\exists (Y)中。
    • pre(Y)={sS对于所有sS,若sssY}pre_\forall (Y) = \{s \in S | 对于所有 s' \in S,若s \to s'则s' \in Y \},即若ss所有后继都在YY中,则sspre(Y)pre_\forall(Y)中。

    prepre表示沿迁移关系向后移动

  • SATAFSAT_{AF}定理:
    • ϕ\phi是一个CTL公式,M=(S,,L)\mathcal{M} =(S,\to,L)是一个模型,其中,SS是含有n+1n+1个状态的集合。
    • 定义函数F:2S2SF:2^S \to2^SF(X)=SAT(ϕ)pre(X),X2SF(X)=SAT(\phi) \cup pre_\forall (X),\forall X \in 2^SSATAF(ϕ)=Fn+1(ϕ)SAT_{AF}(\phi)=F^{n+1}(\phi),即SATAF(ϕ)SAT_{AF}(\phi)FF的最小不动点。
  • SATEUSAT_{EU}定理:
    • ϕ,ψ\phi,\psi是CTL公式,M=(S,,L)\mathcal{M} =(S,\to,L)是一个模型,其中,SS是含有n+1n+1个状态的集合。
    • 定义函数G:2S2SG:2^S \to2^SG(X)=SAT(ψ)SAT((ϕ)pre(X)),X2SG(X)=SAT(\psi) \cup SAT((\phi) \cap pre_\exists(X)),\forall X \in 2^SSATEU(ϕ,ψ)=Gn+1(ϕ)SAT_{EU}(\phi,\psi)=G^{n+1}(\phi),即SATEU(ϕ,ψ)SAT_{EU}(\phi,\psi)GG的最小不动点。
  • SATEGSAT_{EG}定理:
    • ϕ\phi是CTL公式,M=(S,,L)\mathcal{M} =(S,\to,L)是一个模型,其中,SS是含有n+1n+1个状态的集合。
    • 定义函数F:2S2SF:2^S \to2^SF(X)=SAT(ϕ)pre(X),X2SF(X)=SAT(\phi) \cap pre_\exists (X),\forall X \in 2^SSATEG(ϕ)=Fn+1(ϕ)SAT_{EG}(\phi)=F^{n+1}(\phi),即SATEG(ϕ)SAT_{EG}(\phi)FF的最大不动点。

CTL模型检测算法的伪代码

  • 基本标记算法的伪代码:
    • 函数SATSAT:将CTL公式作为输入并返回满足该公式的状态集合。 function SAT(ϕ)begin case ϕ is :return S ϕ is :return ϕ ϕ is automic:return ϕ ϕ is ¬ϕ1:return SSAT(ϕ1) ϕ is ϕ1ϕ2:return SAT(ϕ1)SAT(ϕ2) ϕ is ϕ1ϕ2:return SAT(ϕ1)SAT(ϕ2) ϕ is ϕ1ϕ2:return SAT(¬ϕ1ϕ2) ϕ is AXϕ1:return SAT(¬EX¬ϕ1) ϕ is EXϕ1:return SATEX ϕ is A[ϕ1Uϕ2]:return SAT(¬E[¬ϕ2U(¬ϕ1¬ϕ2)]EG¬ϕ2) ϕ is E[ϕ1Uϕ2]:return SATEU(ϕ1,ϕ2) ϕ is EF(ϕ1):return SAT(E(ϕ1)) ϕ is EG(ϕ1):return SAT(¬AF¬ϕ1) ϕ is AF(ϕ1):return SATAF(ϕ1) ϕ is AG(ϕ1):return SAT(¬EF¬ϕ1) end caseend function  \begin{aligned} &function \ SAT(\phi)&\quad\quad\quad\quad\quad\quad& \\ &begin \\ &\quad \ case \\ &\quad\quad \ \phi \ is \ \top:return \ S \\ &\quad\quad \ \phi \ is \ \top:return \ \phi \\ &\quad\quad \ \phi \ is \ automic:return \ \phi \\ &\quad\quad \ \phi \ is \ \neg \phi_1:return \ S - SAT(\phi_1)\\ &\quad\quad \ \phi \ is \ \phi_1 \wedge \phi_2:return \ SAT(\phi_1) \cap SAT(\phi_2)\\ &\quad\quad \ \phi \ is \ \phi_1 \vee \phi_2:return \ SAT(\phi_1) \cup SAT(\phi_2)\\ &\quad\quad \ \phi \ is \ \phi_1 \to \phi_2:return \ SAT(\neg \phi_1 \vee \phi_2)\\ &\quad\quad \ \phi \ is \ AX \phi_1 :return \ SAT(\neg EX \neg \phi_1)\\ &\quad\quad \ \phi \ is \ EX \phi_1 :return \ SAT_{EX}\\ &\quad\quad \ \phi \ is \ A[\phi_1 U \phi_2] :return \ SAT(\neg E[\neg \phi_2 U (\neg \phi_1 \wedge \neg \phi_2)] \vee EG \neg \phi_2)\\ &\quad\quad \ \phi \ is \ E[\phi_1 U \phi_2] :return \ SAT_{EU}(\phi_1,\phi_2) \\ &\quad\quad \ \phi \ is \ EF(\phi_1) :return \ SAT(E(\top \cup \phi_1)) \\ &\quad\quad \ \phi \ is \ EG(\phi_1) :return \ SAT(\neg AF \neg \phi_1) \\ &\quad\quad \ \phi \ is \ AF(\phi_1) :return \ SAT_{AF}(\phi_1) \\ &\quad\quad \ \phi \ is \ AG(\phi_1) :return \ SAT(\neg EF\neg \phi_1) \\ &\quad \ end \ case \\ &end \ function\ \\ \end{aligned}
    • 函数SATEXSAT_{EX}:它通过调用SATSAT计算满足ϕ\phi的状态,然后,它沿着\to向后寻找满足EXϕEX \phi的状态。 function SATEX(ϕ)local var X,YbeginX:=SAT(ϕ);Y:=preE(X);return Yend \begin{aligned} &function \ SAT_{EX}(\phi) \\ &local \ var \ X,Y\\ &begin \\ &\quad\quad X:=SAT(\phi); \\ &\quad\quad Y:=pre_E(X); \\ &\quad\quad return \ Y \\ &end \\ \end{aligned}
    • 函数SATAFSAT_{AF}:它通过调用SATSAT计算满足ϕ\phi的状态,然后,按照标记算法中所描述的方式将满足AFϕAF \phi的状态累计在一起。 function SATAF(ϕ)local varX,YbeginX:=S;Y:=SAT(ϕ);repeat untilX=Y;beginX:=Y;Y:=Ypre(Y);endreturn Yend \begin{aligned} &function \ SAT_{AF}(\phi) \\ &local \ var X,Y \\ &begin \\ &\quad\quad X:=S; \\ &\quad\quad Y:=SAT(\phi); \\ &\quad\quad repeat \ until X = Y; \\ &\quad\quad begin \\ &\quad\quad\quad X:=Y; \\ &\quad\quad\quad Y:=Y \cup pre_\forall (Y); \\ &\quad\quad end \\ &\quad\quad return \ Y\\ &end \\ \end{aligned}
    • 函数SATEUSAT_{EU}:通过调用SATSAT计算满足ϕ\phi的状态,然后按照计算中所描述的方式将满足E[ϕUψ]E[\phi U\psi]的状态累计在一起。 function SATEU(ϕ,ψ)local varW,X,YbeginW:=SAT(ϕ);X:=S;Y:=SAT(ψ);repeat until X=Y;beginX:=Y;Y:=Ypre(Y);endreturn Yend \begin{aligned} &function \ SAT_{EU}(\phi,\psi) \\ &local \ var W,X,Y \\ &begin \\ &\quad\quad W:=SAT(\phi); \\ &\quad\quad X:=S; \\ &\quad\quad Y:=SAT(\psi); \\ &\quad\quad repeat \ until \ X = Y; \\ &\quad\quad begin \\ &\quad\quad\quad X:=Y; \\ &\quad\quad\quad Y:=Y \cup pre_\exists(Y); \\ &\quad\quad end \\ &\quad\quad return \ Y\\ &end \\ \end{aligned}
  • 伪代码解释:
    • 主函数名称为SATSAT,(单词satisfy的前三个字母大写),主函数将CTL公式作为输入
    • returnreturn来返回函数结果
    • local varlocal \ var来声明局部变量
    • SYS-Y表示不在YY中的所有sSs \in S的集合

状态爆炸问题

  • 原因:尽管标记算法关于模型的规模为线性的,但因为规模本身通常关于变量个数以及并行执行的系统组件的数目是指数的,导致程序中增加一个布尔变量,性质验证的复杂度会加倍。
  • 定义:使状态空间变得非常大的趋势称为状态爆炸问题。
  • 解决方法:有效的数据结构,又称为有序二元决策图,它表示状态集合而不是单个状态,SMV就是有序二元决策图。除此之外,还有很多其他的解决办法。