有一个自动售货机(Beverage Vending Machine),现在需要设计一个模型,计数苏打水(soda)和啤酒(beer)的数量,如果自动售货机是空的,则返回插入的硬币(coin)
- Data-Dependent Systems和TS模型不同的是,这里用位置(Location)替换TS的状态,用转移条件(Conditional transition)替换TS的转换关系。
对于自动售货机:
- 状态: start, select
- 条件转移:
- 从初始位置投入硬币后,转变为等待选择饮料位置
s t a r t ↪ t u r e : c o i n s e l e c t start \xhookrightarrow[]{ture \ : \ coin} select startture : coin select - 从初始位置填满苏打和啤酒后,位置仍然为初始位置
s t a r t ↪ t u r e : t u r e : r e f i l l s t a r t start \xhookrightarrow[]{ture \ : \ ture:refill} start startture : ture:refill start
- 从初始位置投入硬币后,转变为等待选择饮料位置
start表示售货机处于初始位置
select表示售货机处于已完成投币,等待选择饮料的位置
转移条件 g : α g:\alpha g:α
在自动售货机ture:coin和ture:refill,他们是转移条件,表示为 g : α g:\alpha g:α
- g g g表示一个布尔状态
- α \alpha α表示一个动作,只有当 g g g为true的时候,才会执行动作 α \alpha α,否则什么也不会执行
我们可以再看一些其他的条件转移过程:
- 当苏打饮料的数量大于0的时候,执行sget动作获取苏打饮料
s t a r t ↪ n s o d a > 0 : s g e t s t a r t start \xhookrightarrow[]{nsoda \ > \ 0 \ : \ sget} start startnsoda > 0 : sget start - 当啤酒的数量大于0的时候,执行bget动作获取啤酒
s t a r t ↪ n b e e r > 0 : b g e t s t a r t start \xhookrightarrow[]{nbeer\ > \ 0 \ : \ bget} start startnbeer > 0 : bget start - 当苏打饮料和啤酒的数量为空的时候,执行ret_coin动作退回投入的硬币
s t a r t ↪ n s o d a = 0 ∧ n b e e r = 0 : r e t _ c o i n s t a r t start \xhookrightarrow[]{nsoda \ = \ 0 \wedge nbeer \ = \ 0 \ : \ ret \_coin} start startnsoda = 0∧nbeer = 0 : ret_coin start
不同动作产生的不同影响:
动作 | 说明 | 影响 |
---|---|---|
coin | 投入硬币 | 无 |
ret_coin | 退回硬币 | 无 |
refill | 重新填满苏打和啤酒 | nsoda := max;nbeer := max |
sget | 获取一瓶苏打 | nsoda := nsoda -1 |
bget | 获取一瓶啤酒 | nbeer := nbeer -1 |
nsode表示苏打的数量,nbeer 表示啤酒的数量
具备类型的变量(typed variable)
-
概念:一个标准化的类型(如整数、布尔值、字符等)将和变量相关联以对系统建模
-
Var:前面的例子中 nsoda和nbeer都属typed variable,简称变量(Var)。
-
dom(x):每个变量x的取值范围记作域(dom)。对数字电路而言,变量的取值只能是0或者1,但对于软件而言,变量的取值范围可能非常大(如考虑程序内整数的范围),这时没法再用域做有效的限制,所以引出域的概念。对于n个变量 x = ( x 1 , x 2 , . . . , x n ) x = (x_{1},x_{2},...,x_{n}) x=(x1,x2,...,xn),其域为 D = ( D 1 × D 2 × . . . × D n ) D = (D_{1}\times D_{2}\times ...\times D_{n}) D=(D1×D2×...×Dn)
-
Eval(Var):对所有变量的定值,所有可能结果的集合记作Eval(Var),其中的一种定值方式记作映射 η \eta η,如对变量x的定值即记作 η ( x ) \eta(x) η(x)。
-
Cond(Var):在变量上设置的所有条件的集合,记作Cond(Var)
-
Effect:动作对变量的影响是动作作用于变量原值,再得到变量新值的这样一个映射,即 A c t × E v a l ( V a r ) → E v a l ( V a r ) Act \times Eval(Var)→ Eval(Var) Act×Eval(Var)→Eval(Var)
-
范例:以一个动作 α : x : = y + 5 \alpha : x:=y+5 α:x:=y+5为例,初始时对变量x和y的求值 η ( x ) = 17 , η ( y ) = − 2 \eta(x)=17,\eta(y)=-2 η(x)=17,η(y)=−2
如果对x执行 α \alpha α动作,则x的值最终等于y+5,也就是-2+5=3
E f f e c t ( α , η ) ( x ) = η ( y ) + 5 = − 2 + 5 = 3 Effect(\alpha ,\eta )(x)=\eta(y)+5=−2+5=3 Effect(α,η)(x)=η(y)+5=−2+5=3
如果对y执行 α \alpha α动作,因为 α \alpha α只对x的值进行修改,不对y的值进行修改,所以y的值仍然为-2
E f f e c t ( α , η ) ( y ) = η ( y ) = − 2 Effect(\alpha ,\eta )(y)=\eta (y)=−2 Effect(α,η)(y)=η(y)=−2
程序图 (Program Graph,简称PG)
- 概念:有向图,连接不同结点的边被标记为变量和动作,结点标记为位置。
- 行动
a
c
t
i
o
n
action
action的效果是通过映射来形式化的,比如上面具备类型的变量的那个范例:
- E f f e c t : A c t × E v a l ( V a r ) ↪ E v a l ( V a r ) Effect :Act × Eval(Var) \hookrightarrow Eval(Var) Effect:Act×Eval(Var)↪Eval(Var)
- α a c t i o n x : = y + 5 \alpha \ \ action \ \ x := y+5 α action x:=y+5
- η e v a l u a t i o n η ( x ) = 17 , η ( y ) = − 2 \eta \ \ evaluation \ \ \eta(x) = 17 , \eta(y) = −2 η evaluation η(x)=17,η(y)=−2
- E f f e c t ( α , η ) ( x ) = η ( y ) + 5 = − 2 + 5 = 3 Effect(\alpha,\eta)(x)=\eta(y) + 5 =−2 + 5 = 3 Effect(α,η)(x)=η(y)+5=−2+5=3
- E f f e c t ( α , η ) ( y ) = η ( y ) = − 2 Effect(\alpha,\eta)(y) =\eta(y) = −2 Effect(α,η)(y)=η(y)=−2
- PG是一个六元组
P
G
=
(
L
o
c
,
A
c
t
,
E
f
f
e
c
t
,
↪
,
L
o
c
0
,
g
0
)
PG = (Loc, Act, Effect, \hookrightarrow, Loc_{0}, g_{0})
PG=(Loc,Act,Effect,↪,Loc0,g0)
- Loc是一系列位置的集合
- Act是一系列动作的集合
- Effect是 A c t × E v a l ( V a r ) → E v a l ( V a r ) Act \times Eval(Var) \rightarrow Eval(Var) Act×Eval(Var)→Eval(Var)
- ↪ ⊆ L o c × C o n d ( V a r ) × A c t × L o c \hookrightarrow \subseteq Loc \times Cond(Var) \times Act \times Loc ↪⊆Loc×Cond(Var)×Act×Loc,是一个关系转移条件
- L o c 0 ⊆ L o c Loc_{0} \subseteq Loc Loc0⊆Loc:是一系列初始位置的集合
- g 0 ∈ C o n d ( V a r ) g_{0} \in Cond(Var) g0∈Cond(Var):是一系列初始条件的集合
- 在之前的自动售货机的范例中
- L o c = { s t a r t , s e l e c t } Loc=\{start,select\} Loc={start,select}
- L o c 0 = { s t a r t } V a r = { n s o d a , n b e e r } Loc_{0}=\{start\} \ Var=\{ nsoda,nbeer\} Loc0={start} Var={nsoda,nbeer}
- A c t = { b g e t , s g e t , c o i n , r e t _ c o i n , r e f i l l } Act=\{bget,sget,coin,ret\_coin,refill\} Act={bget,sget,coin,ret_coin,refill}
- g 0 = { n s o d a = m a x ∧ n b e e r = m a x } g_{0}=\{nsoda=max \wedge nbeer=max \} g0={nsoda=max∧nbeer=max} ,表示刚开始,苏打和啤酒的数量都是满的
-
E
f
f
e
c
t
:
Effect:
Effect:
- E f f e c t ( c o i n , η ) = η Effect(coin,\eta) = \eta Effect(coin,η)=η,表示投入硬币,目标变量(nsoda和nbeer)没有改变
- E f f e c t ( r e t c o i n , η ) = η Effect(ret_coin,\eta) = \eta Effect(retcoin,η)=η,表示退回硬币,目标变量(nsoda和nbeer)没有改变
- E f f e c t ( s g e t , η ) = η [ n s o d a : = n s o d a − 1 ] Effect(sget,\eta) = \eta[nsoda:=nsoda-1] Effect(sget,η)=η[nsoda:=nsoda−1],表示获取一瓶苏打,nsoda的值减少一
- E f f e c t ( b g e t , η ) = η [ n b e e r : = n b e e r − 1 ] Effect(bget,\eta) =\eta[nbeer:=nbeer-1] Effect(bget,η)=η[nbeer:=nbeer−1],表示获取一瓶啤酒,nbeer的值减少一
- E f f e c t ( r e f i l l , η ) = [ n s o d a : = m a x , n b e e r : = m a x ] Effect(refill,\eta) = [nsoda:=max,nbeer:=max] Effect(refill,η)=[nsoda:=max,nbeer:=max],表示重新填满苏打和啤酒,nsoda和nbeer的值等于最大值
- PG图:(其中,结点内的黑色实心表示啤酒,空心表示苏打,图中初始位置只有两瓶啤酒和两瓶苏打)
- PG转换为TS的方法
- PG六元组:
P G = ( L o c , A c t , E f f e c t , ↪ , L o c 0 , g 0 ) PG = (Loc, Act, Effect, \hookrightarrow, Loc_{0}, g_{0}) PG=(Loc,Act,Effect,↪,Loc0,g0)
分别是位置、动作、影响、转移关系、初始位置、初始限定条件 - TS六元组:
T S = ( S , A c t , → , I , A P , L ) TS = (S, Act,\rightarrow , I,AP, L) TS=(S,Act,→,I,AP,L)
分别是状态、动作、转移关系、初始状态、原子命题、标签函数 - 具体转换规则如下:
-
S = L o c × E v a l ( V a r ) S=Loc \times Eval(Var) S=Loc×Eval(Var),表示,TS的状态是位置与变量取值的笛卡尔积。具体来说,新的状态包含了位置和位置上的变量取值
-
A c t Act Act保持不变
-
→ ∈ S × A c t × S \rightarrow \in S \times Act \times S →∈S×Act×S由以下规则定义:
ℓ ↪ g : α ℓ ′ ∧ η ⊨ g ⟨ ℓ , η ⟩ → α ⟨ ℓ ′ , E f f e c t ( α , η ) ⟩ \frac {\ell \overset{g:\alpha }{\hookrightarrow} {\ell}' \wedge \eta \models g} {\langle \ell , \eta \rangle \overset{\alpha } {\rightarrow} \langle {\ell}' , Effect(\alpha ,\eta ) \rangle } ⟨ℓ,η⟩→α⟨ℓ′,Effect(α,η)⟩ℓ↪g:αℓ′∧η⊨g
表示,转移关系是在某状态对应于PG上的原位置 ℓ \ell ℓ上当前赋值 η \eta η满足动作 α \alpha α执行条件 g g g时,从原状态 ⟨ l , η ⟩ \langle l,\eta \rangle ⟨l,η⟩,经动作 α \alpha α,到达新状态 ⟨ l ′ , E f f e c t ( α , η ) ⟩ \langle l',Effect(\alpha, \eta) \rangle ⟨l′,Effect(α,η)⟩的转移关系。
其中, ℓ ′ {\ell}' ℓ′是原PG上的位置 ℓ \ell ℓ依动作 α \alpha α经 ↪ \hookrightarrow ↪转移所到达的新位置(可以和 ℓ \ell ℓ相同),而 E f f e c t ( α , η ) Effect(\alpha, \eta) Effect(α,η)是当前的变量赋值 η \eta η经 E f f e c t Effect Effect表中动作 α \alpha α对应的影响操作后的新的变量赋值(可以和 η \eta η相同)。 -
I = { ⟨ ℓ , η ⟩ } ∣ ℓ ∈ L o c 0 ∪ { g ∈ C o n d ( V a r ) ∣ η ⊨ g 0 } I = \{ \langle \ell , \eta \rangle \} | \ell \in Loc_{0} \cup \{ g \in Cond(Var) | \eta \models g_{0} \} I={⟨ℓ,η⟩}∣ℓ∈Loc0∪{g∈Cond(Var)∣η⊨g0},表示初始状态是PG中的所有初始位置,和满足初始条件的所有变量赋值的笛卡尔积。
-
A P = L o c ∪ C o n d ( V a r ) AP = Loc \cup Cond(Var) AP=Loc∪Cond(Var),表示原子命题集合是所有的位置 L o c Loc Loc和PG中出现的所有条件 C o n d ( V a r ) Cond(Var) Cond(Var)的并集。
-
L = { ℓ } ∪ { g ∈ C o n d ( V a r ) ∣ η ⊨ g } L = \{ \ell \} \cup \{ g \in Cond(Var)| \eta \models g \} L={ℓ}∪{g∈Cond(Var)∣η⊨g},表示对状态取标签得到的是位置 ℓ \ell ℓ以及变量赋值 η \eta η所满足的限定条件 g g g的集合。
-
- PG六元组: