形式陈述
从全称规格到否定语言
设有限 Kripke 系统 K = ( S , I , R , A P , L ) 的转移关系是全的:每个状态至少有一个后继。其初始无限路径 s 0 s 1 ⋯ 满足 s 0 ∈ I 和 s i R s i + 1 ,观察词从初态标签开始,即 L ( s 0 ) L ( s 1 ) ⋯ 。默认对全部这类路径量化,不额外假设调度公平。
这里的模型检查问题 公理库 模型检查问题 Model checking problem · Model checking 给定系统模型与形式规格,判定所有指定初始行为是否满足公式,并交付证明结果或诊断见证。 采用全称路径语义:系统满足 LTL 规格 φ ,表示每条初始路径都满足它。因此
K ⊭ φ ⟺ L ( K ) ∩ L ω ( A ¬ φ ) ≠ ∅ . 这里 LTL 到 Büchi 转换 公理库 LTL 到 Büchi 自动机的转换 LTL to Büchi translation · LTL-to-automata translation 用闭包、局部一致状态、时序转移与逐个 Until 接受条件,把 LTL 的无限等待义务转换为 Büchi 自动机。 交付的自动机必须准确接受满足 ¬ φ 的词。否定规格把“全部路径都正确”转为“是否存在一条错误路径”;非确定自动机内部的选择同样是存在量词。找出一条拒绝运行不能说明该系统路径安全,因为同一个词可能还有另一条接受运行。
积状态已经消费当前标签
令普通Büchi 自动机 公理库 Büchi 自动机 Büchi automaton · Nondeterministic Büchi automaton · NBA 在无限字上运行,并以接受状态被无限多次访问作为接受条件的有限状态自动机。 A = ( Q , 2 A P , δ , Q 0 , F A ) 的标准运行为 q 0 q 1 ⋯ ,其中 q i + 1 ∈ δ ( q i , L ( s i ) ) 。本页的积顶点 ( s i , p i ) 使用 p i = q i + 1 :自动机已经读过当前系统状态的标签。于是初始积集合与积边必须一起定义为
I P = { ( s , p ) : s ∈ I , ∃ q ∈ Q 0 , p ∈ δ ( q , L ( s ) ) } , ( s , p ) → P ( t , p ′ ) ⟺ s R t ∧ p ′ ∈ δ ( p , L ( t ) ) , F P = S × F A . 初始积集合可能含多个顶点,即使系统和自动机各只有一个初态。另一种合法约定把 ( s i , q i ) 作为顶点,初态为 I × Q 0 ,并在出边上消费 L ( s i ) ;不能把这一初态定义与本页消费目标标签的边混用,否则初态标签永远没有被读取。转换页用源状态表达当前位置真值,输出的转移接口仍可按上述标准运行使用;积只是把运行下标整体向前移了一位。
为什么积图准确保留反例
从一条初始积路径 ( s 0 , p 0 ) ( s 1 , p 1 ) ⋯ 出发,初态定义给出某个 q 0 ∈ Q 0 ,令 q i + 1 = p i 。初始消费保证 q 1 ∈ δ ( q 0 , L ( s 0 ) ) ;每条积边保证 s i R s i + 1 和 q i + 2 ∈ δ ( q i + 1 , L ( s i + 1 ) ) 。所以投影得到合法系统路径及其观察词上的自动机运行。
反过来,给定合法系统路径及该词上的任意自动机运行,把第 i 个积状态取成 ( s i , q i + 1 ) ,就由同样两条定义得到初始积路径。积运行与标准运行只相差有限的初态 q 0 ,不会改变哪些自动机状态被无限次访问。因此积接受当且仅当对应运行接受;结合语言转换的正确性,积非空当且仅当系统违反原规格。
直觉
系统记位置,自动机记尚未兑现的义务
系统顶点告诉我们“程序现在在哪里”,自动机顶点告诉我们“为了证明违反性质,此前选中了什么义务”。同一个系统状态可以搭配不同自动机状态。只按系统状态去重,会把不同历史义务混成同一个搜索节点;正确的 visited key 必须包含两个分量。
产品后继可以按需生成:枚举系统后继,读取其标签,再枚举自动机后继。显式状态搜索 公理库 显式状态模型检查 Explicit-state model checking · Explicit model checking 逐个生成和存储可达状态,以图搜索检查安全性及接受环的模型检查路线。 因此不必先建立所有可能状态对,而只展开初始集合实际可达的部分。生成方式改变内存和发现反例的时机,却不改变每条边应满足的同步条件。
下面的共享算例把所有对象都列出来。积图的蓝色入箭头表示初态,双圈表示接受,虚线框表示强连通分量;红色 stem 与 loop 是完整反例证书。进入双圈一次还不够,必须有非空闭合路径能反复回来。积顶点名称的首字母表示系统状态,下标表示自动机状态,例如 R b = ( r , b ) 。
图片加载失败 请求系统的完整积图与接受 lasso
例子与边界
三状态请求系统与完整否定自动机
取 S = { r , w , g } 、I = { r } 、A P = { r e q u e s t , g r a n t } 。四条系统边及标签如下;w 可以继续等待,也可以得到授权。
系统状态
标签
全部后继
r
{ r e q u e s t }
w
w
∅
w , g
g
{ g r a n t }
r
规格为 φ = G ( r e q u e s t → F g r a n t ) ,否定为 ψ = F ( r e q u e s t ∧ G ¬ g r a n t ) 。F 包括当前位置:同一时刻 request 和 grant 同真时,这个请求已获响应。公式也没有要求请求与授权一一匹配。
构造 A ψ = ( { z , b } , 2 A P , δ , { z } , { b } ) 。状态 z 表示尚未选择一个永不获响应的请求,b 表示已选中并持续检查没有授权。下面列出字母表的全部四个字母;空集表示没有后继,自动机允许不完整。
当前字母 a
δ ( z , a )
δ ( b , a )
∅
{ z }
{ b }
{ r e q u e s t }
{ z , b }
{ b }
{ g r a n t }
{ z }
∅
{ r e q u e s t , g r a n t }
{ z }
∅
证明它恰好识别 ψ 。若运行接受,必须在某个位置第一次从 z 进入 b ;该字母含 request 且不含 grant。此后运行只能在 b 留下,而每次留下都要求当前字母没有 grant,所以选中的请求此后永无授权,ψ 成立。若词满足 ψ ,取其见证位置 i ,之前一直选择 z ,读第 i 个字母时选择 b ,以后一直留在 b ;这条运行无限访问接受态,故词被接受。
这个证明也解释了两种失败猜测:永远留在 z 不接受;过早进入 b 后遇到 grant,则该分支没有无限运行。非确定性允许放弃一次错误猜测,在另一个一直保持 z 的分支上选择后来的坏请求。
手算全部五点七边
读取初态 r 的标签后,z 可以转到 z 或 b ,故 I P = { ( r , z ) , ( r , b ) } 。简记 R z = ( r , z ) 、R b = ( r , b ) 、W z = ( w , z ) 、W b = ( w , b ) 、G z = ( g , z ) 。逐项应用积定义得到:
可达积顶点
全部积后继
初始?
接受?
R z
W z
是
否
R b
W b
是
是
W z
W z , G z
否
否
W b
W b
否
是
G z
R z , R b
否
否
这恰好是五点七边。没有 ( g , b ) ,因为读取 grant 时 b 没有后继;也没有 W z → W b ,因为 w 的空标签没有 request,不能在这里新选坏请求。相反,G z → R b 合法:下一状态 r 的 request 可以启动一次新的监控。
三个强连通分量 公理库 强连通分量算法 Strongly connected components algorithm 在线性时间内把有向图划分为互相可达的极大顶点集合。 是 C 0 = { R z , W z , G z } 、C 1 = { R b } 、C 2 = { W b } 。C 0 有循环但没有接受点;C 1 含接受点,却没有自环,不能无限停留;C 2 有接受自环 W b → W b 。因此积非空。SCC 不必没有出边:只要存在内部接受循环,就可始终选择内部边;这里检查的是存在一条执行。
打印反例并回到原规格
取 stem 为 R b → W b ,loop 为 W b → W b 。作为无限顶点序列,它是 R b ( W b ) ω ;投影得到 r w ω ,观察词为 { r e q u e s t } ∅ ω ,标准自动机运行为 z b b b ⋯ 。原规格在位置 0 失败,因为该处存在请求,而任意 j ≥ 0 都没有授权。
这里 request 只在 stem 出现,loop 内没有 request。义务已经由 b 记住,循环只需证明它永远不能兑现。反例与见证轨迹 公理库 反例与见证轨迹 Counterexample trace · Witness trace · Diagnostic trace 把模型检查结论具体化为安全坏前缀、活性 lasso 或存在性性质的行为见证。 给出这个证书的逐边核验,包含初始分支、标签同步、闭环边和接受条件。
已解迁移题:删除等待自环
只删系统边 w → w ,其余不变。系统仍然每个状态都有后继,唯一初始无限路径是 ( r w g ) ω ;每个请求都在两步后授权,因此无需公平假设,规格就成立。
重新计算积,可达顶点仍为上述五个,边却只剩 R z → W z 、R b → W b 、W z → G z 、G z → R z 、G z → R b ,共五条。C 0 的循环没有接受点,两个接受单点都没有自环;W b 甚至没有积后继。它代表“请求将永无授权”的一次有限猜测,下一步系统必到 g ,授权标签使猜测失败。
积图有死路完全合法。系统 total 不意味着不完整自动机与它的积也 total;给 W b 补自环会凭空制造无限接受运行,改变监控语言。这不是修复图结构,而是引入假反例。
推论与应用
一般接受环判据及证明
有限普通 Büchi 积非空,当且仅当有一个初始可达 SCC 同时包含接受点和正长度循环。必要性来自接受运行的无限访问:有限接受集中至少有一个顶点 f 出现无限次,取两次不同时间的出现,便得到从 f 返回 f 的非空路径,其顶点都在同一个可达 SCC 中。
充分性也要构造实际路径。设该 SCC 含接受点 f 。若分量只有 f ,所需循环就是它的自环;若有至少两个顶点,强连通性给出从 f 到另一个顶点再返回 f 的非空闭合游走。先沿有限初始路径到达 f ,然后无限重复这段游走,就得到接受运行。这同时证明有限 stem 加有限非空 loop 总能作为非空性的证书,但不意味着所有接受运行都最终周期。
对广义 Büchi 集合 F 1 , … , F m ,判据改成同一个可达循环 SCC 与每个 F j 相交。必要性可看运行无限访问的顶点集合:有限图中,所有只出现有限次的顶点最终消失;剩余顶点之间由运行的后缀相互连通,并包含每个接受集的一个代表。充分性则在 SCC 内依次连接各集合的代表,再回到起点,重复这个闭合游走。连接过程可能重复顶点,因此不要求一条简单环同时经过所有代表;不同 SCC 分别命中不同集合仍然不够。
若接受集合家族为空,接受义务真值为空合取,但无限运行仍需可达正长度循环。也可以先用计数器把广义条件退化为普通 Büchi;计数器须记录一整轮义务的完成,具体接口见转换页。
在共享例中加入公平条件
把 w → g 命名为动作 serve。它只在 w 使能。路径 r w ω 从位置 1 起持续使能 serve,却从未执行,因此违反 serve 的弱公平。系统无限路径或者最终永留 w ,或者无限次到达 g 并经 r 重返 w 。弱公平恰好排除前一类,所以在这个系统内,它等价于 justice 条件 G F g r a n t 。
公平反例必须同时违反规格并满足公平假设。给积添加 F J = { G z } ,同时保留原接受集 F A = { R b , W b } ;没有一个可达 SCC 同时命中两者,故公平反例语言为空。不能用 F J 替换 F A ,也不能取两者并集,因为那都会把两个必须共同满足的条件改掉。公平性约束 公理库 公平性约束 Fairness constraint · Weak fairness · Strong fairness 以弱公平、强公平等条件排除持续忽略可执行动作的不合理无限执行。 进一步解释为什么一般动作公平不能未经编码直接换成这个状态 justice 条件。
把线性成本的输入说清楚
设已经生成的可达积有 N 个顶点、E 条边。普通 Büchi 的 SCC 分解与接受标记检查使用 O ( N + E ) 时间;若邻接表已物化,图本身占 O ( N + E ) 空间,额外数组和搜索栈占 O ( N ) 。只按需生成后继时可以不保存全部边,但不能因此把物化图的总存储也写成 O ( N ) 。
若系统有 n 个状态、e 条边,自动机有 k 个状态,每次 δ ( q , a ) 最多返回 d 个后继,则 N ≤ n k 、E ≤ e k d 。这些计数默认标签测试和单个后继生成成本受控;复杂 guard 或大状态编码还应计入实际成本。通用 LTL 转换可产生 2 O ( | φ | ) 个状态,因此“对积线性”并非“对公式线性”。
广义接受条件还需要读入集合标记。若有 m 个接受集合,其顶点成员记录总数为 B ,直接在 SCC 中汇总的时间可写为 O ( N + E + m + B ) ;稠密记录时 B 可达 N m 。证书打印另计实际输出长度,串接多个接受代表得到的游走也不保证最短。按需搜索、SCC 搜索与普通 Büchi 的 nested DFS 都应保持各自不变量,不能把两个普通 DFS 随意嵌套。
自动机路线的结论仍然相对于输入模型。无限数据需要有限抽象时,积 lasso 可能需要进一步检查具体可行性;采用偏序约简时,也需证明保留所检查的时序性质与相关循环条件。这些步骤不改变本页最基本的检查链:语言正确、标签同步、循环闭合、接受义务满足。
参考资料
Moshe Y. Vardi, An Automata-Theoretic Approach to Linear Temporal Logic ,作者预印版 ,§2.4 Proposition 13(PDF 第 10 页)给出非空回返和线性非空性;§3 Corollary 23(PDF 第 18 页)给出指数规模自动机;§4.2 Theorem 25(PDF 第 21 页)讨论有限程序验证成本。这里的页码属于作者 PDF。
Rob Gerth, Doron Peled, Moshe Y. Vardi, Pierre Wolper, Simple On-the-fly Automatic Verification of Linear Temporal Logic ,作者版 ,§3、§3.3–3.4 给出广义接受、积与按需生成,§4 Lemmas 4.7–4.9 给出正确性。原文使用状态标记 LGBA,本文明确采用转移消费字母接口。
Moshe Y. Vardi and Pierre Wolper, “An Automata-Theoretic Approach to Automatic Program Verification,” LICS , 1986, pp. 332–344,历史出处;本页的精确位置引用使用上述可读作者版。
Costas Courcoubetis et al., “Memory-Efficient Algorithms for the Verification of Temporal Properties,” Formal Methods in System Design 1, 1992, pp. 275–288。
Christel Baier and Joost-Pieter Katoen, Principles of Model Checking , MIT Press, 2008, Chs. 4–5,延伸阅读。本页三状态系统与逐边计算为自建算例。