这个问题是关于如何为符号模型检查器生成符号状态空间。首先,我进入一些背景,这使我想要为MDD做这个,然后我更详细地解释这个问题。
Edmund M. Clarke(模型检查的创始人之一)的This lecture介绍了符号模型检查。它说"工业实力"模型检查器使用布尔编码(Binary Decision Diagrams,或BDD)来处理状态爆炸问题。但是,它只允许比常规模型检查多出几个数量级的状态。我跳过了常规模型检查,它直接构建了程序的状态转换图表b / c我可以想象立即不切实际。
我看过一些论文描述了比BDD更好的质量,例如处理更多状态1(避免?!状态空间爆炸问题),一般加速2(有界模型检查) ,使用状态匹配技术来限制状态空间搜索(超出有界模型检查)3,并使用比现有BDD快几个数量级的MDD [4] [5]。
BDD' raised平均支持的州数量从大约10 ^ 6到10 ^ 20。那篇论文还说:
不幸的是,符号技术 众所周知,异步系统不能很好地工作,例如通信 协议,尤其受到国家空间爆炸的影响。
因此,似乎MDD甚至EDD是模型检查的更好选择。还有边值BDD (EVBDDs)。但我的问题是,如何为~MDD构建符号状态空间(或者哪个最好)。 This document介绍了它,但似乎并没有解释如何实际生成它。他们说:
我们使用准简化,有序,非负边值,多值决策图。
想知道是否可以在高级别解释MDD的状态空间生成算法,以及系统中涉及的数据结构,例如node
对象的属性(如C结构)。我想我是否可以看到数据结构的整体情况以及算法的工作原理,这足以实现。
另外,我不确定初始程序和规范需要做什么。因此,如果解释可以快速描述/介绍如何生成任何中间对象,那将是有帮助的。添加这个因为我在一个paper中看到他们有Petri网形式的程序,然后他们转换为MDD,我不知道如何将程序转换为Petri网,或者如果这甚至是必要的。基本上,如何从源代码到高级别的MDD。
我认为这个图像是状态空间生成的算法,但我一直难以理解它的细节。具体来说,涉及的数据结构,以及"状态"是来自,即如果这些是来自其他模型的布尔谓词或什么。
This one似乎也很接近:
以下是同一篇论文的更多内容:
(1)在本文中,我们将展示如何 布尔决策程序,如Stalmarck的Method [16]或Davis&普特南 程序[7],可以取代BDD。这项新技术避免了太空打击 BDD的产生,反应更快,有时加速 验证。
(2)论文的主要结果是: 在检验时间限制的时间复杂度中O(N)的改进 直到公式,其中N是正在考虑的CTMC中的状态数。
(3)我们在之前的工作基础上提出了象征性的组合 执行和模型检查,用于分析具有复杂输入的程序 [14,19]。在那项工作中,我们对输入大小和(或)搜索进行了限制 模型检查器的深度。在这里,我们看看有界模型检查和 我们研究状态匹配技术来限制状态空间搜索。我们建议 用于检查符号状态何时被另一个符号所包含的技术 状态。
(4)我们提出了一种新的算法来生成状态空间 使用多值决策图的异步系统。相反 对于相关的工作,我们编码下一个{系统的状态函数而不是一个 单个布尔函数,但作为整数函数的交叉{乘积。这个 允许应用各种迭代策略来构建系统 国家空间。特别是,我们引入了一种新的优雅策略,称为 饱和度,并在SMART工具中实现。通常在顶部 比现有的基于BDD的速度快几个数量级 状态空间生成器,我们的算法通常需要峰值内存 接近存储整个状态空间所需的最终内存。
(5)基于二元决策图(BDD)的符号技术被广泛用于推理 关于硬件电路和同步控制器的时间属性。但是,他们往往表现不佳 当处理基于交织语义的系统的巨大状态空间时,例如通信 协议和分布式软件,由独立作用的子系统组成 通过共享事件...本文表明,使用决策图的状态空间探索技术的效率可以大大提高 通过利用许多基于事件和基于组件的系统的交错语义来改进 楷模。提出了一种用于符号生成状态空间的新算法,其(i)对模型的状态进行编码 具有多值决策图(MDD)的向量,而不是将它们展平为BDD。
更接近this:
可达状态空间X_reach可以表征为固定点方程的最小解 X⊆X_init∪T(X)。算法
的特征函数v_p的集合X_p进行编码Bfs
正好实现了这个定点计算,其中 使用L级和2L级MDD分别存储集合和关系,即, 节点p对具有满足v_p(i_L,...,i_1)=1⇔(i_L,...,i_1)∈X_p。
集合的联合只需通过将Or运算符应用于其特征函数,并计算可达的状态来实现 通过使用函数RelProd实现一步(当然, 如果使用MDD,则必须使用这些函数的MDD版本 BDDs)。由于它执行广度优先的符号搜索,因此算法Bfs停止 在与任何可达状态的最大距离完全相同的迭代次数中 从最初的状态。
mdd Bfs(mdd Xinit) is
local mdd p;
p ← Xinit;
repeat
p ← Or(p, RelProd(p, T ));
until p does not change;
return p;
bdd Or(bdd a, bdd b) is
local bdd r, r0, r1;
local level k;
if a = 0 or b = 1 then return b;
if b = 0 or a = 1 then return a;
if a = b then return a;
if Cache contains entry hORcode, {a, b} : ri then return r;
if a.lvl < b.lvl then
k ← b.lvl;
r0 ← Or(a, b[0]);
r1 ← Or(a, b[1]);
else if a.lvl > b.lvl then
k ← a.lvl;
r0 ← Or(a[0], b);
r1 ← Or(a[1], b);
else • a.lvl = b.lvl
k ← a.lvl;
r0 ← Or(a[0], b[0]);
r1 ← Or(a[1], b[1]);
r ← UniqueTableInsert(k, r0, r1);
enter hORcode, {a, b} : ri in Cache;
return r;
bdd RelProd(bdd x, bdd2 t) is • quasi-reduced version
local bdd r, r0, r1;
if x = 0 or t = 0 then return 0;
if x = 1 and t = 1 then return 1;
if Cache contains entry hRELPRODcode, x, t : ri then return r;
r0 ← Or(RelProd(x[0], t[0][0]), RelProd(x[1], t[1][0]));
r1 ← Or(RelProd(x[0], t[0][1]), RelProd(x[1], t[1][1]));
r ← UniqueTableInsert(x.lvl, r0, r1);
enter hRELPRODcode, x, t : ri in Cache;
mdd Saturation(mdd Xinit) is
return Saturate(L, Xinit);
mdd Saturate(level k, mdd p) is
local mdd r, r0, ..., rnk−1;
if p = 0 then return 0;
if p = 1 then return 1;
if Cache contains entry hSATcode, p : ri then return r;
for i = to nk − 1 do
ri ← Saturate(k − 1, p[i]);
repeat
choose e ∈ Ek, i, j ∈ Xk, such that ri 6= 0 and Te[i][j] 6= 0;
rj ← Or(rj , RelProdSat(k − 1, ri, Te[i][j]));
until r0, ..., rnk−1 do not change;
r ← UniqueTableInsert(k, r0, ..., rnk−1);
enter hSATcode, p : ri in Cache;
return r;
mdd RelProdSat(level k, mdd q, mdd2 f) is
local mdd r, r0, ..., rnk−1;
if q = 0 or f = 0 then return 0;
if Cache contains entry hRELPRODSATcode, q, f : ri then return r;
for each i, j ∈ Xk such that q[i] 6= 0 and f[i][j] 6= 0 do
rj ← Or(rj , RelProdSat(k − 1, q[i], f[i][j]));
r ← Saturate(k, UniqueTableInsert(k, r0, ..., rnk−1));
enter hRELPRODSATcode, q, f : ri in Cache;
return r.
答案 0 :(得分:0)
简而言之,以DD形式编码任意转换关系并不是简单的事情。正如您在Petri网中注意到的那样,这很容易,一般情况是其他事情(赋值,任意表达式,使用索引)+由于程序通常需要可变长度状态+递归/堆栈状态建模而引起的问题。
所有原始命题都涉及将过渡关系R编码为SxS的子集,因此,如果对(s,s')位于R中,则从s-> s'的过渡t是可能的。执行DD和一组状态的DD,一步完成后继。但是Ciardo等人的论文。您正在阅读的内容更高级,通常使用MxD /身份减少形式,因此不受过渡影响(无关紧要)的变量可以在编码中跳过。尽管如此,它们最终还是以DD为单位,每个状态变量都有两个变量(之前和之后),因此SxS的子集仍然如此。
因此,从程序开始,通常需要摆脱递归/堆栈,限制变量的数量(因此,对于大多数状态,您可以使用有点太大的数组),使所有变量离散(例如整数)。
如果您可以以这种形式获得模型,但仍具有诸如算术和赋值之类的复杂操作(即您不能将问题写为Petri网),则最高级的软件包可能是