在模型检测工具NuSMV中,时序逻辑是用来描述系统性质(或形式规约)的形式化语言,包括两类,一类是 线性时序逻辑(Linear-time Temporal Logic, LTL),另一类是分支时序逻辑(也称计算树逻辑,Computing Tree Logic,CTL),二者主要的区别在于采取不同的方式对 Kripke结构 所对应的计算树分支进行展开。
学习模型验证,有一本文献综述Handbook of Model Checking 2018,都是英文的,会看的很慢。里面有数学推导过程,其中有一些缩写做好笔记,比如
i.e.表示“也就是说”such that表示“使什么成立”denote byKripke Structure 是一种思想,和不同系统结合就会生成对应系统的结果,这也正式 Kripke Structure 的优秀之处。
先在CSDN中搜索大佬写的博客。
博客真的少的可怜。从大佬哪里复制一些主要的,整理一下。
Kripke 结构 即过渡(迁移)系统的变化,在模型检查中用来表示系统的行为,也可以用来描述上述的反应系统。
Kripke 结构 由状态集合(S)、过渡集合(R)以及标记函数(L)组成。该标记函数标记各状态下使得该状态为true的变量集合。
Kripke 结构是一个状态过渡图,路径可以建模反应系统的计算。基于此,使用一阶逻辑公式形式化并发系统。 定义 AP 为一组原子命题,则 Kripke结构
M
M
M 为在原子命题上的一个四元组
M
=
(
S
,
S
0
,
R
,
L
)
M = (S,S_0,R,L)
M=(S,S0,R,L)。其中
时态运算符限定于描述从一个给定状态开始的某条路径上的事件。

□ \square □(G, always)

⋄ \diamond ⋄(F, eventually)

∘ \circ ∘(X, next)

∪ \cup ∪(strong unit)
以红绿灯为例。
性质1:信号灯按照“红、黄、绿、红、黄、绿…”的顺序变化
性质2:信号灯不能在同一时间出现两种以上的颜色
线性时序逻辑(Linear Temporal Logic,LTL)被广泛地用来描述基于状态的性质需求。在基于事件的模型中,状态是由已经发生的事件或者行为来刻画的,而不是像传统的基于状态的模型中通过状态变量来描述。因此我们将用 Fluent Linear Temporal Logic(FLTL) 来刻画 LTS 的性质,即在基于事件的模型中规约基于状态的时许性质,即再基于事件的模型中规约基于状态的时序性质。
FLTL 其实就是把 fluent 作为原子命题的 LTL。
一个 fluent 是一个三元组,记作
F
l
=
⟨
I
F
l
,
T
F
l
,
I
n
i
t
F
l
⟩
Fl=\left \langle I_{Fl},T_{Fl},Init_{Fl} \right \rangle
Fl=⟨IFl,TFl,InitFl⟩ ,其中
I
F
l
,
T
F
l
∈
A
c
t
I_{Fl},T_{Fl} \in Act
IFl,TFl∈Act 分别表示它的发起动作集合和终止动作集合,
I
n
i
t
F
l
Init_{Fl}
InitFl 代表
F
l
F_l
Fl 的初始真值。
对于一个
f
l
u
e
n
t
F
l
=
⟨
I
F
l
,
T
F
l
,
I
n
i
t
F
l
⟩
fluent F_l=\left \langle I_{Fl},T_{Fl},Init_{Fl} \right \rangle
fluentFl=⟨IFl,TFl,InitFl⟩ 来说,显然有
I
F
l
∩
T
F
l
=
∅
I_{Fl} \cap T_{Fl} = \empty
IFl∩TFl=∅。例如,每一个动作
l
∈
A
c
t
l \in Act
l∈Act 可以导出一个对应的 fluent 记为
l
˙
=
⟨
l
,
A
c
t
\
{
l
}
,
f
a
l
s
e
⟩
\dot l = \left \langle l,Act \verb|\| \{l\},false \right \rangle
l˙=⟨l,Act\{l},false⟩。这个表示说,当动作
l
l
l 发生的时候,
l
˙
\dot l
l˙ 为真,发生任何其他动作的时候,这个 fluent 为假。
对于动作的时长,fluent 认为是瞬时的,也就是说当动作发生的时候,fluent 认为这个动作已经完成。这个主要体现在当一个动作一旦发生,就立即对 fluent 的真值产生影响。在下面对于 trace 的位置 i 来说,对 fluent 真值的影响回考虑到 i 位置。
一个 t r a c e π = l 0 , l 1 , . . . trace \pi = l_0,l_1,... traceπ=l0,l1,... 在位置 i i i 处满足一个 f l u e n t F l fluent \thinspace Fl fluentFl ,记作 π , i ⊨ F l \pi,i \vDash Fl π,i⊨Fl,当且仅当以下的条件至少有一个成立:
fluent 初始值为真,并且这个 trace 到位置
i
i
i (包括
i
i
i ) 为止,还没有遇到这个 fluent 终止动作集合中的动作,即还没有能够让这个 fluent 为假。trace 的位置 i 之前(包括 i),已经在某个
j
≤
i
j\leq i
j≤i 位置遇到了 fluent 的发起动作集合中的动作,但是在位置 j 到 i 之间(包括 i)没有遇到过任何该 fluent 的终止动作集合中的动作。显然满足这两个条件中任意一个都意味着有 π , i ⊨ F l \pi,i \vDash Fl π,i⊨Fl。

