傳統斷言(前置/後置條件、不變量)雖有用,但無法表達隨時間演變的屬性。時態邏輯 作為描述程式狀態隨時間變化的形式體系,彌補此缺口,支援安全性斷言(壞事永不發生)與生存性斷言(好事最終發生)。
無法表達的關鍵屬性:
| 運算子 | 語義 |
|---|---|
Always | 斷言在程式剩餘執行期間持續成立 |
Sometime | 未來某時刻斷言成立(弱於 Always) |
Until | 第一斷言停止成立後,第二斷言必須持續成立 |
Next | 下一離散步驟斷言成立(適用步進時間模型) |
Always x != 0
Sometime x == 0
{x == y} implies {Next {x == y + 1}}
{x == y} Until {y == 0}
{x == 0} implies {Next {Always {x != 0}}} // x 只為零一次
Sometime {! this.isInterrupted()} // 執行緒不會永遠中斷
// 死結自由
Always {x.isWaitingOn(y) implies {! y.isWaitingOn(x)}}
ForAll agents in AgentPool {
ForAll document in TopSecretDocumentPool {
{! agent.canView(document)} Until {agent.hasClearanceFor(document)}
}
}
/* TRAssert{斷言 => 輸出訊息} */,嵌入 Java 代碼中,無工具仍可編譯(斷言失效)。每個時態邏輯斷言可對應無數傳統斷言,極大提升測試效能與覆蓋深度,有力消除本系列討論的典型錯誤模式。
時態邏輯將程式驗證從靜態快照提升至動態演化維度。下回將在時態邏輯框架下重審前文錯誤模式,展示其消除錯誤的實戰威力。