本章目录
- 项目到模型的转换原因
- 本章基本词汇解释
- 基本动作的转移公式: S → α S ′ S\overset{\alpha }{\rightarrow}S' S→αS′
- 标签函数(Label function): L ( s ) ∈ 2 A P L(s)\in 2^{AP} L(s)∈2AP
- 构建Kripke Sructure模型
- 可满足性关系(Satisfaction relation): ⊨ \models ⊨
- 非确定性的应用(Application of nondeterministic)
- 从一阶逻辑公式构造Kripke structure(KS)例题
- 直接前驱和直接后继(Direct Predecessors and Successors expanded)
- 确定性的转换系统(Deterministic Transition System)
- 执行片段(Execution fragment)
项目到模型的转换原因
当我们需要对一个项目进行验证时,我们无法对该项目直接验证,而是要转换成可以做验证的模型,比如一个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 R⊆S×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 S1∪S2∪S3
- 并发系统以一阶逻辑系统公式进行转换的过程:
- 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 v1←2,v2←3,v3←5,v1′←1,v2′←5,v3′←4
- 转移过程: ( 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=2∧v2=3∧v3=5)∧(v1′=1∧v2′=5∧v3′=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 →⊆S∗Act∗S,是状态-动作-状态的转移关系集合;
- I I I是一组初始状态, I ⊇ S I \supseteq S I⊇S;
- A P AP AP是一组原子命题;
- L L L是一个标签函数, S → 2 A P S \rightarrow 2^{AP} S→2AP;
如果状态集 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,v←e,l′)≡pc=l∧pc′=l′∧v′=e∧same(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=l∧pc′=l′∧same(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=l∧pc′=l1∧b∧same(V))∨(pc=l∧pc′=l2∧¬b∧same(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=l∧pc′=l1∧b∧same(V))∨pc=l∧pc′=l1∧¬b∧same(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=0∧y=0∧z=0∧pc=m∧pc′=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+1∧same(V\{x})∧pc=l11∧pc′=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+2∧same(V\{z})∧pc=l12∧pc′=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<=3∧same(V)∧pc=l2∧pc′=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=l2∧pc′=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=l21∧pc′=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=l22∧pc′=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<y∧same(V)∧pc=l3∧pc′=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=l3∧pc′=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+1∧same(V\{x})∧pc=l31∧pc′=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+1∧same(V\{y})∧pc=l31∧pc′=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+1∧same(V\{y})∧pc=l23∧pc′=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::=n∣x∣a0+a1∣a0−a1∣a0×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::=true∣false∣a0==a1∣a0≤a1∣¬b∣b0∧b1∣b0∨b1
- 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 p1∣∣p2 coendp::=skip;∣x:=a;∣p0;p1∣wait(b)∣if b then p0 else p1∣while 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=1∧y=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' R≡x=1∧y=1∧pc=m∧pc′=l1x′=x+y∧same(V\{x})∧pc=l1∧pc′=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 3∧y′=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图形形式:
- 输入IMP语言:
- 样例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 P1∣∣P2∣∣⋯∣∣Pn 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 l1′∣∣l2:P2L l2′∣∣⋯∣∣ln: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=m∧i=1∧n(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:P1Ll1′∣∣l2:P2Ll2′∣∣⋯∣∣ln:PnL ln′ coend,m′)≡(pc=m∧i=1∧n(pci=⊥)∧pci=l1∧⋯∧pcn′=ln∧pc′=⊥)∨(pc=⊥∧pc1=l1′∧⋯∧pcn=ln′∧pc′=m′∧i=1∧n(pci′=⊥))i=1∨n(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=1∧n(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=l∧pci′=l∧¬b∧same(Vi))∨(pci=l∧pci′=l′∧b∧same(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=l∧pci′=l∧v=1∧same(Vi))∨(pci=l∧pci′=l′∧v=0∧v′=1∧same(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=l∧pci′=l′∧v′=0∧same(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=m∧pc0=⊥∧pc1=⊥∧(turn=0∨turn=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=m∧pc0′=l0∧pc1′=l′∧pc′=⊥)∨(pc=⊥∧pc0=l0′∧pc1=l1′∧pc′=m′∧pc0′=⊥∧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=1∧y=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=1∧y=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=1∧y=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=1∧y=1},{x=0∧y=1}}
- S 0 = { { x = 1 ∧ y = 1 } } S_0 = \{\{x=1\wedge y=1\}\} S0={{x=1∧y=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=1∧y=1∧x′=0∧y′=1},{x=0∧y=1∧x′=1∧y′=1}}
- L ( S 0 ) = { x = 1 ∧ y = 1 } L(S_0) = \{x=1\wedge y=1\} L(S0)={x=1∧y=1}
- L ( S 1 ) = { x = 0 ∧ y = 1 } L(S_1) = \{x=0\wedge y=1\} L(S1)={x=0∧y=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 s∈S且 α ∈ 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,α)={s′∈S∣s′→αs}
P r e ( s ) = ⋃ α ∈ A c t P r e ( s , α ) Pre(s)=\bigcup_{\alpha \in Act}Pre(s,\alpha) Pre(s)=α∈Act⋃Pre(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,α)={s′∈S∣s→α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)=α∈Act⋃Post(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,α)=s∈C⋃Post(s,α)
P o s t ( C ) = ⋃ s ∈ C P o s t ( s ) Post(C)=\bigcup_{s \in C}Post(s) Post(C)=s∈C⋃Post(s)
P r e ( C , α ) = ⋃ s ∈ C P r e ( s , α ) Pre(C, \alpha)=\bigcup_{s \in C}Pre(s,\alpha) Pre(C,α)=s∈C⋃Pre(s,α)
P r e ( C ) = ⋃ s ∈ C P r e ( s ) Pre(C)=\bigcup_{s \in C}Pre(s) Pre(C)=s∈C⋃Pre(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 ∣I∣⩽1 and ∣Post(s,α)∣⩽1 - 表示任意状态经任意动作最多跳转到1个状态去
- 这种系统叫做行动决定(action-deterministic)
- 对所有状态
s
s
s和动作
α
\alpha
α ,都有
- 关于AP的确定转换系统
- 对所有状态
s
s
s和AP的子集
A
∈
2
A
P
A\in 2^{AP}
A∈2AP,都有
∣ 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 ∣I∣⩽1 and ∣Post(s)∩{s′∈S∣L(s′)=A}⩽∣1 - 表示从某一状态出发的直接后继,其Label函数的计算结果一定是不一样的
- 这种系统叫做AP决定(AP-deterministic)
- 对所有状态
s
s
s和AP的子集
A
∈
2
A
P
A\in 2^{AP}
A∈2AP,都有
执行片段(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 0⩽i⩽n,都有 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} sn−1,执行 α 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 0⩽i,都有 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 s∈S是可达的,意为存在这样的初始、有限的执行片段: 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...sn−1→αnsn=s
- 记Reach(TS)表示TS中的可达状态集。