【系統分析與驗證學習筆記】4:基於TS以及Program Graph的軟硬件系統建模

在TS中“變量”一詞要以廣義的方式理解,可以表示程序變量、程序計數器、寄存器值、輸入位等。

1 順序硬件電路的建模

1.1 一個簡單的例子

1.1.1 簡要分析

下面電路有輸入xx,寄存器rr和輸出位yy
在這裏插入圖片描述
其中:
λy=¬(xr)δr=xr \lambda_y = \neg (x \oplus r) \\ \delta_r = x \vee r
在這個例子中,寄存器rr會保留上次的值,由因爲下一次的rr會考慮到上次rr的值,並且是通過OROR運算得到,所以可以預見的是一旦rr被置爲1就會永遠是1。具體的轉移關係如下:
在這裏插入圖片描述
rryy取決於上一狀態的xxrr,但xx的值僅受當前的輸入是0還是1影響。

1.1.2 狀態集合SS

因爲yy的值可以被xxyy的值經λy=¬(xr)\lambda_y = \neg (x \oplus r)唯一表示,所以系統的狀態只需考慮xxrr的取值:
S=Eval(x,r)={<x=0,r=0>,<x=1,r=0>,<x=0,r=1>,<x=1,r=1>}S=Eval(x,r)=\{<x=0,r=0>,<x=1,r=0>,<x=0,r=1>,<x=1,r=1>\}

1.1.3 動作集合ActAct

輸入值xx即是動作,不同的輸入導致不同的狀態轉移。課本和老師PPT上都將其視爲不關心的{τ}\{\tau \},這裏將輸入不同的值視爲不同的動作,那麼:
Act={x=0,x=1}Act=\{輸入x=0,輸入x=1\}

1.1.4 初始狀態集合II

上圖中紅色的數字表示輸入位xx輸入的是0還是1,這會導致不同的轉移關係。一開始,寄存器r=0r=0,但xx可以輸入0也可以輸入1,所以這個模型有兩個初始狀態:
I={<x=0,r=0>,<x=1,r=0>}I=\{<x=0,r=0>,<x=1,r=0>\}

1.1.5 轉移關係集合\to

這是TS相比KS的最大特點,在不同的狀態ss上經不同的動作α\alpha會轉移到不同的狀態ss'上去:
<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> <x=0,r=0> \xrightarrow[]{輸入x=0} <x=0,r=0> \\ <x=0,r=0> \xrightarrow[]{輸入x=1} <x=1,r=0> \\ <x=1,r=0> \xrightarrow[]{輸入x=0} <x=0,r=1> \\ <x=1,r=0> \xrightarrow[]{輸入x=1} <x=1,r=1> \\ <x=1,r=1> \xrightarrow[]{輸入x=0} <x=0,r=1> \\ <x=1,r=1> \xrightarrow[]{輸入x=1} <x=1,r=1> \\ <x=0,r=1> \xrightarrow[]{輸入x=0} <x=0,r=1> \\ <x=0,r=1> \xrightarrow[]{輸入x=1} <x=1,r=1>

1.1.3 原子命題集合APAP和標籤函數LL

對硬件電路,不妨直接用布爾值真假表示原子命題的真假(即用{x}\{x\}表達{x=1}\{x=1\}),所以原子命題集合AP={x,y,r}AP=\{x,y,r\},上圖中每個狀態ss旁邊的集合表示標籤函數L(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} 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\}
注意到寄存器rr是不可見的,有時只關心硬件電路的輸入和輸出,即若取原子命題集合AP={x,y}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} L'(\{x=0,r=0\})=\{y\} \\ L'(\{x=1,r=0\})=\{x\} \\ L'(\{x=0,r=1\})=\varnothing \\ L'(\{x=1,r=1\})=\{x,y\}

1.2 推廣到任意順序硬件電路

