最開始,系統可以處于9個狀態中的任意一個,其中對于A和B的水位沒有任何限制,而pump的初始狀態假定為off。這樣,我們就可以利用有序元組
這 些狀態可以無限執行(或運算)樹狀結構的形式進行排列。如圖3所示,樹根為我們所選的初始狀態,任意狀態的分支均表示下一個可能的狀態,而每個系統執行都 是執行樹狀結構的一條路徑??傮w上,系統可以具有無限多個這樣的執行路徑。模型校驗的目標就是檢驗執行樹狀結構是否滿足用戶指定的屬性要求。
現 在的問題在于,我們究竟該如何描述執行樹狀結構路徑(及路徑上的狀態)的屬性。從技術的角度看,運算樹邏輯(Computation tree logic, CTL)是時序邏輯(time temporal logic, TTL)的一個分支,其簡單性和直觀性非常適合于本例。CTL是常用的布爾命題邏輯(Boolean propositional logic, BPL)的擴展,除了支持包括“和(and)”、“或(or)”、“否(not)”、“蘊涵(implies)”在內的BPL邏輯連接操作外,還支持輔助 的時序連接操作。表2所示為 CTL 中的某些連接操作。
表1和圖4說明了CTL中一些基本時序連接操作的直觀意義。一般地,E(就某個路徑而言)和A(就所有的路徑而言)表示從某個狀態開始的路徑數目。F(就某個狀態而言)和G(就所有狀態而言)表示某個路徑中的狀態數目。
?
圖4:狀態s0處滿足CTL公式的直覺推導。
對 于指定的屬性以及對應于系統模型的運算樹T(可以是無限運算樹),模型校驗算法可以通過校驗T判斷T是否滿足該屬性。例如,考慮指定的屬性AF g,其中g表示與任何CTL連接無關的命題公式。圖4b給出了運算樹T的一個示例。如果屬性AF g在根狀態s0的值設定為true(即如果T中的每條路徑中有狀態開始于s0以使公式g為true),那么對于該運算樹TAF g的值為true。如果g在s0為true,那么就實現了預定目標,因為s0將會出現在從s0開始的每條路徑中。但如果g在s0狀態下不為true,由于 從s0開始的路徑要么是s0的左分支,要么是s0的右分支,因此如果在運算樹T中s0的兩個分支都為true(通過遞歸校驗),那么該屬性在s0處也為 true。
圖4b顯示,g在左分支根部為true(球體填充為黃色)。因此從s0到左分支單元的所有路徑以及整個左分支樹都 滿足該屬性?,F在假定g在s0的右分支根部不為true;因此對于所有的子單元都將遞歸檢驗該屬性。圖4b顯示,對于s0右分支的所有子單元,g都為 true(球體填充為黃色),因此對于s0的右分支樹該屬性為true。這樣,對于s0的所有子分支樹該屬性為true,從而s0也為true。
圖4 歸納了類似的其他屬性(例如EG g和AG g)校驗原理。當然,實際應用中的模型校驗算法遠比這復雜;這些算法利用一些巧妙的簡化手段對狀態空間進行精簡,從而避免了對那些確保為true的屬性進 行校驗。一些設計良好的模型校驗器可用來校驗狀態數高達1,040個的狀態空間的屬性。在SMV中,待驗證的屬性可由SPEC部分的用戶指定。邏輯連接 “否”、“或”、“和”和“if-then”可以分別用!、|、&和 ->表示。CTL時序連接則表示為AF、AG、EF、EG等。屬性AF(pump=on)表示對于每條開始于初始狀態的路徑,路徑中有一個pump =on的狀態。在初始狀態,該屬性顯然為false,因為從初始狀態開始有一條路徑pump的值始終為off(例如,當水槽A永遠保持為空時)。如果希望 在SPEC部分中描述該屬性,那么SMV將為該屬性生成如下反例。循環表征了開始于初始狀態的無限狀態序列(換言之,即路徑),這樣水槽B在該路徑下的每 個狀態均為Full,因此pump=off。
與嚴格的規范化語言相結合,可以下列執行序列表示:
state 1.1:
level_a = Full
level_b = Full
pump = off
state 1.2:
屬性AF(pump=off)具有兩重含義,表征的是對于每條開始于初始狀態的路徑,路徑中有一個狀態中pump=off。該屬性當然在初始狀態為true,因為初始狀態本身(所有路徑均包含初始狀態)pump=off就成立。
?
表2:CTL中的一些時序連接。
時 序連接和邏輯連接相結合,可以得到一些有趣的復雜屬性。屬性AG((pump=off) -> AF (pump=on))表示如果pump=off,那么最終pump=on這種情形總會發生。初始狀態,該屬性顯然為false。屬性AG AF (pump=off -> (level_a=Empty | level_b=Full))表示如果底層水槽為Empty或上層水槽為Full,那么pump將總是為off。屬性AG (EF (level_b= ok|level_b=Full))表示總是會出現上層水槽為ok或Full的情形。
實際應用中的模型校驗
模型校驗已被證明是對各類系統(尤其是硬件系統、實時嵌入式系統和安全臨界系統)進行需求和設計驗證的有效工具。例如,SPIN模型校驗器曾用于驗證NASA的深空1發射方案中的多線程規劃執行模型并成功地發現了5個先前未知的并發缺陷。然而,實際使用模型校驗時還需要注意下面一些主要問題:
1. 每種模型校驗工具都采用特有的建模語言,這些建模語言一般都無法將不規范的需求描述自動轉化為規范化語言。這樣的轉化顯然需要手工完成,因此很難檢驗模型 是否正確地表示了建模系統。實際上,指定的建模表示法往往很難甚至根本不可能對部分系統需求進行建模。2. 專用工具屬性規范表示法也存在類似的問題,屬性表示法通??梢允荂TL、CTL*或命題線性時序邏輯(PLTL)的變形。某些需要驗證的屬性很難甚至根本 不可能用該表示法進行描述。3. 模型系統中的狀態數量也可能極為龐大。盡管模型校驗算法可以利用一些技巧減小狀態空間的復雜度,但模型校驗器仍然需要很長的時間才能驗證一個指定的屬性或 者決定“放棄”驗證該屬性。這時,用戶將不得不投入更大的精力,獨立驗證模型的各部分或者通過減小變量的取值范圍以達到簡化狀態空間的目的。
盡管如此,模型校驗仍被證明是無與倫比的系統需求或設計驗證工具。該工具能在需求或設計的早期階段發現瑕疵,因此能極大地節省后續的開發時間。
評論
查看更多