形式化验证 线性时序逻辑
最近在看老师推荐的Doron的《Software reliable methods》入门形式化验证,学到了线性时序逻辑,做一个笔记。
一阶逻辑和命题逻辑用来表达状态的性质,每一个公式代表了满足它的状态的集合。但是这样的代表状态集合的逻辑是静态的,没法表示状态间的动态演化。
由于上面原因,产生了模态逻辑(Modal logics)。模态逻辑对在程序执行期间不同状态之间的关系进行描述。这样的逻辑非常适合描述交互式的,同步的,或者分布式的系统。在这样的系统中,我们不仅仅关注系统执行始末的状态,还要关注执行过程中的状态序列的其他性质。
线性时序逻辑就是模态逻辑的一种实例!LTL是在静态的底层逻辑之上的,底层逻辑可以描述状态的性质,但是不能描述状态之间的转换,所以我们往往用命题逻辑和一阶逻辑作为底层逻辑。
LTL的语法和语义
下面我们看一下LTL的语法:
底层逻辑的每一个公式都是LTL的公式。
如果 ϕ \phi ϕ和 ψ \psi ψ都是公式,那么 ( ¬ ϕ ) (\lnot\phi) (¬ϕ), ( ϕ ∧ ψ ) (\phi\land\psi) (ϕ∧ψ), ( ϕ ∨ ψ ) (\phi\lor\psi) (ϕ∨ψ), ( ◯ ϕ ) (\bigcirc \phi) (◯ϕ), ( ♢ ϕ ) (\diamondsuit\phi) (♢ϕ), ( □ ϕ ) (\Box\phi) (□ϕ), ( ϕ ⋃ ψ ) (\phi\bigcup\psi) (ϕ⋃ψ),和 ( ϕ ⋁ ψ ) (\phi\bigvee\psi) (ϕ⋁ψ)都是公式
LTL公式是在无限状态序列 x 0 x 1 x 2 . . . x_0x_1x_2... x0x1x2...上解释的。我们这样定义 ξ k \xi^k ξk:它是 ξ = x 0 x 1 x 2 . . . \xi=x_0x_1x_2... ξ=x0x1x2...的一个从 x k x_k xk开始的后缀,也就是 x k x k + 1 x k + 2 . . . x_kx_{k+1}x_{k+2}... xkxk+1xk+2...。
上面是LTL的语法,那么我们来定义一下LTL语义:
- ξ k ⊨ η \xi^k\models\eta ξk⊨η,其中 η \eta η是静态底层逻辑的一个公式,仅当 x k ⊨ η x_k\models\eta xk⊨η
- ξ k ⊨ ( ¬ ϕ ) \xi^k\models(\lnot\phi) ξk⊨(¬ϕ),仅当 ξ k ⊨ ϕ \xi^k\models\phi ξk⊨ϕ不成立
- ξ k ⊨ ( ϕ ∧ ψ ) \xi^k\models(\phi\wedge\psi) ξk⊨(ϕ∧ψ),仅当 ξ k ⊨ ϕ \xi^k\models\phi ξk⊨ϕ并且 ξ k ⊨ ψ \xi^k\models\psi ξk⊨ψ
- ξ k ⊨ ( ϕ ∨ ψ ) \xi^k\models(\phi\vee\psi) ξk⊨(ϕ∨ψ),仅当 ξ k ⊨ ϕ \xi^k\models\phi ξk⊨ϕ或者 ξ k ⊨ ψ \xi^k\models\psi ξk⊨ψ
- ξ k ⊨ ( ◯ ϕ ) \xi^k\models(\bigcirc\phi) ξk⊨(◯ϕ),仅当 ξ k + 1 ⊨ ϕ \xi^{k+1}\models\phi ξk+1⊨ϕ
- ξ k ⊨ ( ♢ ϕ ) \xi^k\models(\diamondsuit\phi) ξk⊨(♢ϕ),仅当存在一个 i ≥ k i\geq k i≥k,令 ξ i ⊨ ϕ \xi^i\models\phi ξi⊨ϕ成立
- ξ k ⊨ ( □ ϕ ) \xi^k\models(\Box\phi) ξk⊨(□ϕ),仅当对于每一个 i ≥ k i\geq k i≥k,令 ξ i ⊨ ϕ \xi^i\models\phi ξi⊨ϕ成立
- ξ k ⊨ ( ϕ ⋃ ψ ) \xi^k\models(\phi\bigcup\psi) ξk⊨(ϕ⋃ψ),仅当存在一个 i ≥ k i\geq k i≥k,令 ξ i ⊨ ψ \xi^i\models\psi ξi⊨ψ,并且对于每一个满足 k ≤ j < i k\leq j<i k≤j<i的 j j j, ξ j ⊨ ϕ \xi^j\models\phi ξj⊨ϕ
- ξ k ⊨ ( ϕ ⋁ ψ ) \xi^k\models(\phi\bigvee\psi) ξk⊨(ϕ⋁ψ),仅当要么对于每一个 i ≥ k i\ge k i≥k, ξ i ⊨ ψ \xi^i\models\psi ξi⊨ψ,要么对于某个 j ≥ k j\ge k j≥k, ξ j ⊨ ϕ \xi^j\models\phi ξj⊨ϕ并且对于每一个满足 k ≤ i ≤ j k\le i\le j k≤i≤j的 i i i, ξ i ⊨ ψ \xi^i\models\psi ξi⊨ψ
我们可以解释一下,其中第2、3、4个式子里面用到了布尔运算符,我们应该很熟悉,而后面的式子用到了模态运算符。其中,
- ◯ ϕ \bigcirc\phi ◯ϕ叫做nexttime,意思是 ϕ \phi ϕ在下一个状态 x k + 1 x_{k+1} xk+1下成立。
- ♢ ϕ \diamondsuit\phi ♢ϕ叫做eventually,意思是一定有一个 ξ \xi ξ的后缀让 ϕ \phi ϕ成立。
- ϕ ⋃ ψ \phi\bigcup\psi ϕ⋃ψ叫做until,意思是在 ψ \psi ψ成立之前 ϕ \phi ϕ都成立。
如果用图形来更直观的表示就是像下面这样
利用LTL表示一些性质
- 可达性
- 简单可达性: ◊ ψ \Diamond \psi ◊ψ
- 多条件的可达性(conditional reachability): ϕ ⋃ ψ \phi \bigcup \psi ϕ⋃ψ
- 安全性
- 不变性: □ ϕ □ϕ □ϕ
- 活性:
- □ ( ϕ ⇒ ◊ ψ ) a n d o t h e r s \Box(\phi \Rightarrow \Diamond \psi)\ and \ others □(ϕ⇒◊ψ) and others
- 公平性:
- □ ◊ ϕ a n d o t h e r s □◊ϕ \ and\ others □◊ϕ and others
- 对偶性定律
- ¬ □ ϕ ≡ ◊ ¬ ϕ ¬□ϕ≡◊¬ϕ ¬□ϕ≡◊¬ϕ
- ¬ ◊ ϕ ≡ □ ¬ ϕ ¬ ◊ ϕ ≡ □ ¬ ϕ ¬◊ϕ≡□¬ϕ
- ¬ ◯ ϕ ≡ ◯ ¬ ϕ ¬ ◯ ϕ ≡ ◯ ¬ ϕ ¬◯ϕ≡◯¬ϕ
- 幂等律
- □ □ ϕ ≡ □ ϕ □□ϕ≡□ϕ □□ϕ≡□ϕ
- ◊ ◊ ϕ ≡ ◊ ϕ ◊◊ϕ≡◊ϕ ◊◊ϕ≡◊ϕ
- ϕ ⋃ ( ϕ ⋃ ψ ) ≡ ϕ ⋃ ψ ϕ⋃(ϕ⋃ψ)≡ϕ⋃ψ ϕ⋃(ϕ⋃ψ)≡ϕ⋃ψ
- ( ϕ ⋃ ψ ) ⋃ ψ ≡ ϕ ⋃ ψ (ϕ⋃ψ)⋃ψ≡ϕ⋃ψ (ϕ⋃ψ)⋃ψ≡ϕ⋃ψ
- 吸收律
- ◊ □ ◊ ϕ ≡ □ ◊ ϕ ◊□◊ϕ≡□◊ϕ ◊□◊ϕ≡□◊ϕ
- □ ◊ □ ϕ ≡ ◊ □ ϕ □◊□ϕ≡◊□ϕ □◊□ϕ≡◊□ϕ
- 分配律
- ◯ ( ϕ ⋃ ψ ) ≡ ( ◯ ϕ ) ⋃ ( ◯ ψ ) ◯(ϕ⋃ψ)≡(◯ϕ)⋃(◯ψ) ◯(ϕ⋃ψ)≡(◯ϕ)⋃(◯ψ)
- ◊ ( ϕ ∨ ψ ) ≡ ◊ ϕ ∨ ◊ ψ ◊(ϕ∨ψ)≡◊ϕ∨◊ψ ◊(ϕ∨ψ)≡◊ϕ∨◊ψ
- □ ( ϕ ∧ ψ ) ≡ □ ϕ ∧ □ ψ □(ϕ∧ψ)≡□ϕ∧□ψ □(ϕ∧ψ)≡□ϕ∧□ψ
公平性
公平性是说在并发系统的交错执行上施加语法限制,保证运行的公平,比如避免某个程序一直被推迟执行,最后饿死。
公平性假设是用来排除我们建模的系统的不合理的无限执行。下面介绍几种常见的公平性假设:
-
弱进程公平性
如果一个执行包含某个状态s,且总有至少一个属于进程 P i P_i Pi的转换可执行但在s之后没有 P i P_i Pi的转换被执行,那就排除这个执行。 -
强进程公平性
如果在一个执行上进程 P i P_i Pi的转换可以被执行无限次,但仅仅被执行有限次,则排除这个执行。 -
弱转换公平性
如果一个执行包含某个状态s,并且总有一个转换可执行但从未在s后被执行,则排除这个执行。 -
强转换公平性
如果一个执行上有一个转换可以被执行无限次,但是仅仅被执行有限次,则排除此执行
那么我们回到LTL,我们会用到下面的转换命题:
-
e x e c α exec_α execα
转换 α \alpha α被执行,这个是一个包括可选的状态和转换的执行的一个例子,其中 α \alpha α是一个转换的名字。 -
e x e c p i exec_{p_i} execpi
代表来自 P i P_i Pi的一个转换被执行,这个是 ⋁ α ∈ P i e x e c α \bigvee_{\alpha\in P_i}exec_\alpha ⋁α∈Piexecα的一个缩写。
下面是对于公平性假设的描述:
-
弱转换公平性
W T F = ⋀ α ∈ T ¬ ♢ □ ( e n α ∧ ¬ e x e c α ) WTF = \underset{\alpha\in T} {\bigwedge}\lnot\diamondsuit \Box(en_\alpha \wedge \lnot exec_\alpha) WTF=α∈T⋀¬♢□(enα∧¬execα)
翻译成人话就是不会从某一个点开始始终\alpha可以执行但不会执行。 -
强转换公平性
S T F = ⋀ α ∈ T ( □ ♢ e n α → □ ♢ e x e c α ) STF= \underset{\alpha\in T}{\bigwedge} (\Box\diamondsuit en_\alpha \rightarrow \Box\diamondsuit exec_\alpha) STF=α∈T⋀(□♢enα→□♢execα)
翻译一下呢,就是对于每一个转换\alpha,如果从每个状态开始, α \alpha α终究都可执行,那么终究都会执行。 -
弱进程公平性
W T F = ⋀ p i ¬ ♢ □ ( e n P i ∧ ¬ e x e c P i ) WTF = \underset{p_i} {\bigwedge} \lnot\diamondsuit\Box(en_{P_i} \wedge \lnot exec_{P_i}) WTF=pi⋀¬♢□(enPi∧¬execPi) -
强进程公平性
S T F = ⋀ P i ( □ ♢ e n P i → □ ♢ e x e c P i ) STF= \underset{P_i}{\bigwedge}(\Box\diamondsuit en_{P_i} \rightarrow \Box\diamondsuit exec_{P_i}) STF=Pi⋀(□♢enPi→□♢execPi)
这些公平性条件之间关系