對具有nn個輸入x1,x2,...,xnx_1,x_2,...,x_n,具有mm個輸出y1,y2,...,ymy_1,y_2,...,y_m,具有kk個寄存器r1,r2,...,rkr_1,r_2,...,r_k的硬件數字電路。並假定這kk個寄存器的值一開始分別是c0,1,c0,2,...,,c0,kc_{0,1},c_{0,2},...,,c_{0,k},那麼它具有如下的TS表示。

  • 狀態集合:
    S=Eval(x1,...,xn,r1,...,rk)S=Eval(x_1,...,x_n,r_1,...,r_k)
  • 初始狀態集合:
    I={(a1,..,an,c0,1,...,,c0,k)  a1,...,an{0,1}}I=\{(a_1,..,a_n,c_{0,1},...,,c_{0,k}) \ | \ a_1,...,a_n \in \{0,1\}\}
  • 動作集合(此處無視動作):
    Act={τ}Act=\{\tau \}
  • 原子命題集合(此處將寄存器考慮在內):
    AP={x1,...,xn,y1,...,ym,r1,...,rk}AP=\{x_1,...,x_n,y_1,...,y_m,r_1,...,r_k\}
  • 標籤函數的作用結果:
    L(a1,..,an,c1,...,,ck)={xiai=1}{rjcj=1}{yisλyi(a1,...,an,c1,...,ck)=1}L(a_1,..,a_n,c_1,...,,c_k) = \{x_i | a_i=1\} \cup \{r_j | c_j=1\} \cup \{y_i | s \vDash \lambda_{y_i}(a_1,...,a_n,c_1,...,c_k)=1\}
    即是該狀態下取值爲真的所有xxrr,以及輸出爲1的那些yy全體組成的集合(λyi\lambda_{y_i}是計算yiy_i的值的函數)。
  • 轉換關係:
    (a1,...,an,c1,...,ck)τ(a1,...,an,c1,...,ck)(a_1,...,a_n,c_1,...,c_k) \xrightarrow[]{\tau} (a_1',...,a_n',c_1',...,c_k')
    其中寄存器rjr_j的值cj=δrj(a1,..,an,c1,...,,ck)c_j'=\delta_{r_j}(a_1,..,a_n,c_1,...,,c_k)

2 數據相關的系統

對程序的條件分支部分,使用TS進行建模會使其變成非確定的轉移,因爲不存在交互的ActAct但卻存在分支(TS中沒有條件判斷,記錄的是當前時刻的值),這會將判斷條件隱藏掉,如對程序:
if  x%2=1  then  x:=x+1  else  x:=2x  fi.if \ \ x\%2=1 \ \ then \ \ x:=x+1 \ \ else \ \ x:=2 \cdot x \ \ fi.
將其轉換爲TS會損失x%2=1x\%2=1這一條件,得到的模型過於抽象,無法完整表述整個系統。可以使用Program Graph對其進行建模,然後再將其轉換爲TS。

2.1 一個簡單的例子

從這個例子引入了Program Graph。

考慮對上篇筆記中4.2的飲料機的例子進行擴展後的模型,這個新模型可以記錄soda和beer的數量,並且當它們數量都變成0時再投入硬幣會將硬幣吐出,另外可以在任意時刻將soda和beer填充到能容納的最大值。


和TS不同的是,使用位置(Location)條件轉移(Condition Transition) 的概念。注意!位置不能像狀態一樣表達系統在某一時刻具有的特性。在前述的分析中,最基本的兩個轉移關係就是投入硬幣和填充:
starttrue : coinselectstarttrue : refillstart start \xhookrightarrow[]{true \ : \ coin} select \\ start \xhookrightarrow[]{true \ : \ refill} start
這裏startstartselectselect表示兩個位置(而不是狀態,可以直觀理解成是和變量具體取值無關的),使用鉤子箭頭\hookrightarrow表示PG中的條件轉移關係,箭頭上的g:αg:\alpha表示轉移條件和執行的動作(gg是guarded的縮寫,爲truetrue即表示無條件)。

例如,上面第一個轉換,從startstartselectselect上書true:cointrue:coin,表示動作coincoin(投幣)在startstart這一位置上總是可用(truetrue)的,並且startstart經此動作轉換到selectselect這一位置。

投了幣之後(在selectselect位置),對soda或者beer,數量>0>0時,就可以取出一瓶。這對應轉移關係:
slectnsoda>0 : sgetstartslectnbeer>0 : bgetstart slect \xhookrightarrow[]{nsoda>0 \ : \ sget} start \\ slect \xhookrightarrow[]{nbeer>0 \ : \ bget} start
投了幣之後(在selectselect位置),對soda或者beer,數量都=0=0時,要吐出與投入等額的硬幣出來:
selectnsoda=0nbeer=0 : ret_coinstartselect \xhookrightarrow[]{nsoda=0 \wedge nbeer=0 \ : \ ret\_coin} start


