TS是一种常用的描述系统行为的模型,用结点表示状态,边表示转移关系,和KS的主要区别是状态转移是需要动作支持的,不同的动作往往对应着不同的状态转移。
1 基本概念
1.1 状态(State)
状态是在某时刻系统所具有的特性和行为。和KS一样用原子命题集合表示状态,例如{a=2,b>3}。
- 对交通灯而言,灯的颜色就是状态。
- 对顺序程序而言,变量的当前取值以及程序计数器的位置就是状态。
- 对同步硬件电路而言,输入的若干比特以及寄存器的值就是状态。
1.2 转移(Transition)
转移是从一个状态到其它状态的演变。
- 对交通灯而言,从一个颜色变成其它颜色即是它的转移。
- 对顺序程序而言,语句的执行就是转移。
- 对同步硬件电路而言,对于一组新的输入,寄存器内的值和输出位的改变即是转移。单一动作用希腊字母表示。
1.3 动作(Action)
动作这个概念一般用于通信方面的建模,不同进程之间需要进行消息传递,这时候会用到动作。
2 数学表示
2.1 定义
上节课学习的KS定义为四元组,而TS定义为六元组:
TS=(S,Act,→,I,AP,L)
这之中:
- S是状态集合
- Act是动作集合
- →⊆S×Act×S是状态-动作-状态的转移关系集合
- I⊆S是初始状态集合
- AP是原子命题集合
- L:S→2AP是标签函数
如果状态集S、动作集Act、原子命题AP都是有限的,那么称这个TS是有限的。
2.2 基于动作的转移关系
从状态s经动作α转移到状态s′记为s⟶αs′,注意:
- 状态s的下一状态是非确定的(nondeterministically)
- 动作α让s的下一状态是s′这件事确定下来
- 当初始状态集包含超过1个状态时,初始状态也是非确定的
- 动作是为通信建模而引入的机制,其它时候可以忽略动作
2.3 标签函数
将状态送入标签,返回原子命题集合,即L(s)∈2AP,注意:
- 状态s满足命题逻辑公式Φ,当且仅当L(s)使此公式为真。即s⊨Φ iff L(s)=Φ
- 原子命题集合AP应当选择感兴趣(即此模型需要考虑)的特征
注意,L(s)∈2AP即是L(s)⊆AP,课件上用的是等式左边的表述,这里也保留了下来,实际就按右边理解即可。
3 可满足性关系⊨
对原子命题集合AP的定值(真值指派,此处可以理解成对变量的赋值影响相关原子命题的真值,例如设置a=2那么命题a<0的真值为假,将所有的命题计算得真假即是对整个合取式的真值指派)是将其映射到0或1上,即μ:AP→{0,1},记Eval(AP)是AP内命题的全部的真值指派方式组成的集合。可满足关系⊨是一个二元关系(μ,ϕ),它指示的是在μ这个定值方式下,命题逻辑公式ϕ的计算结果为真。显然有:
- μ⊨true
- μ⊨a iff μ(a)=1
- μ⊨¬ϕ iff μ⊨ϕ
- μ⊨ϕ∧ψ iff μ⊨ϕ∧μ⊨ψ
4 非确定性(nondeterministic)
4.1 应用
- 通过interleaving(两进程交替执行) 对独立活动的并行执行进行建模。
- 对两个进程访问同一共享资源而出现的复杂状况建模。
- 用于抽象目的和underspecification。
- 对未知或不可预测环境下的接口建模。
4.2 例子:饮料机
- 状态集合S={pay,select,soda,beer}
- 初始状态集合I={pay}
- 动作集合Act={insert_coin,get_soda,get_beer,τ}
这是一个非确定的系统,因为在投入硬币后,既可以选择提供啤酒,也可以选择提供苏打水。
注意,当表示内部活动或者不相关活动时,使用一个特殊符号τ。
- 原子命题是要考虑的性质:
AP={paid,drink}
- 标签函数作用在状态上,得到的是原子命题的子集:
L(pay)=∅L(select)={paid}L(soda)=L(beer)={paid,drink}
可以理解为,系统中只有两个要考虑的量paid和drink并且只能取值真和假。一开始既没有付款也没有喝饮料,所以对pay取标签函数得到的是空集;在投入硬币进入select状态后,因为已经付款了,所以取标签得到的是{paid};在出了饮料之后,即认为同时也可以喝了,所以取标签得到的是{paid,drink}。
5 后继和前任
5.1 直接后继
对TS=(S,Act,→,I,AP,L)中的s∈S以及α∈Act,状态s对动作α的直接后继定义为:
Post(s,α)={s′∈S∣s⟶αs′}
即s经过α所能到达的状态s′的集合,记作α−successors。
状态s的直接后继(不说关于某动作)定义为:
Post(s)=α∈Act⋃Post(s,α)
即所有经过任一动作α能达到的状态的集合。
5.2 直接前任
对TS=(S,Act,→,I,AP,L)中的s∈S以及α∈Act,状态s对动作α的直接前任定义为:
Pre(s,α)={s′∈S∣s′⟶αs}
即经过α能到达状态s的若干前置状态s′的集合,记作α−predeccessors。
状态s的直接前任(不说关于某动作)定义为:
Pre(s)=α∈Act⋃Pre(s,α)
即所有由任一动作α而来此状态的前置状态的集合。
5.3 用状态集合扩展直接后继和直接前任
提供一个状态集合C⊆S,可以在其上定义直接后继或直接前任,实际上就是对所有其内的状态s∈C求直接后继或直接前任:
Post(C,α)=s∈C⋃Post(s,α),Post(c)=s∈C⋃Post(s)Pre(C,α)=s∈C⋃Pre(s,α),Pre(c)=s∈C⋃Pre(s)
5.4 TS的终止状态
称状态s是TS的终止状态,当且仅当它没有后继即Post(s)=∅。
对顺序程序而言,终止状态标志着程序运行结束。
对并行程序而言,往往不希望看到终止状态。
6 确定性的TS
谈及TS的确定性,一般可以分为以下两种类型。
6.1 关于action的确定TS
对所有状态s和动作α,如有∣I∣≤1并且∣Post(s,α)∣≤1,即任意状态经任意动作最多跳转到1个状态去,此时称这个TS是action−deterministic的。
6.2 关于AP的确定TS
对所有状态s和AP的子集A∈2AP(其实就是A⊆AP),如有∣I∣≤1并且∣Post(s)∩{s′∈S∣L(s′)=A}∣≤1,即从某一状态出发的直接后继,其Label函数的计算结果一定是不一样的,此时称这个TS是AP−deterministic的。
7 执行片段与执行
7.1 有限执行片段
TS的有限执行片段定义为:
ϱ=s0α1s1α2...αnsn
其中对所有的0≤i<n,有si⟶αi+1si+1成立。其中n≥0是有限执行片段的长度。
7.2 无限执行片段
TS的无限执行片段定义为:
ρ=s0α1s1α2s2α3...
其中对所有的0≤i,有si⟶αi+1si+1成立。
7.3 最大/初始的执行片段
一个最大(maximal)执行片段是一个以终止状态结束的有限片段,或是一个无限执行片段。
当执行片段从初始状态开始时,称其为初始(initial)的片段。
7.4 执行
TS的执行是指一个初始的、最大的执行片段。
7.5 可达状态
状态s∈S是可达的,意为存在这样的初始、有限的执行片段:
s0⟶α1s1⟶α2...⟶αn(sn=s)
记Reach(TS)为TS的所有可达状态。