随着信息和通信技术的广泛应用,软件的正确性检查变得非常重要。系统的可靠性取决于硬件和软件。
模式检查的优势:
- 快速
- 无需严格证明
- 逻辑可以很容易地表达许多并发属性
SPIN系统
SPIN(Simple Promela INterpreter)是一种验证并发系统正确性的工具,是最先进的模型检查器之一。它使用Promela语言表示并发系统
Promela语言
ProMeLa(Protocol/Process Meta Language)允许以动态方式创建流程,通过消息通道实现同步/异步通信。该语言的语法与C相似。
数据类型
| 名称 | 大小(bits) | 用法 | 取值范围 |
|---|---|---|---|
| bit | 1 | unsigned | $[0,1]$ |
| bool | 1 | unsigned | $[0,1]$ |
| byte | 8 | unsigned | $[0,255]$ |
| mtype | 8 | unsigned | $[0,255]$ |
| short | 16 | signed | $[-2^{15}, 2^{15}-1]$ |
| int | 32 | signed | $[-2^{31}, 2^{31}-1]$ |
数组:
|
|
结构体:
|
|
过程
要定义流程,我们需要指定:流程名称、形式参数、局部变量声明和语句。
|
|
实例化一个过程:
|
|
特别地,活动进程是自动创建的实例化的进程。在活动进程中,不能使用任何参数:
|
|
如果要创建的活动进程数量为1,则可以略去
[]
消息通道
定义
|
|
例如:chan ch = [16] of {short, byte, bit}
const用于指定通道的大小,上限为255。特别地,对于const=0的情况,通道实现的通信为同步通信
发送和接收消息
|
|
如果通道未满,则该语句可执行(在这种情况下,消息将附加到通道上);否则,该语句将被阻塞。
|
|
如果通道不为空,则该语句可执行(在这种情况下,消息将从通道中删除);否则,该语句将被阻塞(等待正确的消息)。如果 $e_i$ 是一个变量,则消息中的值将被分配给 $e_i$。
原子语句
在实例化流程中,执行序列stat1; stat2; ...,执行状态可能会被打破。为了避免这种情况,我们可以使用原子语句序列:
|
|
上述序列将作为一个不可分割的步骤执行,除非序列中的某些语句被阻塞。一旦被阻止的语句变得可执行,序列中的其余语句将继续执行。
选择语句
|
|
上面的每个guard_i都被称为option_i的卫式。
- 如果没有可满足的卫式,则阻塞选择语句,直到某些卫式可用。
- 如果同时有多个可满足的卫式,则将随机选择一个选项执行。
- 如果
guard_i是重言式,我们将忽略guarded_i ->
循环语句
|
|
重复语句类似于选择语句,但它会重复执行,直到执行break语句或goto-jump将控制权转移到循环之外。
模式检查
给定一个结构 $M$ 和一个公式 $\varphi$,如果 $M \vDash \varphi$ 成立,则称 $M$ 是 $\varphi$ 的模型。
证明 $M \vDash \varphi$ 的过程就称作模式检查。
许多问题都可以用模式检查描述,例如:
模式检查的应用
基本时态
记符号 $p$ 为一个原子命题,例如DeviceEnabled,则有:
| 符号 | 含义 |
|---|---|
| $\text{F}p$ | $p$ 在未来有时成立(Future) |
| $\text{G}p$ | $p$ 在未来一直成立(Globally) |
| $\text{X}p$ | $p$ 在下一时刻成立(Next) |
| $p\text{U}q$ | $p$ 直到 $q$ 成立后才成立(Until) |
它具有如下性质:
- 否定律:$\lnot \text{X} \varphi \equiv \text{X} \lnot \varphi$,$\lnot \text{G} \varphi \equiv \text{F} \lnot \varphi$,$\lnot \text{F} \varphi \equiv \text{G} \lnot \varphi$
- 分配律:$\text{G}(\varphi \land \psi) \equiv \text{G} \varphi \land \text{G} \psi$,$\text{F}(\varphi \lor \psi) \equiv \text{F} \varphi \lor \text{F} \psi$
- 互定义:$\text{F} \varphi \equiv \lnot \text{G} \lnot \varphi$,$\text{G} \varphi \equiv \lnot \text{F} \lnot \varphi$,$\text{F} \varphi \equiv (p \lor \lnot p) \text{U} \varphi$
- 幂等律:$\text{F} \text{F} \varphi \equiv \text{F} \varphi$,$\text{G} \text{G} \varphi \equiv \text{G} \varphi$
- $\text{G} \text{F} \text{G} \varphi \equiv \text{F} \text{G} \varphi$,$\text{F} \text{G} \text{F} \varphi \equiv \text{G} \text{F} \varphi$,$\text{G}(\text{F} \varphi \lor \text{F} \psi) \equiv \text{G} \text{F} \varphi \lor \text{G} \text{F} \psi$
线性时序逻辑
设Atom为命题变量集。为方便起见,设 $p, q, r, \cdots$(可能带有下标)表示命题变量。LTL则可以用如下的形式表示:
$$\varphi ::= p \mid (\lnot \varphi) \mid (\varphi \lor \varphi) \mid (\varphi \land \varphi) \mid (\varphi \Rightarrow \varphi) \mid (\text{X} \varphi) \mid (\text{F} \varphi) \mid (\text{G} \varphi) \mid (\varphi \text{U} \varphi)$$其中 $p$ 的范围为命题变量,$\varphi$ 的范围为LTL公式。
迁移系统
迁移系统定义为一个元组 $M = (S, \rightarrow, L)$,其中:
- $S$ 是一个非空集,由一组状态组成。
- $\rightarrow \subseteq S \times S$ 是一个转换关系。
- $L: S \rightarrow P$ 是一个赋值函数。
例如,在如下的弹簧系统中,有

