【发布时间】:2018-05-30 02:55:44
【问题描述】:
以下algorithm 是使用Computational Tree Logic (CTL) 进行模型检查的粗略草图:
据说:
CTL 的模型检查问题是验证给定过渡系统 TS 和 CTL 公式 Φ 是否 TS |= Φ... CTL 模型检查的基本过程相当简单:
- 满足 Φ 的所有状态的集合 Sat(Φ) 是递归计算的,并且
- TS |= Φ 当且仅当 I ⊆ Sat(Φ) 其中 I 是 TS 的初始状态集...
Sat(Φ) 的递归计算基本上归结为 CTL 状态公式 Φ 的解析树的自下而上遍历。
所以你本质上(根据我的理解),你为系统提供了一个 CTL 公式 Φ,它是一个解析树,然后它搜索状态,并通过 CTL 解析树,并检查是否有任何状态满足 Φ .
问题是:
在 Sat(Φ) 方法中,大致会发生什么(象征性的东西)。他们在下面说(2),其中 S 是状态,A 是原子命题。想知道他们是如何实际检查状态的,考虑到程序实际上并没有运行。这是(至少我认为)符号模型检查。想知道是否可以大致解释状态检查的工作原理。似乎某种input generation 必须发生,但同时我想也许它不应该发生。
对我来说很难理解的原因是这个。假设其中一个断言是针对一个函数addTricky(x, y),它的实现方式如下:
function addTricky(x, y) {
if (y >= 1) return 3
return x + y
}
然后我会有一个 布尔表达式 在某些逻辑中说“在 addTricky 之前:z = 0。在 z = addTricky(x, y) 之后:y >= 1 -> z = 3; y
基本上试图解决模式的问题。如果 Sat(Φ) 基本上在做我刚才在那个布尔表达式中所做的事情,我想知道它是否曾经调用/调用函数 addTricky,或者它是否可以以某种方式象征性地完成这一切。我还没有看到它是如何工作的,想知道是否可以解释一下符号执行的基本原理。对我来说,我一直在想象它进行某种单元测试,例如插入addTricky(1, 1),并检查所有可能性。也许那是“显式状态探索”与符号探索,不确定。
非常感谢您的帮助!
(1) 对于解析树的每个节点,即对于 Φ 的每个子公式 Ψ,计算满足 Ψ 的状态集 Sat(Ψ)。
(2) Sat(a) = {s ∈ S | a ∈ L(s)}, for any a ∈ A
【问题讨论】:
标签: algorithm logic formal-verification model-checking