在TS中“變量”一詞要以廣義的方式理解,可以表示程序變量、程序計數器、寄存器值、輸入位等。
1 順序硬件電路的建模
1.1 一個簡單的例子
1.1.1 簡要分析
下面電路有輸入x,寄存器r和輸出位y:
其中:
λy=¬(x⊕r)δr=x∨r
在這個例子中,寄存器r會保留上次的值,由因爲下一次的r會考慮到上次r的值,並且是通過OR運算得到,所以可以預見的是一旦r被置爲1就會永遠是1。具體的轉移關係如下:
r和y取決於上一狀態的x和r,但x的值僅受當前的輸入是0還是1影響。
1.1.2 狀態集合S
因爲y的值可以被x和y的值經λy=¬(x⊕r)唯一表示,所以系統的狀態只需考慮x和r的取值:
S=Eval(x,r)={<x=0,r=0>,<x=1,r=0>,<x=0,r=1>,<x=1,r=1>}
1.1.3 動作集合Act
輸入值x即是動作,不同的輸入導致不同的狀態轉移。課本和老師PPT上都將其視爲不關心的{τ},這裏將輸入不同的值視爲不同的動作,那麼:
Act={輸入x=0,輸入x=1}
1.1.4 初始狀態集合I
上圖中紅色的數字表示輸入位x輸入的是0還是1,這會導致不同的轉移關係。一開始,寄存器r=0,但x可以輸入0也可以輸入1,所以這個模型有兩個初始狀態:
I={<x=0,r=0>,<x=1,r=0>}
1.1.5 轉移關係集合→
這是TS相比KS的最大特點,在不同的狀態s上經不同的動作α會轉移到不同的狀態s′上去:
<x=0,r=0>輸入x=0<x=0,r=0><x=0,r=0>輸入x=1<x=1,r=0><x=1,r=0>輸入x=0<x=0,r=1><x=1,r=0>輸入x=1<x=1,r=1><x=1,r=1>輸入x=0<x=0,r=1><x=1,r=1>輸入x=1<x=1,r=1><x=0,r=1>輸入x=0<x=0,r=1><x=0,r=1>輸入x=1<x=1,r=1>
1.1.3 原子命題集合AP和標籤函數L
對硬件電路,不妨直接用布爾值真假表示原子命題的真假(即用{x}表達{x=1}),所以原子命題集合AP={x,y,r},上圖中每個狀態s旁邊的集合表示標籤函數L(s)的計算結果,集合中的元素即表示該布爾量的值爲真。
L({x=0,r=0})={y}L({x=1,r=0})={x}L({x=0,r=1})={r}L({x=1,r=1})={x,y,r}
注意到寄存器r是不可見的,有時只關心硬件電路的輸入和輸出,即若取原子命題集合AP′={x,y},那麼對每個狀態取標籤的結果就變成:
L′({x=0,r=0})={y}L′({x=1,r=0})={x}L′({x=0,r=1})=∅L′({x=1,r=1})={x,y}
1.2 推廣到任意順序硬件電路
對具有n個輸入x1,x2,...,xn,具有m個輸出y1,y2,...,ym,具有k個寄存器r1,r2,...,rk的硬件數字電路。並假定這k個寄存器的值一開始分別是c0,1,c0,2,...,,c0,k,那麼它具有如下的TS表示。
- 狀態集合:
S=Eval(x1,...,xn,r1,...,rk)
- 初始狀態集合:
I={(a1,..,an,c0,1,...,,c0,k) ∣ a1,...,an∈{0,1}}
- 動作集合(此處無視動作):
Act={τ}
- 原子命題集合(此處將寄存器考慮在內):
AP={x1,...,xn,y1,...,ym,r1,...,rk}
- 標籤函數的作用結果:
L(a1,..,an,c1,...,,ck)={xi∣ai=1}∪{rj∣cj=1}∪{yi∣s⊨λyi(a1,...,an,c1,...,ck)=1}
即是該狀態下取值爲真的所有x和r,以及輸出爲1的那些y全體組成的集合(λyi是計算yi的值的函數)。
- 轉換關係:
(a1,...,an,c1,...,ck)τ(a1′,...,an′,c1′,...,ck′)
其中寄存器rj的值cj′=δrj(a1,..,an,c1,...,,ck)
2 數據相關的系統
對程序的條件分支部分,使用TS進行建模會使其變成非確定的轉移,因爲不存在交互的Act但卻存在分支(TS中沒有條件判斷,記錄的是當前時刻的值),這會將判斷條件隱藏掉,如對程序:
if x%2=1 then x:=x+1 else x:=2⋅x fi.
將其轉換爲TS會損失x%2=1這一條件,得到的模型過於抽象,無法完整表述整個系統。可以使用Program Graph對其進行建模,然後再將其轉換爲TS。
2.1 一個簡單的例子
從這個例子引入了Program Graph。
考慮對上篇筆記中4.2
的飲料機的例子進行擴展後的模型,這個新模型可以記錄soda和beer的數量,並且當它們數量都變成0時再投入硬幣會將硬幣吐出,另外可以在任意時刻將soda和beer填充到能容納的最大值。
和TS不同的是,使用位置(Location) 和條件轉移(Condition Transition) 的概念。注意!位置不能像狀態一樣表達系統在某一時刻具有的特性。在前述的分析中,最基本的兩個轉移關係就是投入硬幣和填充:
starttrue : coinselectstarttrue : refillstart
這裏start和select表示兩個位置(而不是狀態,可以直觀理解成是和變量具體取值無關的),使用鉤子箭頭↪表示PG中的條件轉移關係,箭頭上的g:α表示轉移條件和執行的動作(g是guarded的縮寫,爲true即表示無條件)。
例如,上面第一個轉換,從start到select上書true:coin,表示動作coin(投幣)在start這一位置上總是可用(true)的,並且start經此動作轉換到select這一位置。
投了幣之後(在select位置),對soda或者beer,數量>0時,就可以取出一瓶。這對應轉移關係:
slectnsoda>0 : sgetstartslectnbeer>0 : bgetstart
投了幣之後(在select位置),對soda或者beer,數量都=0時,要吐出與投入等額的硬幣出來:
selectnsoda=0∧nbeer=0 : ret_coinstart
每個動作會對關注的變量的取值產生影響(Effect) ,在這個模型中所關注的量是soda和beer的數目,至於飲料機裏有多少coin是不關心的。所以不同的Action對變量的Effect如下:
Action |
Effect |
coin |
無 |
ret_coin |
無 |
refill |
nsoda:=max;nbeer:=max |
sget |
ndoda:=nsoda−1 |
bget |
nbeer:=nbeer−1 |
2.2 對具有類型的變量的分析
詞typed variable表示具備類型的變量,也就是說一個標準化的類型(如整數、布爾值、字符等)將和變量相關聯以對系統建模,前面的例子中nsoda和nbeer都屬於typed variable,以下簡稱變量。
記每個變量x的取值範圍是域dom(x)。對數字電路而言,取值只能是0或者1,但對於軟件而言,變量的取值範圍可能非常大(如考慮程序內整數的範圍),這時沒法再用域做有效的限制。對n個變量x=(x1,x2,...,xn),其域爲D=(D1,D2,...,Dn)。
對所有變量的定值,所有可能結果的集合記作Eval(Var),其中的一種定值方式記作映射η,如對變量x的定值即記作η(x)。
在變量上設置的所有條件的集合,記作Cond(Var)。
動作對變量的影響是動作作用於變量原值,再得到變量新值的這樣一個映射,即Act×Eval(Var)→Eval(Var)。
以一個動作α:x:=y+5爲例,初始時對變量x和y的求值η(x)=17,η(y)=2,那麼經過α動作後的值:
Effect(α,η)(x)=η(y)+5=−2+5=3Effect(α,η)(y)=η(y)=−2
3 Program Graph
3.1 定義
從本篇2
中的數據相關係統的建模,可以瞭解到要使用Program Graph這個模型來代替TS,它定義爲六元組PG=(Loc,Ac,Effect,↪,Loc0,g0),其中:
- Loc是所有Location的集合
- Act是所有動作的集合
- Effect:Act×Eval(Var)→Eval(Var)是動作對變量的影響映射
- ↪⊆Loc×Cond(Var)×Act×Loc是Location之間依靠條件:動作的轉移關係集合
- Loc0⊆Loc是初始Location集合
- g0∈Cond(Var)是初始條件集合
3.2 例子
以本篇2.1
中的飲料機爲例,其轉移關係↪已經在2.1
中給出,其PG六元組中的其它要素如下:
LocLoc0Actg0Effect(coin,η)Effect(ret_coin,η)Effect(sget,η)Effect(bget,η)Effect(refill,η)={start,select}={start}={coin,ret_coin,sget,bget,refill}={nsoda=max∧nbeer=max}=η=η=η[nsoda:=nsoda−1]=η[nbeer:=nbeer−1]=[nsoda:=max,nbeer:=max]