在 图2-1 中的客户端 LTS Cli 中,我们可以定义
f
l
u
e
n
t
C
A
L
L
I
N
G
=
⟨
{
c
a
l
l
}
,
{
d
i
s
p
l
a
y
}
,
f
l
a
s
e
⟩
fluent \thinspace CALLING=\left \langle \{call\},\{display\},flase \right \rangle
fluentCALLING=⟨{call},{display},flase⟩ 来表示客户端是否请求服务。对于一个
t
r
a
c
e
π
0
=
g
e
t
T
o
k
e
n
,
c
a
l
l
,
r
e
p
l
y
,
d
i
s
p
l
a
y
,
.
.
.
trace \thinspace \pi_{0}=getToken,call,reply,display,...
traceπ0=getToken,call,reply,display,... ,我们可以看到有
π
0
,
1
⊨
C
A
L
L
I
N
G
\pi_0,1 \vDash CALLING
π0,1⊨CALLING ,因为这是遇到了 call 动作,但是还没有遇到 display 动作。
类似地,我们还可以得到 π 0 , 3 ⊭ C A L L I N G \pi_0,3 \nvDash CALLING π0,3⊭CALLING。
当给定了在 Act 上的所有 fluent 的集合 ϝ \digamma ϝ ,一个 FLTL 公式可以通过标准的布尔操作符,时序操作符 X X X (next)和 U U U 进行如下的归纳定义:
惯用的布尔操作符还包括:逻辑蕴含 → \rightarrow → ,逻辑与 ∧ \wedge ∧ 。其中 → \rightarrow → 可以如此定义 ϕ → ψ ≡ ¬ ϕ ∨ ψ \phi \rightarrow \psi \equiv \neg \phi \vee \psi ϕ→ψ≡¬ϕ∨ψ ,而 ∧ \wedge ∧ 可以如此定义 ϕ ∧ ψ ≡ ¬ ( ¬ ϕ ∨ ¬ ψ ) \phi \wedge \psi \equiv \neg(\neg \phi \vee \neg \psi) ϕ∧ψ≡¬(¬ϕ∨¬ψ) 。
Giannakopoulou D, Magee J. Fluent model checking for event-based systems[C]//Proceedings of the 9th European software engineering conference held jointly with 11th ACM SIGSOFT international symposium on Foundations of software engineering. 2003: 257-266.
给定一个无穷 t r a c e π trace \thinspace \pi traceπ,其是否在位置 i i i 满足公式 ϕ \phi ϕ ,记为 π , i ⊨ ϕ \pi,i \vDash \phi π,i⊨ϕ 。
由于 FLTL 是 LTL 的一个特例,所以我们同样有 LTL 中其他的时序操作符,包括 □ \square □(always), ⋄ \diamond ⋄(eventually), W W W(weak until)
一个 t r a c e π trace \thinspace \pi traceπ 满足公式 ϕ \phi ϕ 记为 π ⊨ ϕ \pi \vDash \phi π⊨ϕ,如果有 π , 0 ⊨ ∅ \pi,0 \vDash \empty π,0⊨∅。
一个 LTS E E E 满足公式 ϕ \phi ϕ 记为 E ⊨ ϕ E \vDash \phi E⊨ϕ ,如果 E E E 产生的每一条无穷序列都满足 ϕ \phi ϕ。

总是在请求服务(call 动作)之后,能够把结果展示出来(display动作)。那么这样的一个性质可以用 FLTL 公式表示成:
D
I
S
P
L
A
Y
_
A
F
T
E
R
_
C
A
L
L
=
□
(
c
a
l
l
→
⋄
d
i
s
p
l
a
y
)
DISPLAY\_AFTER\_CALL=\square (call\rightarrow \diamond display)
DISPLAY_AFTER_CALL=□(call→⋄display)。显然,我们可以看出来有
π
0
⊨
D
I
S
P
L
A
Y
_
A
F
T
E
R
_
C
A
L
L
\pi_0 \vDash DISPLAY\_AFTER\_CALL
π0⊨DISPLAY_AFTER_CALL 以及
C
l
i
⊨
D
I
S
P
L
A
Y
_
A
F
T
E
R
_
C
A
L
L
Cli \vDash DISPLAY\_AFTER\_CALL
Cli⊨DISPLAY_AFTER_CALL。
时态运算符限定于从一个给定的状态开始的所有可能路径上。

