Specifying Systems 第十四章笔记
14.1 介绍 TLC TLC 是检查 TLA+ 错误的程序,它能够处理 Spec == Init /\ [][Next]_<<vars>> /\ Temporal 形式的大部分规范,这通过在配置文件中使用关键字 SPECIFICATION Spec 指定。如果规范不包含时序逻辑,也可以使用 INIT Init 和 NEXT Next 指定。TLC 中要检查的规范叫做模型。 TLC 不能处理 \EE 运算符,用户应当单独检查 \EE 涉及的子规范。这可以通过 5.8 节介绍的,为要使用 \EE 隐藏的变量在实例化时显式指定映射来绕过。 TLC 可以检查如下种类的情况: 无意义的表达式(6.2 节) 死锁,即 Next 步的前提不能被满足。但有的系统允许死锁表示系统按预期终止 使用 PROPERTY 关键字检查某公式是否为真。TLC 实际上并不是检查 Spec => Prop ,而是对于 SPECIFICATION 和 PROPERTY 分拆安全性和活跃性部分,分别检查 SPECIFICATION 的安全性蕴含 PROPERTY 安全性 SPECIFICATION 蕴含 PROPERTY 的活跃性 由于 PROPERTY 的安全性和活跃性分别检查,因此 TLC 不能处理两者相互影响的情况,也即不能处理非状态机闭包 如果想要表达公式一直为真,可以使用 [] 或者 INVARIANT 关键字描述。如果使用 INVARIANT 关键字,要检查的必须是一个单状态公式 TLC 在开始检查前需要指定规范中常数参数的取值。 TLC 有两种工作模式,检查 所有 可到达的状态,即模型检查模式;或者随机生成状态作为系统行为,即模拟模式。本节我们先讨论前者。 对于状态过多、或者无穷状态的规范,我们可以指定约束限制一些不必要状态,这可以使用 CONSTRAINT 关键字指定约束公式。 TLC 对于不同类型公式的检查速度不同,建议按照类型不变量、检查安全性、检查活跃性的顺序进行检查。完成检查后,我们还可以编写一个“事后规范”,检查规范是否能蕴含这个“事后规范”。 14.2 TLC 能处理什么 TLA+ 的描述性太强,不存在能检查 TLA+ 所有规范的工具。TLC 能处理 ...