- $S = \{s_1, s_2, s_3\}$
- $\rightarrow = \{(s_1, s_2), (s_2, s_1), (s_2, s_3), (s_3, s_3)\}$
- $L(s_1) = \oslash$,$L(s_2) = {\text{extended}}$,$L(s_3) = \{\text{extended}, \text{malfunction}\}$
路径
设 $M = (S, \rightarrow, L)$ 是一个迁移系统,则 $M$ 的一条路径是一个无限的序列 $\pi = (s_1, s_2, s_3, \cdots)$,其中
$$\forall i \geqslant 1, (s_i \in S \land s_i \rightarrow s_{i+1})$$在上述的弹簧示例中,有如下路径:
$$\pi_1 = \{s_1, s_2, s_3, s_3 ,s_3, \cdots\} \qquad \pi_2 = \{s_1, s_2, s_1, s_2, s_1, s_2, \cdots\}$$满足关系
设 $M = (S, \rightarrow, L)$ 是一个迁移系统,$M$ 的一条路径为 $\pi$,则如果 $\pi \vDash^i \varphi$,则称LTL公式 $\varphi$ 在第 $i$ 阶段由 $\pi$(在 $M$ 下)满足。
常见的满足关系如下:
- $\pi \vDash^i p$ 当且仅当 $p \in L(\pi[i])$
- $\pi \vDash^i \varphi \land \psi$ 当且仅当 $\pi \vDash^i \varphi \land \pi \vDash^i \psi$
- $\pi \vDash^i \varphi \lor \psi$ 当且仅当 $\pi \vDash^i \varphi \lor \pi \vDash^i \psi$
- $\pi \vDash^i \varphi \Rightarrow \psi$ 当且仅当 $\pi \vDash^i \varphi \Rightarrow \pi \vDash^i \psi$
- $\pi \vDash^i \lnot \varphi$ 当且仅当 $\pi \nvDash^i \varphi$
- $\pi \vDash^i \text{X} \varphi$ 当且仅当 $\pi \vDash^{i+1} \varphi$
- $\pi \vDash^i \text{F} \varphi$ 当且仅当 $\exist\ j \geqslant i$,使得 $\pi \vDash^j \varphi$
- $\pi \vDash^i \text{G} \varphi$ 当且仅当 $\forall\ j \geqslant i$,都有 $\pi \vDash^j \varphi$
- $\pi \vDash^i \varphi \text{U} \psi$ 当且仅当 $\exist\ j \geqslant i$,使得 $\pi \vDash^j \psi$ 并且 $\forall\ k \in \{i,i+1,\cdots,j-1\}$,都有 $\pi \vDash^k \varphi$
特别的,
- 如果 $\pi \vDash^1 \varphi$,则可记为 $\pi \vDash \varphi$。
- 设 $s \in S$,若 $M$ 的所有路径均满足 $\pi[1] = s$,则可记为 $M,s \vDash \varphi$
- 若 $M$ 的所有路径均满足 $\pi \vDash \varphi$,则可记为 $M \vDash \varphi$。此时称 $M$ 为 $\varphi$ 的一个模式。
对于两个LTL公式 $\varphi$ 和 $\psi$,若它们在同一个迁移系统 $M$ 下的所有路径 $\pi$ 的所有阶段 $i$ 均有
$$\pi \vDash^i \varphi \text{ iff } \pi \vDash^i \psi$$则可记作 $\varphi \equiv \psi$
对于上述的弹簧系统,则有:
- $\pi_1 \vDash^1 \text{X} \text{extended}$,即在路径1的条件下第1个迁移后的第2个状态 $s_2$ 为 $\text{extended}$
- $\pi_1 \vDash^1 \text{F} \text{malfunction}$,即在路径1的条件下第1个迁移后的未来某个时刻为 $\text{malfunction}$
- $\pi_2 \vDash^1 \lnot \text{F} \text{malfunction}$,即在路径2的条件下第1个迁移后未来的所有时刻都不会出现 $\text{malfunction}$,等价于 $\pi_2 \vDash^1 \text{G} \lnot \text{malfunction}$
