如何计算二进制决策图的可达到的符号状态空间

时间:2018-05-29 15:34:17

标签: algorithm data-structures logic model-checking binary-decision-diagram

这个问题是关于如何为符号模型检查器生成符号状态空间。首先,我进入一些背景,这使我想要为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。

我认为这个图像是状态空间生成的算法,但我一直难以理解它的细节。具体来说,涉及的数据结构,以及"状态"是来自,即如果这些是来自其他模型的布尔谓词或什么。

enter image description here

This one似乎也很接近:

enter image description here

以下是同一篇论文的更多内容:

enter image description here

  

(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)。算法Bfs正好实现了这个定点计算,其中   使用L级和2L级MDD分别存储集合和关系,即,   节点p对具有满足

的特征函数v_p的集合X_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.

1 个答案:

答案 0 :(得分:0)

简而言之,以DD形式编码任意转换关系并不是简单的事情。正如您在Petri网中注意到的那样,这很容易,一般情况是其他事情(赋值,任意表达式,使用索引)+由于程序通常需要可变长度状态+递归/堆栈状态建模而引起的问题。

所有原始命题都涉及将过渡关系R编码为SxS的子集,因此,如果对(s,s')位于R中,则从s-> s'的过渡t是可能的。执行DD和一组状态的DD,一步完成后继。但是Ciardo等人的论文。您正在阅读的内容更高级,通常使用MxD /身份减少形式,因此不受过渡影响(无关紧要)的变量可以在编码中跳过。尽管如此,它们最终还是以DD为单位,每个状态变量都有两个变量(之前和之后),因此SxS的子集仍然如此。

因此,从程序开始,通常需要摆脱递归/堆栈,限制变量的数量(因此,对于大多数状态,您可以使用有点太大的数组),使所有变量离散(例如整数)。

如果您可以以这种形式获得模型,但仍具有诸如算术和赋值之类的复杂操作(即您不能将问题写为Petri网),则最高级的软件包可能是

  • LTSMin(请参见此CAV'10论文,或者更扩展为TR form)。他们将N个变量的不透明函数欺骗性地拟合为带有“ PINS”的符号设置。)
  • 与MDD进行一般过渡关系的另一项工作是ITS-tools,它是GAL形式主义(请参阅tacas'15论文),或者是CAV'13,详细了解如何将算术编码为DD 。