CTL由路径量词和时态算子构成。
路径量词:
时态算子:
常见表达:
∀ X p \forall X p ∀Xp:在所有未来路径上,公式在下一个状态为真
∀ F p \forall F p ∀Fp:在所有未来路径上,公式在某个状态必然为真

∀ G p \forall G p ∀Gp:在所有未来路径上,公式都永远为真

∀ ( p U q ) \forall (p U q) ∀(pUq):在所有未来路径都存在:公式 p p p 一直为真,直到公式 q q q 为真
∃ X p \exists X p ∃Xp:存在一条未来路径,下一状态公式为真
∃ F p \exists F p ∃Fp:存在一条未来路径,公式在某个状态一定为真

∃ G p \exists G p ∃Gp:存在一条未来路径,公式永为真

E ( p U q ) E (p U q) E(pUq):存在一条未来路径,公式 p p p 一直为真,直到公式 q q q 为真
以进程访问共享数据为例,假设有两个进程 proc1 和 proc2,当进入“critical”状态表示正在访问共享数据,“entering”状态表示进程请求访问共享数据,当任务调度允许访问后进入“critical”状态访问共享数据。
性质1:不存在 进程1 和 进程2 同时进入“critical”状态
性质2:如果进程1处于“entering”状态(即请求进入“critical”状态),那么最终进程1都会进入“critical”状态
| 描述 | 公式 |
|---|---|
| deMargan律 | ¬ ( ϕ ∧ ψ ) ≡ ¬ ϕ ∨ ¬ ψ \neg (\phi \wedge \psi)\equiv \neg \phi \vee \neg \psi ¬(ϕ∧ψ)≡¬ϕ∨¬ψ |
| ¬ ( ϕ ∨ ψ ) ≡ ¬ ϕ ∧ ¬ ψ \neg (\phi \vee \psi)\equiv \neg \phi \wedge \neg \psi ¬(ϕ∨ψ)≡¬ϕ∧¬ψ | |
| 幂等律 | ¬ ¬ ϕ ≡ ϕ \neg \neg \phi \equiv \phi ¬¬ϕ≡ϕ |
| 对偶率 | ¬ G ϕ ≡ F ¬ ϕ \neg G \phi \equiv F \neg \phi ¬Gϕ≡F¬ϕ |
| ¬ F ϕ ≡ G ¬ ϕ \neg F \phi \equiv G \neg \phi ¬Fϕ≡G¬ϕ | |
| ¬ F ( ϕ U ψ ) ≡ ¬ ϕ R ¬ ψ \neg F (\phi U \psi) \equiv \neg \phi R \neg \psi ¬F(ϕUψ)≡¬ϕR¬ψ | |
| ¬ ( ϕ R ψ ) ≡ ¬ ϕ U ¬ ψ \neg (\phi R \psi)\equiv \neg \phi U \neg \psi ¬(ϕRψ)≡¬ϕU¬ψ | |
| 自对偶率 | ¬ X ϕ ≡ X ¬ ϕ \neg X \phi \equiv X \neg \phi ¬Xϕ≡X¬ϕ |
| 分配率 | F ( ϕ ∨ ψ ) ≡ F ϕ ∨ F ψ F(\phi \vee \psi) \equiv F \phi \vee F \psi F(ϕ∨ψ)≡Fϕ∨Fψ |
| G ( ϕ ∨ ψ ) ≡ G ϕ ∨ G ψ G(\phi \vee \psi) \equiv G \phi \vee G \psi G(ϕ∨ψ)≡Gϕ∨Gψ | |
| 连接词相互定义 | F ϕ ≡ ⊤ U ϕ F \phi \equiv \top U \phi Fϕ≡⊤Uϕ |
| G ϕ ≡ ⊥ R ϕ G \phi \equiv \bot R \phi Gϕ≡⊥Rϕ | |
| ϕ W ψ ≡ ϕ U ψ ∨ G ϕ \phi W \psi \equiv \phi U \psi \vee G \phi ϕWψ≡ϕUψ∨Gϕ | |
| ϕ W ψ ≡ R ( ϕ ∨ ψ ) \phi W \psi \equiv R(\phi \vee \psi) ϕWψ≡R(ϕ∨ψ) | |
| ϕ R ψ ≡ ψ W ( ϕ ∧ ψ ) \phi R \psi \equiv \psi W(\phi \wedge \psi) ϕRψ≡ψW(ϕ∧ψ) | |
| ϕ U ψ ≡ ϕ W ψ ∧ F ψ \phi U \psi \equiv \phi W \psi \wedge F \psi ϕUψ≡ϕWψ∧Fψ |