TLA+能做什么,又做不了什么
What TLA+ can and can't check
最近Boris Cherny提到Claude Code能用TLA+发现竞态条件,这让形式化验证再次成为热点。作为TLA+的长期布道者,我既兴奋又担忧。兴奋的是大家开始关注复杂并发系统的设计,担忧的是有人误以为形式化方法能一劳永逸地解决Agent软件开发的所有问题。TLA+在验证不变量(invariants)和活性(liveness)属性方面非常强大,能确保“坏事不发生”和“好事终会发生”。但它的局限同样明显:无法表达需要跨多个步骤验证的属性,无法处理浮点数或物理时间,更无法直接验证涉及多个行为对比的超属性(hyperproperties),比如安全性中的非干涉性或统计属性。虽然可以通过辅助变量或自组合等技巧来“模拟”这些检查,但这些方法往往让模型变得复杂且难以维护。TLA+擅长摘取低垂的果实,但并非万能钥匙。
要验证一个属性,我们首先得有一个能验证的属性!
HN 评论区
27- sourdecor
我是通过 HN 上的这条评论 [1] 发现了 Quint[0]。Quint 是“一种可执行的规范语言(基于 JavaScript),拥有基于动作时态逻辑(TLA)的出色工具链”。我觉得它非常棒,任何对 TLA+ 感兴趣的人都应该去试试。
- singron
太棒了。如果你正准备用 TLA+ 做点什么,这篇文章非常值得一读。
换个角度说,TLA+ 不太擅长的另一件事是建模原子操作,尤其是弱内存语义或任何非顺序一致性的场景。如果你把算法翻译成 pcal,它运行起来就像是在顺序一致性模型下一样。如果你需要建模非顺序一致性,那就必须在 TLA+ 中用显式的逻辑将其定义清楚,但这手动做起来可能太复杂且容易出错。C/C++/Rust 的内存模型允许很多怪异的行径。我猜想你需要为每个变量添加读缓存和写回缓冲区,并在适当的位置插入缓存刷新指令,不过也许有更优雅的做法。
如果你用 Rust,miri 和 loom 都有分析器可以检查某些非顺序一致性的行为(而且 loom 实际上根本就没实现顺序一致性)。
- metabagel
太爱这些行内脚注了!