爲方便,線性時序性質(linear-time properties)後續均簡稱LT性質。
在系統分析中,描述線性時序行爲(linear-time behavior)可以是基於動作的(action-based approach),也可以是基於狀態的(state-based approach),本章主要學習的是基於狀態的(但在學習公平性時用動作描述),也就可以在TS中刻意忽略轉移過程中的具體動作,而只考慮前後狀態。
1 前置知識
1.1 路徑(path)與狀態圖
TS可以表示成狀態圖(V,E)的形式,其中狀態就是其結點V=S,邊就是狀態到狀態的轉移關係E={(s,s′)∈S×S′ ∣ s′∈Post(s)}。這裏Post(s)是從狀態s的所有直接後繼狀態的集合,相關內容見筆記3中的定義。
約定,將無限長的path記爲π等小寫字母,而將有限長的path記爲π^等頭戴^
的小寫字母。從狀態s出發的所有path記爲Paths(s),所有有限長的path記爲Pathsfin(s)。
1.2 跡(traces)
一個TS系統可以用一系列trace來描述其行爲軌跡,具體是,跡被定義爲一串接連到達的狀態si的標籤函數L(si)的序列。因爲L∈2AP,所以跡上的每個元素也是AP的子集。
例如,狀態圖上的一系列接連的轉移是一個path:
s0⟶α1s1⟶α2s2...
這可以簡記爲:
s0s1s2...
對其中每個結點對應的狀態用標籤函數映射到2AP上,得到的就是一個跡(trace):
L(s0)L(s1)L(s2)...
具體地,這個跡可能是這樣的形式:
{a} {a,b} ϕ ...
其中a,b∈AP。
約定,用trace()表示對path(如π),或者path的集合中的每個元素(如π∈Π)取跡。對每個path而言,無限長的path得到無限長的跡,有限長的path得到有限長的跡。
- 從path集合得到trace集合:
trace(Π)={trace(π) ∣ π∈Π}
約定,用Traces()表示從狀態(如s),或者從TS中的每個初始狀態(如s∈I from TS)出發的所有跡的集合。用Tracesfin()表示只取有限長度的那些跡組成集合。
-
從s出發的所有path的trace:
Traces(s)=trace(Paths(s))
-
從TS的初始狀態出發的所有path的trace:
Traces(TS)=s∈I⋃Traces(s)
-
從s出發的所有有限長path的trace:
Tracesfin(s)=trace(Pathsfin(s))
-
從TS的初始狀態出發的所有有限長path的trace:
Tracesfin(TS)=s∈I⋃Tracesfin(s)
1.3 無限字和有限字
舉例來說,如原子命題集合AP={a,b},則2AP是AP的冪集:
2AP={ϕ,{a},{b},{a,b}}
那麼(2AP)ω表示以2AP中元素爲字母構成的所有無限長的字的集合,稱爲2AP上的無限字集合。也就是說,這個集合是這樣一種形式:
(2AP)ω={ϕ {b} {a} ... ,{a,b} {a,b} {a} ... ,...}
同理可定義2AP上的有限字集合,其形式如下:
(2AP)∗={ϕ ,{a} ,{b} ,{a,b} ,ϕ ϕ ,ϕ {a} ,...}
注意,無限字和無限字集合不是一個概念,無限字集合中的每個元素都是無限字,無限字指用無限多個字母組成的序列,在這裏,冪集2AP中的每個元素都是一個字母(例如{a,b})。
無限字集合和有限字集合中的元素數目都是無限多的。
2 LT性質
以兩進程併發,並帶有一個互斥信號量控制的例子爲例:
它們併發後轉爲TS,結果如下:
每個狀態都是由之前兩PG的Loc和互斥信號量y的取值組成(見筆記5PG向TS的轉換),其中紅色和藍色分別表示兩個進程的Loc,n表示在非臨界區,w表示想要進入臨界區,c表示正處在臨界區。
2.1 一般描述
LT性質可用無限字集合的子集來表示,即P⊆(2AP)ω。
一個TS滿足P,記爲TS⊨P,當且僅當從其初始狀態出發的所有trace都在P中,即Traces(TS)⊆P。
例如,取原子命題集合AP={crit1,crit2},這之中的兩個命題分別表示兩進程P1和P2處在訪問臨界資源狀態。則【永遠至多隻有一個進程進入臨界資源】這一LT性質可表示爲:
Pmutex=無限字A0A1A2..的集合,保證對所有i≥0有{crit1,crit2}⊈Ai
也就是說,像{crit1} {crit2} {crit1}...這樣的trace是合法的,但是不會在trace中出現{crit1,crit2}這一項,見上一張圖中沒有同時存在c1和c2的狀態。
2.2 無飢餓性(starvation freedom)
無飢餓性(Pnostarve)表示,一個想訪問臨界資源的進程最終一定能訪問到臨界資源。
在上面的例子中,取原子命題AP={wait1,crit1,wait2,crit2},注意這裏和2.1
中的例子的取法不一樣,因爲那裏只關注“處在臨界區”,而這裏還要關注“想要進入臨界區”。則“無飢餓性”可以表達爲滿足如下條件的無限字A0A1A2..的集合Pnostarve:
(∃∞j.waiti∈Aj)⇒(∃∞j.criti∈Aj) for each i∈{1,2}
也就是說,對每個進程i,若無限經常次存在j,使得waiti∈Aj,那麼就無限經常次存在j,使得criti∈Aj。也即“無限經常次想要最終會導致無限經常次獲得”,這就是無飢餓性。
前面的例子不滿足無飢餓性,如下圖中標註的無限trace,進程2無限經常此wait,卻始終無法進入臨界區:
2.3 兩TS的trace集合與LT性質的關係
假設TS和TS′是同一AP上的兩transition system,那麼,其trace集合可能特別地存在包含關係和等價關係。
包含關係意在說明一系統擴張了另一系統的實現,而等價關係則指出兩確定性的系統是一致的。
2.3.1 包含關係
Traces(TS)⊆Traces(TS′)當且僅當對任意LT性質P,有TS′⊨P→TS⊨P。
這可以由TS滿足LT性質的定義直觀得到,即右邊意爲Traces(TS′)⊆P→Traces(TS)⊆P。
2.3.2 等價關係
Traces(TS)=Traces(TS′)當且僅當它們總是滿足相同的LT性質。也即對任意LT性質P,有TS′⊨P↔TS⊨P(雙蘊含)。
這可由雙向的2.3.1
得到,兩個trace集合互相包含,也就是等價的。
2.4 不變性(invariants)
不變性(Pinv)表示,TS的所有可達狀態都滿足某一不變性條件Φ。
用LT性質的形式表達,不變性可表示爲這樣的無限字集合,每個無限字上的每個字母(也即AP的子集)總是滿足一不變性條件(實爲命題邏輯公式)Φ:
Pinv={A0A1A2..∈(2AP)ω ∣ ∀j≥0. Aj⊨Φ}
說TS⊨Pinv,即TS滿足某一不變性性質Pinv,實則是和下面三個命題是等價的:
- 對TS的所有無限長的路徑π,有trace(π)∈Pinv
- 對TS的所有路徑上的所有狀態s,有L(s)⊨Φ
- 對TS的所有可達狀態s∈Reach(TS),有L(s)⊨Φ
顯然,不變性性質只有一個不變性條件Φ是可定製的,也就是一個Φ即可決定整個不變性性質。對不變性的檢查只需搜索(如DFS)整個TS的圖結構,看看每個結點狀態是不是都滿足Φ(這是由上面的命題3知道的),而不需要真的找出所有的無限path。
2.5 安全性(safety properties)
2.5.1 簡述
僅在和security properties
一詞不會發生混淆的語境,可將其直接翻譯成安全性。
安全性(Psafe)是不變性的超集,也就是說所有的不變性都屬於安全性。和不變性不同的那部分在於,安全性不一定都能像不變性那樣通過檢查所有的可達狀態來檢驗,而往往是基於有限的path片段的約束,安全性涉及一個壞前綴(bad prefix)的概念。
若將安全性表示爲LT性質Psafe,它一定是一個無限字的集合,那麼從無限字全集(2AP)ω中將其去掉,所得到的一系列無限字即σ∈(2AP)ω∖Psafe,每個無限字σ的所有前綴σ^都是壞前綴(是有限字),從這些壞前綴拓展出的所有無限字都不在安全性中:
Psafe∩{σ′∈(2AP)ω ∣ σ^是σ′的前綴}=ϕ
安全性的形式定義比較複雜,但是其表達的意義是很直觀的。也就是說系統表示成TS以後,其一系列執行的狀態片段裏都不能出現特定形式的片段,這個“特定形式”也就是用壞前綴σ^來表達的安全性屬性。
因爲壞前綴的形式可以多種多樣,很多時候需要用繁雜的命題來書寫約束,而沒辦法寫成像2.4
中表達不變性那樣的單純的命題邏輯公式。
安全性Psafety的所有壞前綴組成的集合記爲BadPref(Psafety),對每個壞前綴總能找到一個最小壞前綴,從最小壞前綴擴展出的所有有限字都是壞前綴。
2.5.2 例子
例如,交通燈的【紅燈緊跟在黃燈出現以後】,寫爲:
對所有無限字σ=A0A1.., (red∈Ai)→((i>0) and (yellow∈Ai−1))
又如,飲料機的“在任一時刻i,有效投幣總量不少於已分發的總飲料數”,寫爲:
對所有無限字σ=A0A1.., ∣{0≤j≤i ∣ pay∈Aj}∣≥∣{0≤j≤i ∣ drink∈Aj}∣
在交通燈的例子中,如"ϕ ϕ {red}“和”{red}“都是最小壞前綴,而”{yellow} {yellow} {red} {red} ϕ {red}“雖是一個壞前綴,但不是最小壞前綴,因爲它還可以縮小爲”{yellow} {yellow} {red} {red}"。
2.5.3 安全性的有限trace集表示
一個TS滿足某安全性Psafe,當且僅當TS的有限trace集和安全性的壞前綴集不相交:
TS⊨Psafe↔(Tracesfin(TS) ∩ BadPref(Psafe)=ϕ)
2.6 LT性質的閉包(closure)
定義pref(σ)爲無限字σ的所有有限前綴集合:
pref(σ)={σ^∈(2AP)∗ ∣ σ^是σ的有限前綴}
例如,取σ=A0A1..則pref(σ)={ϵ,A0,A0A1,..}。
還可以定義LT性質P的前綴,爲其中所有無限字的前綴集合的並集:
pref(P)=α∈P⋃pref(σ)
那麼,LT性質P的閉包定義爲前綴都在pref(P)中的那些無限字的集合(得到的還是一個LT性質):
closure(P)={σ∈(2AP)ω ∣ pref(σ)⊆pref(P)}
也就是說,P的閉包是那些前綴也是P的前綴的無限字的集合。反過來看,P的閉包中的無限字不會以不是P的前綴的有限字爲前綴。
使用閉包可以判定一個LT性質是不是安全性。一個LT性質是安全性,當且僅當其閉包是其本身:
closure(P)=P
2.7 活性(liveness)
活性(Plive)相比安全性而言,其表達的是在無限時間上的性質。安全性表達“壞的事情不會出現”,而活性則表達“期望的事情最終一定會出現”。
相比安全性,活性只能在無限時間上判定真僞,所以它不會移除任何有限字,其前綴集合就是整個有限字集合:
pref(Plive)=(2AP)∗
活性可以分爲三種:
- Eventually:如【每個進程最終都能訪問臨界資源】
- Repeated eventually:如【每個進程最終都能無限經常次訪問臨界資源】
- Starvation freedom:如【每個想要訪問臨界資源的進程最終都能訪問臨界資源】
注意,pref(Plive)=(2AP)∗等價於closure(Plive)=(2AP)ω。
2.8 非安全性也非活性的例子
若定義LT性質爲P⊂(2AP)ω,則安全性和活性是不相交的。
若定義LT性質爲P⊆(2AP)ω,則僅有(2AP)ω既是安全性又是活性。這可由“安全性的閉包是其自身,而活性的閉包是整個無限字”來驗證。
並非所有LT性質都是安全性或者活性,但總能表示成一個安全性和一個活性的合取形式。
例如【一個機器初始吐出三瓶雪碧,接下來可以無限經常次地吐出啤酒】,這一用自然語言描述的性質。僅看前半句是安全性(因爲能用壞前綴表述,如前三個至少有一個是啤酒,那麼就是一個壞前綴);僅看後半句是活性(注意,無限經常次吐出啤酒,並非是僅允許吐出啤酒,任何有限序列都無法說明是不是無限經常次吐出啤酒,這部分是活性)。
2.9 分解定理(decomposition theorem)
任何一個LT性質總能分解成安全性和活性的交集:
P=Psafe∩Plive
一般地,因爲閉包的閉包仍是自身(一定是安全性),總可以將其按閉包分解出來:
P=closure(P) ∩ (P∪((2AP)ω∖closure(P)))
更加一般地,所分解出的安全性是閉包的超集,而活性則是右半部分的子集:
PsafePlive⊇closure(P)⊆(P∪((2AP)ω∖closure(P)))
2.10 基於動作的公平性(fairness)
公平性可以用於去除那些不合實際(unrealistic) 的系統行爲,公平性有時是建立活性性質的必要手段。例如,對兩個紅綠燈進程的interleaving:
TS=TrLight1 ∣∣∣ TrLight2
給定一個活性性質的自然語言描述爲【每個紅綠燈都無限經常次處在綠燈狀態】,那麼下面這個trace在TS中,卻不滿足那條活性:
{red1,red2} {green1,red2} {red1,red2} {green1,red2} ...
這個例子可以看出unrealistic這一詞的精髓。這個模型本身沒有問題,但這條trace是不合實際的,因爲實際中並不會有某一個紅綠燈的切換頻率是無窮大的,以至於在無限長的trace中另一個紅綠燈的切換都未被記錄。
注意,trace中有多少元素和時間尺度無關,只和系統的狀態轉換的次數有關。假如兩個紅綠燈,一個切換頻率是無窮大,另一個切換頻率是40秒,那麼無論多長的trace都沒法表達完40秒(甚至1秒或者0.0…1秒)。
公平性的引入即是爲了排除此類不現實的trace,也就在模型檢驗階段避免了相應的不現實執行的驗證(後面會討論排除得過多和過少的問題)。
公平性可以分爲三種,無條件的、強的、弱的。對一個沒有終止狀態的TS,存在若干無限的執行片段,每個都可記爲s0α0s1α1...,則可以用動作的子集A⊆Act定義三類公平性:
-
Unconditional A−fair:A中存在無條件無限經常次執行的動作。
true⟹∀k≥0. ∃j≥k. αj∈A
因爲是無條件的,所以⇒左邊是true,右邊完全是在詮釋【A中存在無限經常次執行的動作】,即對trace中的動作序列的任一位置k,總能在其後找到一個位置j,該位置的動作αj∈A。
-
Strongly A−fair:若A中存在無限經常次使能(想做)的動作,那麼A中存在無限經常次執行的動作。
(∀k≥0. ∃j≥k. Act(sj)∩A=ϕ)⟹∀k≥0. ∃j≥k. αj∈A
右邊是不變的。整體上表示,對trace中的狀態序列的任一位置k,若總能在其後找到一個位置j,使得狀態sj的所有直接動作Act(sj)中存在A中的動作,也即Act(sj)∩A=ϕ(至此即表示無限經常次使能),那麼A中一定存在無限經常次執行的動作(⇒右邊)。
-
Weakly A−fair:若從某位置開始,不斷有A中的動作使能,那麼A中存在無限經常次執行的動作。
(∃k≥0. ∀j≥k. Act(sj)∩A=ϕ)⟹∀k≥0. ∃j≥k. αj∈A
右邊是不變的。整體上表示,從trace中的狀態序列的某一位置k開始,若其後的所有位置j,對應的狀態sj的所有直接動作Act(sj)中總是存在A中的動作,也即Act(sj)∩A=ϕ(至此即表示從某一位置之後不斷使能),那麼A中一定存在無限經常次執行的動作(⇒右邊)。
在下圖標註的執行中,取A={enter1,enter2},可見A中的動作enter1和enter2都無限經常次使能,最終enter2∈A無限經常次執行了,所以這個trace是滿足strongly A−fair的。
這裏留下一點個人猜想:雖然聽起來有點違背事實,可以證明在任意的動作集合A∈Act下無條件的公平性和強公平性是等價的。
因爲如果A中某些動作無限經常次執行,那麼這些動作一定無限經常次使能。所以可以從無條件公平推出強公平。這個還能說明,不存在僅有enter1無限經常次使能而導致enter2無限經常次執行的情況,因爲無限經常次執行的動作一定也在無限經常次使能裏面。
在下圖標註的執行中,取A={req2},可見A中的動作req2從k=0之後就不斷使能,但A中沒有無限經常次執行的動作,所以這個trace不滿足weakly A−fair。
注意,【不斷使能】是接下來每個狀態都要使能,比【無限經常次使能】更苛刻。
但還需注意,因爲定義弱公平性時先說明了存在一個起始點k,所以強公平性和弱公平性無法比較哪個更嚴格。倘若指定了弱公平性裏的起始點k=0,這時就可以比較了,它要比強公平性的條件更嚴格。這在字面上好似很矛盾,實際上沒有什麼問題,可以類比着看,無條件公平性中的條件true是最寬鬆的條件。
2.11 公平性對path的過度去除和去除不足
公平性的引入就是爲了去除不合理的path,但是當去除得太多(約束過強)或者去除得太少(約束過弱)時,驗證結果導出的true和false和真實的合理的模型的true和false有一定的不確定關係,實際上這裏也就是一個很普通的集合問題。
2.12 公平性假設(fairness assumptions)
公平性假設F將無條件公平、強公平性、弱公平性分屬成三個集合,表示爲三元組:
F=(Fucond,Fstrong,Fweak)
其中的每個元素Fxxx是該類公平性屬性的集合。如Fucond={fucond1,fucond2,...},對之中的每個fucondi⊆Act。類似地,可知Fucond,Fstrong,Fweak⊆2AP。
稱一個執行片段ρ滿足公平性假設F,也即稱它是F−fair的,意爲:
- 對所有A∈Fucond,執行片段ρ是unconditionally A−fair的
- 對所有A∈Fstrong,執行片段ρ是strongly A−fair的
- 對所有A∈Fweak,執行片段ρ是weakly A−fair
例如,取2.10
中第一個例子的執行:
當F=(ϕ,{{enter1,enter2}},ϕ),也就是說沒有Fucond和Fweak,而且Fstrong裏也只有一個公平性性質fstrong1={enter1,enter2},這個公平性假設和2.10
第一個例子給出的強公平性性質是完全一樣的。所以圖上的執行是滿足這個公平性性質F的。
又如,還是上面這個執行,但是將上面的例子Fstrong裏唯一的公平性性質裏的動作拿出來,拆成兩個,得到:
F′=(ϕ,{{enter1},{enter2}},ϕ)
顯然,這個執行對fstrong2={enter2}是滿足強公平性的,但是對fstrong1={enter1}是不滿足的,所以對整個公平性性質F′也是不滿足的。
又如,取2.10
中第二個例子的執行:
對上個例子的F′加入兩個弱公平性屬性:
F′′=(ϕ,{{enter1},{enter2}},{{req1},{req2}})
考察上圖中的執行是否滿足F′′中的每個公平性屬性:
- fstrong1={enter1}是滿足的,因爲enter1無限經常次使能且無限經常次進入了
- fstrong2={enter2}是滿足的,因爲其中的全部動作即僅enter2沒有無限經常次使能(所以也不用看有沒有無限經常次執行了)
- fweak1={req1}是滿足的,因爲對於其中的全部動作即僅req1而言,在狀態序列上找不到一個位置k使得在這之後的所有狀態都有req1不斷使能(所以也不用看有沒有無限經常次執行了)
- fweak2={req2}是不滿足的,見
2.10
的第二個例子。
綜上,上圖中的執行不滿足公平性假設F′′。
2.13 TS被公平性假設F約束後滿足LT性質P
將公平性整合爲公平性假設後,拿整個公平性假設來作爲性質約束模型,以去除模型中不切實際的那些trace。前面說的都是執行片段ρ滿足公平性假設F,這裏要將其拓展到path π,再拓展到trace σ上。
稱形如s0→s1...是F−fair的,僅當存在與之對應位置狀態相同的執行序列s0α0s1α1...。
記FairPathsF(s)爲從狀態s出發的所有F−fair的path的集合。
記FairPathsF(TS)爲⋃s∈IFairPathsF(s),即從所有初始狀態出發的所有F−fair的path的集合。
稱F−fair的path π的對應trace,即σ=trace(π)也是F−fair的。
直接對上面的FairPaths取trace,得到從某狀態出發的所有F−fair的trace,以及整個TS的F−fair的trace:
FairTracesF(s)FairTracesF(TS)=trace(FairPathsF(s))=trace(FairPathsF(TS))
前面學了,說一個TS滿足LT性質P,即TS⊨P,當且僅當其trace集合是P的子集,即Traces(TS)⊆P。
引入公平性假設後,稱TS被公平性假設F約束後滿足LT性質P,只需考慮TS中的那些被公平性假設約束後的trace集合是P的子集即可,記爲:
TS⊨FP iff FairTracesF(TS)⊆P
例如,對本篇全文采用的互斥信號量的例子(見2
開頭),在2.12
中考察了三個公平性假設。若針對這個例子,給出一個LT性質【每個進程都能無限經常次進入臨界區】記爲P,用2.12
中的F′約束是不滿足P的,即TS⊭F′P,但是用F′′約束後就是滿足P的了,即TS⊨F′′P。
因爲公平性假設F的約束是在無限trace上的,而安全性是在有限trace上的,所以一個TS用公平性約束與否不會影響其是否滿足某個安全性性質:
TS⊨Psafe iff TS⊨FPsafe
相對地,活性是在無限trace上的,一個TS用公平性約束,無法保證約束後的TS對某活性性質的滿足性仍保持。