每個動作會對關注的變量的取值產生影響(Effect) ,在這個模型中所關注的量是soda和beer的數目,至於飲料機裏有多少coin是不關心的。所以不同的ActionAction對變量的EffectEffect如下:

Action Effect
coincoin
ret_coinret\_coin
refillrefill nsoda:=max;nbeer:=maxnsoda:=max;nbeer:=max
sgetsget ndoda:=nsoda1ndoda:=nsoda-1
bgetbget nbeer:=nbeer1nbeer:=nbeer-1

2.2 對具有類型的變量的分析

typed variabletyped \ variable表示具備類型的變量,也就是說一個標準化的類型(如整數、布爾值、字符等)將和變量相關聯以對系統建模,前面的例子中nsodansodanbeernbeer都屬於typed variabletyped \ variable,以下簡稱變量。

記每個變量xx的取值範圍是dom(x)dom(x)。對數字電路而言,取值只能是0或者1,但對於軟件而言,變量的取值範圍可能非常大(如考慮程序內整數的範圍),這時沒法再用域做有效的限制。對nn個變量x=(x1,x2,...,xn)x=(x_1,x_2,...,x_n),其域爲D=(D1,D2,...,Dn)D=(D_1,D_2,...,D_n)

對所有變量的定值,所有可能結果的集合記作Eval(Var)Eval(Var),其中的一種定值方式記作映射η\eta,如對變量xx的定值即記作η(x)\eta(x)

在變量上設置的所有條件的集合,記作Cond(Var)Cond(Var)

動作對變量的影響是動作作用於變量原值,再得到變量新值的這樣一個映射,即Act×Eval(Var)Eval(Var)Act \times Eval(Var) \to Eval(Var)


以一個動作α:x:=y+5\alpha : x:=y+5爲例,初始時對變量xxyy的求值η(x)=17\eta(x)=17η(y)=2\eta(y)=2,那麼經過α\alpha動作後的值:
Effect(α,η)(x)=η(y)+5=2+5=3Effect(α,η)(y)=η(y)=2 Effect(\alpha,\eta)(x)=\eta(y)+5=-2+5=3 \\ Effect(\alpha,\eta)(y)=\eta(y)=-2

3 Program Graph

3.1 定義

從本篇2中的數據相關係統的建模,可以瞭解到要使用Program Graph這個模型來代替TS,它定義爲六元組PG=(Loc,Ac,Effect,,Loc0,g0)PG=(Loc,Ac,Effect,\hookrightarrow,Loc_0,g_0),其中:

  • LocLoc是所有Location的集合
  • ActAct是所有動作的集合
  • Effect:Act×Eval(Var)Eval(Var)Effect:Act \times Eval(Var) \to Eval(Var)是動作對變量的影響映射
  • Loc×Cond(Var)×Act×Loc\hookrightarrow \subseteq Loc \times Cond(Var) \times Act \times Loc是Location之間依靠:條件:動作的轉移關係集合
  • Loc0LocLoc_0 \subseteq Loc是初始Location集合
  • g0Cond(Var)g_0 \in Cond(Var)是初始條件集合

3.2 例子

以本篇2.1中的飲料機爲例,其轉移關係\hookrightarrow已經在2.1中給出,其PG六元組中的其它要素如下:
Loc={start,select}Loc0={start}Act={coin,ret_coin,sget,bget,refill}g0={nsoda=maxnbeer=max}Effect(coin,η)=ηEffect(ret_coin,η)=ηEffect(sget,η)=η[nsoda:=nsoda1]Effect(bget,η)=η[nbeer:=nbeer1]Effect(refill,η)=[nsoda:=max,nbeer:=max] \begin{aligned} Loc & =\{start,select\} \\ Loc_0 & =\{start\} \\ Act & =\{coin,ret\_coin,sget,bget,refill\} \\ g_0 & = \{nsoda=max \wedge nbeer=max\} \\ Effect(coin,\eta) & = \eta \\ Effect(ret\_coin,\eta) & = \eta \\ Effect(sget,\eta) & = \eta[nsoda:=nsoda-1] \\ Effect(bget,\eta) & = \eta[nbeer:=nbeer-1] \\ Effect(refill,\eta) & = [nsoda:=max,nbeer:=max] \end{aligned}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章