【系统分析与验证笔记】Transition System模型知识点

项目到模型的转换原因

当我们需要对一个项目进行验证时,我们无法对该项目直接验证,而是要转换成可以做验证的模型,比如一个C语言程序,要先将它转换为一阶逻辑公式,再将一阶逻辑公式转换为Kripke结构,之后我们才能进行验证分析,得到我们所需的结论。

本章基本词汇解释

  • State(状态):系统在某一时刻的特性,也值程序中所有变量的值。例如:交通灯的红色、黄色、绿色。

  • Transition(转换/转移/迁移):指从一个状态到另一个状态的演化。例如:交通灯由红色变为黄色。

    在程序中,可以理解为

    • 当前时刻:{x=1,y=2}
    • 执行变迁:x=5,y=x+1
    • 下一时刻:{x=5,y=6}
  • Action(动作):过程之间的沟通机制。

  • Atomic Propositions(原子命题):形式化临时特征。原子表示不可再分,命题表示这是具有判断能力的陈述句。例如:X=1;店里没有顾客。

  • Kripke Structure(状态迁移系统):是一个基于原子命题AP的四元组,用 M M M表示, M = ( S , S 0 , R , L ) M = (S,S_0,R,L) M=S,S0,R,L)

    • S S S是有限状态集合
    • S 0 S_0 S0是初始状态集合
    • R R R是状态之间的关系,如 R ⊆ S × S R\subseteq S \times S RS×S,表示状态之间所有的关系。(这里的 × \times ×表示笛卡尔积)
    • L L L是一个标签函数,状态到原子命题集合的一个函数,如 L ( s 0 ) = { a , b } L(s_0)=\{a,b\} L(s0)={a,b}
  • First order logic(一阶逻辑系统):用一阶逻辑描述并发系统的状态,有四个属性:

    • V = { v 1 , ⋯   , v 1 } V=\{v_1,\cdots,v_1\} V={v1,,v1}表示系统变量集合
    • D D D表示变量的有限域,比如布尔值变量的有限域为{true,false}
    • A A A表示变量 V V V到有限域 D D D的一个映射(也叫赋值)
    • s t a t e state state:使它为真的公式就是状态。比如 S = ( v 1 = 2 ) ∧ ( v 2 = 3 ) S=(v_1=2)\wedge(v_2=3) S=(v1=2)(v2=3),因为 v 1 = 2 v_1=2 v1=2 v 2 = 3 v_2=3 v2=3都为真,所以 ( v 1 = 2 ) ∧ ( v 2 = 3 ) (v_1=2)\wedge(v_2=3) (v1=2)(v2=3)也为真,因此 S S S称之为状态。
    • 如果 D = { 2 , 3 , 4 , 5 } , S = { ( v 1 = 2 ) ∧ ( v 2 = 3 ) ∧ ( v 3 ≠ 5 ) } D=\{2,3,4,5\},S=\{(v_1=2)\wedge(v_2=3)\wedge(v_3\neq 5)\} D={2,3,4,5}S={(v1=2)(v2=3)(v3=5)},则该 S S S其实表示了三个状态:
      • S 1 = { ( v 1 = 2 ) ∧ ( v 2 = 3 ) ∧ ( v 3 = 2 ) } S_1=\{(v_1=2)\wedge(v_2=3)\wedge(v_3 = 2 )\} S1={(v1=2)(v2=3)(v3=2)}
      • S 2 = { ( v 1 = 2 ) ∧ ( v 2 = 3 ) ∧ ( v 3 = 3 ) } S_2=\{(v_1=2)\wedge(v_2=3)\wedge(v_3 = 3 )\} S2={(v1=2)(v2=3)(v3=3)}
      • S 3 = { ( v 1 = 2 ) ∧ ( v 2 = 3 ) ∧ ( v 3 = 4 ) } S_3=\{(v_1=2)\wedge(v_2=3)\wedge(v_3 = 4 )\} S3={(v1=2)(v2=3)(v3=4)}
    • 状态之间的合并用 ∪ \cup 表示,如 S 1 ∪ S 2 ∪ S 3 S_1 \cup S_2 \cup S_3 S1S2S3
    • 并发系统以一阶逻辑系统公式进行转换的过程:
      • V V V表示当前的变量集合, V ′ V' V表示下一时刻变量的集合,如 V = { v 1 , v 2 , v 3 } V=\{v_1,v_2,v_3\} V={v1,v2,v3} V ′ = { v 1 ′ , v 2 ′ , v 3 ′ } V'=\{v_1',v_2',v_3'\} V={v1,v2,v3} v 1 ← 2 , v 2 ← 3 , v 3 ← 5 , v 1 ′ ← 1 , v 2 ′ ← 5 , v 3 ′ ← 4 v1\leftarrow 2, v2\leftarrow3, v3\leftarrow5,v1'\leftarrow 1, v2'\leftarrow5, v3'\leftarrow4 v12,v23,v35,v11,v25,v34
      • 转移过程: ( v 1 = 2 ∧ v 2 = 3 ∧ v 3 = 5 ) ∧ ( v 1 ′ = 1 ∧ v 2 ′ = 5 ∧ v 3 ′ = 4 ) (v_1=2\wedge v_2=3 \wedge v_3=5) \wedge (v_1'=1\wedge v_2'=5 \wedge v_3'=4) (v1=2v2=3v3=5)(v1=1v2=5v3=4)
  • Transition System(转换系统,简称TS):是一个六元组, T S = ( S , A c t , → , I , A P , L ) TS = (S, Act,\rightarrow , I,AP, L) TS=(S,Act,,I,AP,L)

    • A c t Act Act是组动作的合集;
    • → \rightarrow 表示转换关系, → ⊆ S ∗ A c t ∗ S \rightarrow \subseteq S * Act * S SActS,是状态-动作-状态的转移关系集合;
    • I I I是一组初始状态, I ⊇ S I \supseteq S IS
    • A P AP AP是一组原子命题;
    • L L L是一个标签函数, S → 2 A P S \rightarrow 2^{AP} S2AP

如果状态集 S S S、动作集 A c t Act Act、原子命题 A P AP AP都是有限的,那么称这个 T S TS TS是有限的。

基本动作的转移公式: S → α S ′ S\overset{\alpha }{\rightarrow}S' SαS

  • 含义: 动作 α \alpha α将状态 S S S转变为状态 S ′ {S}' S
  • 备注:
    • S S S的下一个状态 S ′ {S}' S是不确定的,只有经历了动作 α \alpha α的转换, S S S的下一个状态 S ′ {S}' S才被确定下来;
    • 当初始状态集包含超过1个状态时,初始状态 S S S也是非确定的;
    • 动作是为通信建模而引入的机制,其它操作无需在意动作所执行的内容。

标签函数(Label function): L ( s ) ∈ 2 A P L(s)\in 2^{AP} L(s)2AP

  • 状态s满足命题逻辑公式Φ如果L(s)使公式Φ真;即 s ⊨ Φ   i f f   L ( s ) ⊨ Φ s \models \Phi \ iff \ L(s) \models \Phi sΦ iff L(s)Φ
  • 原子命题集合AP应当选择感兴趣的特征,也就是模型需要考虑的特征;
  • 用法举例:L(select) = { paid },表示在select状态时,取得的标签为paid。
  • L ( s ) ∈ 2 A P L(s)\in 2^{AP} L(s)2AP其实就是 L ( s ) ⊆ A P L(s)\subseteq AP L(s)AP,原子性质集合

构建Kripke Sructure模型

需要根据程序的四个特征进行建模:顺序、分支、循环、并发

顺序程序(Sequential program)的建模

  • 方法:对程序进行标签化
  • 目的:将程序一条条处理
  • 打标签的四个方法:
    • 如果是一条普通的语句P,则标签为: P L = P P^L =P PL=P
    • 如果是两条语句 P = P 1 ; P 2 P=P_1;P_2 P=P1;P2,则标签为: P L = P 1 L ; l ′ ′ : P 2 L P^L=P_1^L; l'' : P_2^L PL=P1L;l:P2L
    • 如果是分支语句 P = i f    b    t h e n   P 1   e l s e   P 2   e n d i f P=if \ \ b \ \ then \ P_1 \ else \ P_2 \ endif P=if  b  then P1 else P2 endif,则标签为: P L = i f    b    t h e n   l 1 : P 1 L   e l s e   l 2 : P 2 L   e n d i f P^L=if \ \ b \ \ then \ l_1:P_1^L \ else \ l_2:P_2^L \ endif PL=if  b  then l1:P1L else l2:P2L endif
    • 如果是循环语句 P = w h i l e   b   d o   P 1   e n d w h i l e P=while \ b \ do \ P_1 \ endwhile P=while b do P1 endwhile,则标签为: P L = w h i l e    b    d o   l 1 : P 1 L   e n d w h i l e P^L=while \ \ b \ \ do \ l_1:P_1^L \ endwhile PL=while  b  do l1:P1L endwhile
  • 程序初始状态集合: S 0 ( V , p c ) ≡ p r e ( V ) ∧ p c = m S_0(V, pc) \equiv pre(V) \wedge pc=m S0(V,pc)pre(V)pc=m
  • p r e ( V ) pre(V) pre(V)表示 V V V的初始值, p c pc pc表示当前的语句入口, p c ′ pc' pc表示当前的语句出口,仅限于该条语句,而 m m m表示程序的入口, m ′ m' m表示程序的出口,作用于整个程序(在后面的练习中可以深刻体会他们的区别)
  • ≡ \equiv 表示左右两侧的公式等价,所代表的含义相同,只不过表达方法不同而已
  • 翻译过程: C ( l , P , l ′ ) C(l,P,l') C(l,P,l)表示程序入口为 l l l,出口为 l ′ l' l,程序要执行的语句为 P P P C C C表示这是一个要翻译的过程,翻译过程一般会有如下五种语句被翻译:

    • 赋值语句: C ( l , v ← e , l ′ ) ≡ p c = l ∧ p c ′ = l ′ ∧ v ′ = e ∧ s a m e ( V \ { v } ) C (l, v\leftarrow e, l' )\equiv pc=l \wedge pc'=l' \wedge v'=e \wedge same(V \backslash \{v\}) C(l,ve,l)pc=lpc=lv=esame(V\{v})
    • 空语句: C ( l , s k i p , l ′ ) ≡ p c = l ∧ p c ′ = l ′ ∧ s a m e ( V ) C (l, skip, l' )\equiv pc=l \wedge pc'=l' \wedge same(V) C(l,skip,l)pc=lpc=lsame(V)

    s k i p skip skip表示什么也不执行,空语句存在的目的是为了程序中对其语句等作用

    • 顺序语句: C ( l , P 1 ; l ′ ′ : P 2 , l ′ ) ≡ C ( l , P , l ′ ) ∨ C ( l , P 2 , l ′ ) C (l,P_1;l'':P_2, l' ) \equiv C (l, P, l' )\vee C (l, P_2, l' ) C(l,P1;l:P2,l)C(l,P,l)C(l,P2,l)
    • 条件语句:
      C ( l , i f   b   t h e n l 1 : P 1   e l s e   l 2 : P 2   e n d i f , l ′ ) ≡ ( p c = l ∧ p c ′ = l 1 ∧ b ∧ s a m e ( V ) ) ∨ ( p c = l ∧ p c ′ = l 2 ∧ ¬ b ∧ s a m e ( V ) ) ∨ C ( l 1 , P 1 , l ′ ) ∨ C ( l 2 , P 2 , l ′ ) C (l, if \ b \ then l_1 : P_1 \ else \ l_2 : P_2 \ endif, l' ) \equiv \\ ( pc=l \wedge pc'=l_1 \wedge b \wedge same(V)) \\ \vee (pc=l \wedge pc'=l_2 \wedge \neg b \wedge same(V))\\ \vee C (l_1,P_1, l' ) \\ \vee C (l_2,P_2, l' ) C(l,if b thenl1:P1 else l2:P2 endif,l)(pc=lpc=l1bsame(V))(pc=lpc=l2¬bsame(V))C(l1,P1,l)C(l2,P2,l)
    • 循环语句:
      C ( l , w h i l e   b   d o   l 1 : P 1   e n d w h i l e , l ′ ) ≡ p c = l ∧ p c ′ = l 1 ∧ b ∧ s a m e ( V ) ) ∨ p c = l ∧ p c ′ = l 1 ∧ ¬ b ∧ s a m e ( V ) ) ∨ C ( l 1 , P 1 , l ) C (l, while \ b \ do \ l_1 : P_1 \ endwhile, l' ) \equiv \\ pc=l \wedge pc'=l_1 \wedge b \wedge same(V))\\ \vee pc=l \wedge pc'=l_1 \wedge \neg b \wedge same(V))\\ \vee C (l_1,P_1, l) C(l,while b do l1:P1 endwhile,l)pc=lpc=l1bsame(V))pc=lpc=l1¬bsame(V))C(l1,P1,l)
    • s a m e ( V ) same(V) same(V)表示 V V V中变量不发生变化
    • s a m e ( V \ { v } ) same(V \backslash \{v\}) same(V\{v})表示 V V V中变量只有 v v v发生变化
    • 有些地方用 l ′ , l ′ ′ l',l'' l,l有些地方用 l 1 , l 2 l_1,l_2 l1,l2的原因,个人感觉,应该是顺序语句用 l ′ , l ′ ′ l',l'' l,l,分支循环这种很多可能性的用 l 1 , l 2 l_1,l_2 l1,l2
  • 练习题:对如下程序进行标签化
    V = { x , y , z } , i n i t i a l   v a l u e : x = y = z = 0 P r o g r a m : x = y + 1 ; z = z + 2 ; f o r ( y ; y < = 3 ; y + + ) i f   x < y   t h e n   x + + ; e l s e   y + + ; V=\{x,y,z\},initial \ value: x=y=z=0 \\ Program: \\ x=y+1; z=z+2;\\ for(y; y<=3; y++)\\ \quad if \ x<y \ then \ x++; else \ y++; V={x,y,z},initial value:x=y=z=0Program:x=y+1;z=z+2;for(y;y<=3;y++)if x<y then x++;else y++;

  • 答案(答案不唯一):

    • 初始化程序,先将程序标记分为三个标记语句
      P 1 : x = y + 1 ; z = z + 2 ; P 2 : f o r ( y ; y < = 3 ; y + + ) P 3 : i f   x < y   t h e n   x + + ; e l s e   y + + ; P_1:x=y+1; z=z+2;\\ P_2:for(y; y<=3; y++)\\ P_3:if \ x<y \ then \ x++; else \ y++; P1:x=y+1;z=z+2;P2:for(y;y<=3;y++)P3:if x<y then x++;else y++;
    • P 1 P_1 P1继续标记:
      P 11 : x = y + 1 P 12 : z = z + 2 P 1 L = P 11 L ; l 12 = P 12 L P 11 L = P 11 P 12 L = P 12 P_{11}:x=y+1\\ P_{12}:z=z+2\\ P_{1}^L=P_{11}^L;l_{12}=P_{12}^L\\ P_{11}^L=P_{11}\\ P_{12}^L=P_{12} P11:x=y+1P12:z=z+2P1L=P11L;l12=P12LP11L=P11P12L=P12
    • P 2 P_2 P2继续标记:
      首先将 f o r for for语句转变为 w h i l e while while语句
      y w h i l e ( y < = 3 ) d o P 3 y + + e n d w h i l e y\\ while(y<=3)\\ do\\ \quad P_3\\ \quad y++\\ endwhile ywhile(y<=3)doP3y++endwhile
      然后进行标记
      P 21 : y P 22 : y + + P 2 L = P 21 L ; l 23 ′ ′ = P 23 L P 21 L = P 21 P 22 L = P 22 P 23 L = w h i l e ( y < = 3 ) d o l 3 : P 3 L ; l 22 : P 22 L   e n d w h i l e P_{21}:y\\ P_{22}:y++\\ P_{2}^L=P_{21}^L;l_{23}''=P_{23}^L\\ P_{21}^L=P_{21}\\ P_{22}^L=P_{22}\\ P_{23}^L=while(y<=3) do l_3:P_3^L;l_{22}:P_{22}^L \ endwhile P21:yP22:y++P2L=P21L;l23=P23LP21L=P21P22L=P22P23L=while(y<=3)dol3:P3L;l22:P22L endwhile
    • 再对 P 3 P_3 P3进行标记:
      P 31 : x + + P 32 : y + + P 3 L : i f   x < y   t h e n   l 31 : P 31 L   e l s e l 32 : P 32 L   e n d i f P 31 L = P 31 P 32 L = P 32 P_{31}:x++\\ P_{32}:y++\\ P_3^L:if \ x<y \ then \ l_{31}:P_{31}^L \ else l_{32}:P_{32}^L \ endif \\ P_{31}^L=P_{31}\\ P_{32}^L=P_{32} P31:x++P32:y++P3L:if x<y then l31:P31L elsel32:P32L endifP31L=P31P32L=P32
    • 由上述标记公式,可得一阶逻辑公式:
      • x = 0 ∧ y = 0 ∧ z = 0 ∧ p c = m ∧ p c ′ = l 11 x=0 \wedge y=0\wedge z=0\wedge pc=m\wedge pc'=l_{11} x=0y=0z=0pc=mpc=l11
      • x ′ = y + 1 ∧ s a m e ( V \ { x } ) ∧ p c = l 11 ∧ p c ′ = l 12 x'=y+1 \wedge same(V \backslash \{x \}) \wedge pc=l_{11}\wedge pc'=l_{12} x=y+1same(V\{x})pc=l11pc=l12
      • z ′ = z + 2 ∧ s a m e ( V \ { z } ) ∧ p c = l 12 ∧ p c ′ = l 2 z'=z+2 \wedge same(V \backslash \{z \}) \wedge pc=l_{12}\wedge pc'=l_{2} z=z+2same(V\{z})pc=l12pc=l2
      • y < = 3 ∧ s a m e ( V ) ∧ p c = l 2 ∧ p c ′ = l 21 y<=3 \wedge same(V) \wedge pc=l_{2} \wedge pc'=l_{21} y<=3same(V)pc=l2pc=l21
      • ¬ ( y < = 3 ) ∧ s a m e ( V ) ∧ p c = l 2 ∧ p c ′ = l 22 \neg (y<=3)\wedge same(V) \wedge pc=l_{2} \wedge pc'=l_{22} ¬(y<=3)same(V)pc=l2pc=l22
      • s a m e ( V ) ∧ p c = l 21 ∧ p c ′ = l 3 same(V)\wedge pc=l_{21} \wedge pc'=l_{3} same(V)pc=l21pc=l3
      • s a m e ( V ) ∧ p c = l 22 ∧ p c ′ = m ′ same(V)\wedge pc=l_{22} \wedge pc'=m' same(V)pc=l22pc=m
      • x < y ∧ s a m e ( V ) ∧ p c = l 3 ∧ p c ′ = l 31 x<y \wedge same(V) \wedge pc=l_{3} \wedge pc'=l_{31} x<ysame(V)pc=l3pc=l31
      • ¬ ( x < y ) ∧ s a m e ( V ) ∧ p c = l 3 ∧ p c ′ = l 23 \neg (x<y) \wedge same(V) \wedge pc=l_{3} \wedge pc'=l_{23} ¬(x<y)same(V)pc=l3pc=l23
      • x ′ = x + 1 ∧ s a m e ( V \ { x } ) ∧ p c = l 31 ∧ p c ′ = l 23 x'=x+1 \wedge same(V \backslash \{x \}) \wedge pc=l_{31} \wedge pc'=l_{23} x=x+1same(V\{x})pc=l31pc=l23
      • y ′ = y + 1 ∧ s a m e ( V \ { y } ) ∧ p c = l 31 ∧ p c ′ = l 23 y'=y+1 \wedge same(V \backslash \{y \}) \wedge pc=l_{31} \wedge pc'=l_{23} y=y+1same(V\{y})pc=l31pc=l23
      • y ′ = y + 1 ∧ s a m e ( V \ { y } ) ∧ p c = l 23 ∧ p c ′ = l 2 y'=y+1 \wedge same(V \backslash \{y \}) \wedge pc=l_{23} \wedge pc'=l_{2} y=y+1same(V\{y})pc=l23pc=l2

IMP语言转一阶逻辑公式再转Kripke Structure程序

  • IMP语法规则:
    • Aexp: a : : = n ∣ x ∣ a 0 + a 1 ∣ a 0 − a 1 ∣ a 0 × a 1 , n ∈ [ 0 , 2 ] a::=n|x|a_0+a_1|a_0-a_1|a_0 \times a_1 , n\in [0,2] a::=nxa0+a1a0a1a0×a1,n[0,2]
    • Bexp: b : : = t r u e ∣ f a l s e ∣ a 0 = = a 1 ∣ a 0 ≤ a 1 ∣ ¬ b ∣ b 0 ∧ b 1 ∣ b 0 ∨ b 1 b::=true|false|a_0==a_1|a_0 \leq a_1|\neg b|b_0\wedge b_1|b_0 \vee b_1 b::=truefalsea0==a1a0a1¬bb0b1b0b1
    • Com:
      c : : = c o b e g i n   p 1 ∣ ∣ p 2   c o e n d p : : = s k i p ; ∣ x : = a ; ∣ p 0 ; p 1 ∣ w a i t ( b ) ∣ i f   b   t h e n   p 0   e l s e   p 1 ∣ w h i l e   b   d o   p \qquad c::=cobegin \ p1||p2 \ coend \\ \qquad p::= skip; | x:=a; |p_0;p_1 |wait(b) |if \ b \ then \ p_0 \ else \ p_1|while \ b \ do \ p c::=cobegin p1p2 coendp::=skip;x:=a;p0;p1wait(b)if b then p0 else p1while b do p
    • 整形变量取值范围: [ 0 , 1 , 2 ] [0,1,2] [0,1,2]
    • 布尔变量取值范围: [ 0 , 1 ] [0,1] [0,1]
    • 变量名规则:单个小写字母,如 a , b , c , ⋯ a,b,c,\cdots a,b,c,
  • 样例1:
    • 输入IMP语言:
      x : = 1 ; y : = 1 ; x : = x + y ; x:= 1;\\ y:= 1;\\ x:= x + y; x:=1;y:=1;x:=x+y;
    • 输出一阶逻辑公式:
      D ≡ { 0 , 1 , 2 } V ≡ { x , y } S 0 ( x , y ) ≡ x = 1 ∧ y = 1 D\equiv \{0,1,2\}\\ V \equiv \{x,y\}\\ S_0(x,y)\equiv x=1 \wedge y =1 D{0,1,2}V{x,y}S0(x,y)x=1y=1
      R ≡ x = 1 ∧ y = 1 ∧ p c = m ∧ p c ′ = l 1 x ′ = x + y ∧ s a m e ( V \ { x } ) ∧ p c = l 1 ∧ p c ′ = m ′ R\equiv\\ x=1∧y=1∧pc=m∧pc'=l1\\ x'=x+y∧same(V \backslash \{x\})∧pc=l1∧pc'=m' Rx=1y=1pc=mpc=l1x=x+ysame(V\{x})pc=l1pc=m
    • 输出Kripke Structure:
      K S = ( S , S 0 , R , L ) KS = ( S,S_0,R,L) KS=(S,S0,R,L)
      S = { < 1 , 1 > , < 2 , 1 > } S=\{<1,1>,<2,1>\} S={<1,1>,<2,1>}
      S 0 = { < 1 , 1 > } S_0=\{<1,1>\} S0={<1,1>}
      R ( x , y , x ′ , y ′ ) ≡ x ′ = ( x + y ) m o d   3 ∧ y ′ = y R(x,y,x',y')\equiv x' = (x+y)mod \ 3\wedge y' = y R(x,y,x,y)x=(x+y)mod 3y=y
      L ( S 0 ) = { 1 , 1 } L(S_0)=\{1,1\} L(S0)={1,1}
      L ( S 1 ) = { 2 , 1 } L(S_1)=\{2,1\} L(S1)={2,1}
    • 输出Kripke Structure图形形式:
      在这里插入图片描述
  • 样例2:
    某大佬程序里直接跑的结果:
    在这里插入图片描述
    在这里插入图片描述
  • 答案:
    一个大佬用python写的程序:https://github.com/lypnol/impy
    另一位大佬C++写的程序:https://git.code.tencent.com/fasasas/formal-IMP.git
    • 如果你是华师大郭老师的课程,这两个程序只能参考,千万别照搬,这俩郭老师都看过了,不要抱侥幸心理哦
    • 输入输出格式不唯一

并发程序(Concurrent programs)的建模

  • 原因:由一组同时执行的进程组成,进程是顺序语句,我们假设CPU是单核的,所以程序只能异步执行,一次只能执行一条语句,所以我们要进行并发建模

  • 组成:
    V V V:并发进程变量的集合
    p c i pc_i pci:第 i i i个并发进程
    p c pc pc:并发进程的计数器
    P C PC PC:并发进程的计数器的集合

  • 表示方法: P = C o b e g i n   P 1 ∣ ∣ P 2 ∣ ∣ ⋯ ∣ ∣ P n   c o e n d P = Cobegin \ P_1||P_2|| \cdots ||P_n \ coend P=Cobegin P1P2Pn coend

  • 标记并发程序: P L = c o n b e g i n   l 1 : P 1 L   l 1 ′ ∣ ∣ l 2 : P 2 L   l 2 ′ ∣ ∣ ⋯ ∣ ∣ l n : P n L   l n   c o e n d P^L=conbegin \ l_1 : P_1^L \ l_1' || l_2 : P_2^L \ l_2' || \cdots || l_n : P_n^L \ l_n \ coend PL=conbegin l1:P1L l1l2:P2L l2ln:PnL ln coend

  • 并发程序初始状态: S 0 ( V , p c ) ≡ p r e ( V ) ∧ p c = m ∧ ∧ n i = 1 ( p c i = ⊥ ) S_0(V, pc) \equiv pre(V) \wedge pc=m \wedge \underset{i=1}{\overset{n}{\wedge}}(pc_i=\perp) S0(V,pc)pre(V)pc=mi=1n(pci=)

  • 并发程序执行过程: C ( m , c o n b e g i n   l 1 : P 1 L l 1 ′ ∣ ∣ l 2 : P 2 L l 2 ′ ∣ ∣ ⋯ ∣ ∣ l n : P n L   l n ′   c o e n d , m ′ ) ≡ ( p c = m ∧ ∧ n i = 1 ( p c i = ⊥ ) ∧ p c i = l 1 ∧ ⋯ ∧ p c n ′ = l n ∧ p c ′ = ⊥ ) ∨ ( p c = ⊥ ∧ p c 1 = l 1 ′ ∧ ⋯ ∧ p c n = l n ′ ∧ p c ′ = m ′ ∧ ∧ n i = 1 ( p c i ′ = ⊥ ) ) ∨ n i = 1 ( C ( l i , P i , l i ′ ) ∧ s a m e ( V \ V i ) ∧ s a m e ( P C \ { p c i } ) ) C (m, conbegin \ l_1:P_1^L l_1' || l_2:P_2^L l_2' || \cdots || l_n:P_n^L \ l_n' \ coend, m' ) \equiv \\ (pc = m \wedge \underset{i=1}{\overset{n}{\wedge}}(pc_i = \perp)\wedge pc_i=l_1\wedge \cdots\wedge pc_n' = l_n \wedge pc' = \perp)\\ \vee(pc=\perp\wedge pc_1=l_1' \wedge \cdots \wedge pc_n=l_n'\wedge pc'=m'\wedge \underset{i=1}{\overset{n}{\wedge}}(pc_i' = \perp))\\ \underset{i=1}{\overset{n}{\vee}}(C(l_i,P_i,l_i')\wedge same(V \backslash V_i)\wedge same(PC\backslash \{ pc_i \})) C(m,conbegin l1:P1Ll1l2:P2Ll2ln:PnL ln coend,m)(pc=mi=1n(pci=)pci=l1pcn=lnpc=)(pc=pc1=l1pcn=lnpc=mi=1n(pci=))i=1n(C(li,Pi,li)same(V\Vi)same(PC\{pci}))

    • ⊥ \perp 表示数值为空或否, p c = ⊥ pc = \perp pc=表示程序未被激活
    • ∧ n i = 1 ( p c i = ⊥ ) ) \underset{i=1}{\overset{n}{\wedge}}(pc_i = \perp)) i=1n(pci=))表示 p c 1 = ⊥ ∧ p c 2 = ⊥ ∧ ⋯ ∧ p c n = ⊥ pc_1=\perp \wedge pc_2=\perp\wedge \cdots \wedge pc_n=\perp pc1=pc2=pcn=
  • 共享变量

    • 原因:当一个变量被一个进程访问时,其他变量如果想访问,需要将此变量共享才可以
    • 方法:
      • 等待: C ( l , w a i t ( b ) , l ′ ) ≡ ( p c i = l ∧ p c i ′ = l ∧ ¬ b ∧ s a m e ( V i ) ) ∨ ( p c i = l ∧ p c i ′ = l ′ ∧ b ∧ s a m e ( V i ) ) C(l,wait(b),l')\equiv \\ (pc_i=l \wedge pc_i'=l \wedge \neg b \wedge same(V_i))\\ \vee (pc_i=l \wedge pc_i'=l' \wedge b \wedge same(V_i)) C(l,wait(b),l)(pci=lpci=l¬bsame(Vi))(pci=lpci=lbsame(Vi))
      • 加锁: C ( l , l o c k ( v ) , l ′ ) ≡ ( p c i = l ∧ p c i ′ = l ∧ v = 1 ∧ s a m e ( V i ) ) ∨ ( p c i = l ∧ p c i ′ = l ′ ∧ v = 0 ∧ v ′ = 1 ∧ s a m e ( V i \ { v } ) ) C(l,lock(v),l')\equiv \\ (pc_i=l \wedge pc_i'=l \wedge v=1 \wedge same(V_i))\\ \vee (pc_i=l \wedge pc_i'=l' \wedge v=0 \wedge v'=1 \wedge same(V_i \backslash \{v\})) C(l,lock(v),l)(pci=lpci=lv=1same(Vi))(pci=lpci=lv=0v=1same(Vi\{v}))
      • 解锁: C ( l , u n l o c k ( v ) , l ′ ) ≡ p c i = l ∧ p c i ′ = l ′ ∧ v ′ = 0 ∧ s a m e ( V i ) C(l,unlock(v),l')\equiv \\ pc_i=l \wedge pc_i'=l' \wedge v'=0 \wedge same(V_i) C(l,unlock(v),l)pci=lpci=lv=0same(Vi)
  • P P P初始状态: S 0 ( V , p c ) ≡ p c = m ∧ p c 0 = ⊥ ∧ p c 1 = ⊥ ∧ ( t u r n = 0 ∨ t u r n = 1 ) S_0(V, pc) \equiv pc=m \wedge pc_0=\perp \wedge pc_1= \perp \wedge (turn = 0 \vee turn = 1) S0(V,pc)pc=mpc0=pc1=(turn=0turn=1)

  • P P P的转移关系 R ( V , P C , V ′ , P C ′ ) ≡ ( p c = m ∧ p c 0 ′ = l 0 ∧ p c 1 ′ = l ′ ∧ p c ′ = ⊥ ) ∨ ( p c = ⊥ ∧ p c 0 = l 0 ′ ∧ p c 1 = l 1 ′ ∧ p c ′ = m ′ ∧ p c 0 ′ = ⊥ ∧ p c 1 ′ = ⊥ ) R(V, PC, V', PC') \equiv \\ (pc=m \wedge pc_0' = l_0 \wedge pc_1'=l' \wedge pc'=\perp)\\ \vee(pc= \perp \wedge pc_0 = l_0' \wedge pc_1=l_1' \wedge pc' = m' \wedge pc_0' = \perp \wedge pc_1' = \perp) R(V,PC,V,PC)(pc=mpc0=l0pc1=lpc=)(pc=pc0=l0pc1=l1pc=mpc0=pc1=)

并发还有没整理完,太多了,太难理解,以后有机会再整理

可满足性关系(Satisfaction relation): ⊨ \models

  • 举个简单的例子: μ ⊨   a > 0   i f   a = 1 \mu \models \ a>0 \ if \ a=1 μ a>0 if a=1,表示当a=1的时候,a>0的结果为true,最终 μ ⊨ \mu \models μtrue,可满足性关系的式子成立。换句话说,就是当且仅当a=1时, μ \mu μ满足a>0(也就是 μ ⊨ t r u e \mu \models true μtrue)。
  • true。此时 μ ⊨ \mu \models μtrue也就是 μ ⊨ \mu\models μ后面的这个结果为true或,才表示可满足性关系。
  • 专业解释:对原子命题集合AP的定值是将其映射到0或1上,即 μ : A P → { 0 , 1 } \mu:AP\rightarrow \begin{Bmatrix}0,1\end{Bmatrix} μAP{0,1},记Eval(AP)是AP内命题的全部的真值指派方式组成的集合。可满足关系 ⊨ \models 是一个二元关系 ( μ , ϕ ) (\mu,\phi) (μ,ϕ),它指示的是在 μ \mu μ这个定值方式下,命题逻辑公式 ϕ \phi ϕ的计算结果为真。
  • 真值指派:此处可以理解成对变量的赋值影响相关原子命题的真值,例如设置a=2那么命题a>0的真值为真,将所有的命题计算得到的真假,即是对整个合取式的真值指派。
  • 如果上面的文字还没能理解,那么我们再多举几个例子
    • μ ⊨ t r u e \mu \models true μtrue
    • μ ⊨ a i f f μ ( a ) = 1 \mu \models a \quad iff \quad \mu(a)=1 μaiffμ(a)=1
    • μ ⊨ ϕ 1 ∧ ϕ 2 i f f μ ⊨ ϕ 1 a n d μ ⊨ ϕ 2 \mu \models \phi_{1}\wedge\phi_{2} \quad iff \quad \mu \models \phi_{1} \quad and \quad \mu \models \phi_{2} μϕ1ϕ2iffμϕ1andμϕ2

非确定性的应用(Application of nondeterministic)

  • 通过两进程交替执行对独立活动的并行执行进行建模;
  • 对两个进程访问同一共享资源而出现的复杂状况建模;
  • 用于抽象的目的或者不规范的场景;
  • 对未知或不可预测环境下的接口建模。
  • 例题:
    • 向自动售货机内插入硬币后,可以选择购买啤酒或苏打水
      在这里插入图片描述
    • S = { pay , select, soda, beer }
    • I = { pay }
    • Act = { insert_coin, get_soda, get_beer, τ \tau τ }
    • 问题:请给出AP和L

  答案:
       AP = { paid , drink }
       L(pay) =  $\varnothing$
       L(soda) = L(beer) = { paid , drink }
       L(select) = { paid }
  • 答案解析:paid表示投入了硬币,drink表示饮料取出喝掉,这两个状态的取值只能为真或假。一开始既没有付款也没有喝饮料,所以对pay取标签函数得到的是空集;在投入硬币进入select状态后,因为已经付款了,所以取标签得到的是{paid};在出了饮料之后,即认为同时也可以喝了,所以取标签得到的是{paid,drink}。
  • 这是一个非确定的系统,因为在投入硬币后,既可以选择提供啤酒,也可以选择提供苏打水。
  • 当表示内部活动或者不相关活动时,使用一个特殊符号 τ \tau τ
  • Act 用于建模和数据通信
  • AP的集合总是根据题目所需的特征来选择

从一阶逻辑公式构造Kripke structure(KS)例题

  • 题目:
    • V = { x , y } V = \{ x,y \} V={x,y}
    • D = { 0 , 1 } D = \{ 0,1 \} D={0,1}
    • S 0 = ( x , y ) ≡ x = 1 ∧ y = 1 S_0 = (x,y) \equiv x = 1 \wedge y = 1 S0=(x,y)x=1y=1
    • T r a n s i t i o n : Transition: Transition:
      R ( x , y , x ′ , y ′ ) ≡ x ′ = ( x + y )   m o d   2   ∧ y ′ = y R(x,y,x',y') \equiv x'= (x+y) \ mod \ 2 \ \wedge y' = y R(x,y,x,y)x=(x+y) mod 2 y=y
  • 问题:
    • K S = ( S , S 0 , R , L ) KS=(S,S_0,R,L) KS=(S,S0,R,L)
  • 解析:
    • 该系统的所有状态用 < x , y > <x,y> <x,y>有序对来表示,而 x x x y y y的值域均为 D = { 0 , 1 } D=\{0,1\} D={0,1},所以 < x , y > <x,y> <x,y>的所有取值就是 D D D D D D的笛卡尔积来计算, S = D × D = { < 0 , 0 > , < 0 , 1 > , < 1 , 0 > , < 1 , 1 > } S=D×D=\{<0,0>,<0,1>,<1,0>,<1,1>\} S=D×D={<0,0>,<0,1>,<1,0>,<1,1>}
    • 按照描述,系统的初始状态集合为 S 0 ( x , y ) ≡ x = 1 ∧ y = 1 S_{0}(x,y)\equiv x=1\wedge y=1 S0(x,y)x=1y=1,所以初始状态 S 0 = { < 1 , 1 > } S_{0}=\{<1,1>\} S0={<1,1>}
    • 我们需要从系统的每一个状态开始,分别计算经过转移后系统所达到的新状态。首先计算 x = 0 , y = 0 x=0,y=0 x=0,y=0的情况,一次转移后,即计算新的 x x x y y y值,得到 < ( 0 + 0 )   m o d   2 , 0 > <(0+0) \ mod \ 2, 0> <(0+0) mod 2,0>,计算mod后结果为 < 0 , 0 > <0,0> <0,0>,依次计算其余状态,我们可以得到 < 1 , 0 > → < 1 , 0 > , < 1 , 1 > → < 0 , 1 > , < 0 , 1 > → < 1 , 1 > <1,0> \rightarrow<1,0>,<1,1> \rightarrow<0,1>,<0,1> \rightarrow<1,1> <1,0><1,0><1,1><0,1>,<0,1><1,1>,将其用 K S KS KS的形式表示为 R = { ( < 0 , 0 > , < 0 , 0 > ) , ( < 1 , 0 > , < 1 , 0 > ) , ( < 0 , 1 > , < 1 , 1 > ) , ( < 1 , 1 > , < 0 , 1 > ) } R=\{(<0,0>,<0,0>),(<1,0>,<1,0>),(<0,1>,<1,1>),(<1,1>,<0,1>)\} R={(<0,0>,<0,0>),(<1,0>,<1,0>),(<0,1>,<1,1>),(<1,1>,<0,1>)}
    • 标签函数代表着某状态下取值为真的原子命题,即 L ( < 1 , 1 > ) = { x = 1 , y = 1 } , L ( < 0 , 1 > ) = { x = 0 , y = 1 } , L ( < 0 , 0 > ) = { x = 0 , y = 0 } , L ( < 1 , 0 > ) = { x = 1 , y = 0 } L(<1,1>)=\{x=1,y=1\},L(<0,1>)=\{x=0,y=1\},L(<0,0>)=\{x=0,y=0\},L(<1,0>)=\{x=1,y=0\} L(<1,1>)={x=1,y=1}L(<0,1>)={x=0,y=1}L(<0,0>)={x=0,y=0}L(<1,0>)={x=1,y=0}
  • ≡表示等同于,意思是执行S0(x,y)与执行x=1∧y=1的作用相同
  • ∧表示左右两个式子同步执行,∨表示左右两个式子依次执行
  • S 0 = ( x , y ) ≡ x = 1 ∧ y = 1 S_0 = (x,y) \equiv x = 1 \wedge y = 1 S0=(x,y)x=1y=1表示初始状态下, x x x的值为1,y的值也为1
  • R ( x , y , x ′ , y ′ ) ≡ x ′ = ( x + y )   m o d   2   ∧ y ′ = y R(x,y,x',y') \equiv x'= (x+y) \ mod \ 2 \ \wedge y' = y R(x,y,x,y)x=(x+y) mod 2 y=y表示转移关系, x ′ x' x的值为 ( x + y )   m o d   2 (x+y) \ mod \ 2 (x+y) mod 2 y ′ y' y的值仍然为y
  • 图像表示为:
    在这里插入图片描述

  • 答案:

    • S = { { x = 1 ∧ y = 1 } , { x = 0 ∧ y = 1 } } S = \{\{x=1\wedge y=1\},\{x=0\wedge y=1\}\} S={{x=1y=1},{x=0y=1}}
    • S 0 = { { x = 1 ∧ y = 1 } } S_0 = \{\{x=1\wedge y=1\}\} S0={{x=1y=1}}
    • R = { { x = 1 ∧ y = 1 ∧ x ′ = 0 ∧ y ′ = 1 } , { x = 0 ∧ y = 1 ∧ x ′ = 1 ∧ y ′ = 1 } } R = \{\{x=1\wedge y=1 \wedge x' = 0 \wedge y ' =1\},\{x=0\wedge y=1 \wedge x' = 1 \wedge y ' =1\}\} R={{x=1y=1x=0y=1},{x=0y=1x=1y=1}}
    • L ( S 0 ) = { x = 1 ∧ y = 1 } L(S_0) = \{x=1\wedge y=1\} L(S0)={x=1y=1}
    • L ( S 1 ) = { x = 0 ∧ y = 1 } L(S_1) = \{x=0\wedge y=1\} L(S1)={x=0y=1}

直接前驱和直接后继(Direct Predecessors and Successors expanded)

对于转换状态 T S = ( S , A c t , → , I , A P , L ) TS = (S, Act,\rightarrow , I,AP, L) TS=(S,Act,,I,AP,L),如果 s ∈ S s \in S sS α ∈ A c t \alpha \in Act αAct

  • 一组 α \alpha α的直接前驱定义为:
    P r e ( s , α ) = { s ′ ∈ S ∣ s ′ → α s } Pre(s,\alpha )=\begin{Bmatrix}s'\in S | s'\overset{\alpha }{\rightarrow}s\end{Bmatrix} Pre(s,α)={sSsαs}
    P r e ( s ) = ⋃ α ∈ A c t P r e ( s , α ) Pre(s)=\bigcup_{\alpha \in Act}Pre(s,\alpha) Pre(s)=αActPre(s,α)

  • 一组 α \alpha α的直接后继定义为:
    P o s t ( s , α ) = { s ′ ∈ S ∣ s → α s ′ } Post(s,\alpha )=\begin{Bmatrix}s'\in S | s\overset{\alpha }{\rightarrow}s'\end{Bmatrix} Post(s,α)={sSsαs}
    P o s t ( s ) = ⋃ α ∈ A c t P o s t ( s , α ) Post(s)=\bigcup_{\alpha \in Act}Post(s,\alpha) Post(s)=αActPost(s,α)

  • 直接前驱和直接后继者扩展到子集:
    P o s t ( C , α ) = ⋃ s ∈ C P o s t ( s , α ) Post(C, \alpha)=\bigcup_{s \in C}Post(s,\alpha) Post(C,α)=sCPost(s,α)
    P o s t ( C ) = ⋃ s ∈ C P o s t ( s ) Post(C)=\bigcup_{s \in C}Post(s) Post(C)=sCPost(s)
    P r e ( C , α ) = ⋃ s ∈ C P r e ( s , α ) Pre(C, \alpha)=\bigcup_{s \in C}Pre(s,\alpha) Pre(C,α)=sCPre(s,α)
    P r e ( C ) = ⋃ s ∈ C P r e ( s ) Pre(C)=\bigcup_{s \in C}Pre(s) Pre(C)=sCPre(s)

  • 转换状态 T S TS TS的终止状态:
    P o s t ( C ) = ∅ Post(C)=\varnothing Post(C)=

对于顺序计算机程序,终止状态表示程序的终;对于并行系统,终止状态通常被认为是不理想的。

确定性的转换系统(Deterministic Transition System)

  • 关于action的确定转换系统
    • 对所有状态 s s s和动作 α \alpha α ,都有
      ∣ I ∣ ⩽ 1   a n d   ∣ P o s t ( s , α ) ∣ ⩽ 1 |I|\leqslant1 \ and \ |Post(s,\alpha )|\leqslant 1 I1 and Post(s,α)1
    • 表示任意状态经任意动作最多跳转到1个状态去
    • 这种系统叫做行动决定(action-deterministic)
  • 关于AP的确定转换系统
    • 对所有状态 s s s和AP的子集 A ∈ 2 A P A\in 2^{AP} A2AP,都有
      ∣ I ∣ ⩽ 1   a n d   ∣ P o s t ( s ) ∩ { s ′ ∈ S ∣ L ( s ′ ) = A } ⩽ ∣ 1 |I|\leqslant1 \ and \ |Post(s)\cap \begin{Bmatrix} s'\in S|L(s')=A \end{Bmatrix} \leqslant| 1 I1 and Post(s){sSL(s)=A}1
    • 表示从某一状态出发的直接后继,其Label函数的计算结果一定是不一样的
    • 这种系统叫做AP决定(AP-deterministic)

执行片段(Execution fragment)

  • 对于转换状态 T S = ( S , A c t , → , I , A P , L ) TS = (S, Act,\rightarrow , I,AP, L) TS=(S,Act,,I,AP,L),有两种执行片段
    • 有限执行片段
      • 公式: ρ = s 0 α 1 s 1 α 2 . . . α n s n \rho = s_{0}\alpha _{1}s_{1}\alpha _{2}...\alpha _{n}s_{n} ρ=s0α1s1α2...αnsn, 其中:对于所有的 0 ⩽ i ⩽ n 0 \leqslant i \leqslant n 0in,都有 s i → α i + 1 s i + 1 s_{i}\overset{\alpha_{i+1}}{\rightarrow}s_{i+1} siαi+1si+1
      • 公式含义:初始状态 s 0 s_{0} s0,执行 α 1 \alpha _{1} α1后,状态变为 s 1 s_{1} s1,执行 α 2 \alpha _{2} α2后,状态变为 s 2 s_{2} s2……状态变为 s n − 1 s_{n-1} sn1,执行 α n \alpha _{n} αn后,状态变为 s n s_{n} sn
    • 无限执行片段
      • 公式: ρ = s 0 α 1 s 1 α 2 . . . \rho = s_{0}\alpha _{1}s_{1}\alpha _{2}... ρ=s0α1s1α2..., 其中:对于所有的 0 ⩽ i 0 \leqslant i 0i,都有 s i → α i + 1 s i + 1 s_{i}\overset{\alpha_{i+1}}{\rightarrow}s_{i+1} siαi+1si+1
      • 公式含义:初始状态 s 0 s_{0} s0,执行 α 1 \alpha _{1} α1后,状态变为 s 1 s_{1} s1,执行 α 2 \alpha _{2} α2后,状态变为 s 2 s_{2} s2……$

n表示有限片段的长度,n的值大于等于0

  • 初始执行片段: 最大执行片段要么是以终止状态结束的有限执行片段,要么是无限执行片段。
  • 最大执行片段:如果执行片段以初始状态启动,则称为初始片段。
  • 执行状态:一个初始的、最大的执行片段。
  • 可达状态:一个初始的、有限的执行片段。
    • 状态 s ∈ S s \in S sS是可达的,意为存在这样的初始、有限的执行片段: s 0 → α 1 s 1 → α 2 . . . s n − 1 → α n s n = s s_{0}\overset{\alpha_{1}}{\rightarrow} s_{1}\overset{\alpha_{2}}{\rightarrow} ... s_{n-1}\overset{\alpha_{n}}{\rightarrow} s_{n}= s s0α1s1α2...sn1αnsn=s
    • 记Reach(TS)表示TS中的可达状态集。
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

print_Hyon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值