首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUDD: BDDs的操作

CUDD: BDDs的操作
EN

Stack Overflow用户
提问于 2019-03-19 17:13:54
回答 2查看 962关注 0票数 2

我正在使用CUDD C++接口(https://github.com/ivmai/cudd),但是几乎没有关于这个库的任何信息。我想知道如何根据一个变量的值删除它。

例如,我现在将下一个表存储在一个bdd

代码语言:javascript
复制
|-----|-----|-----|
|  x1 |  x2 |  y  |
|-----|-----|-----|
|  0  |  0  |  1  |
|-----|-----|-----|
|  0  |  1  |  1  |
|-----|-----|-----|
|  1  |  0  |  1  |
|-----|-----|-----|
|  1  |  1  |  0  |
|-----|-----|-----|

我希望根据bdd的值将上一个表拆分成两个单独的x2,然后删除该节点:

如果是x2 = 0

代码语言:javascript
复制
|-----|-----|
|  x1 |  y  |
|-----|-----|
|  0  |  1  |
|-----|-----|
|  1  |  1  |
|-----|-----|

如果是x2 = 1

代码语言:javascript
复制
|-----|-----|
|  x1 |  y  |
|-----|-----|
|  0  |  1  |
|-----|-----|
|  1  |  0  |
|-----|-----|

有可能吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-20 12:22:27

CUDD库的C++接口上几乎没有文档,原因是它只是C函数的包装器,其中有大量的文档。

C++包装器主要用于消除所有Cudd_Ref(.)和Cudd_RecursiveDeref(.)调用使用C接口的代码将需要这样做。请注意,如果需要的话,也可以使用C++代码中的C接口。

要完成您想要做的事情,您必须将CUDD提供的布尔运算符组合起来,从而获得一个新的布尔函数和所需的属性。

第一步是将s限制为x=0和x=1情况:

代码语言:javascript
复制
BDD s0 = s & !x;
BDD s1 = s & x;

正如您注意到的,新的BDDs (尚未)忽略了x变量的值。您希望它们是“不关心”w.r.t对x的值。由于您已经知道x仅限于s0和s1中的一个特定值,所以可以使用存在抽象运算符:

代码语言:javascript
复制
s0 = s0.ExistAbstract(x);
s1 = s1.ExistAbstract(x);

请注意,x在这里用作一个所谓的多维数据集(见下文)。

这些都是你想要的BDD。

立方体解释:--如果您同时从多个变量中抽象,那么您应该先从要抽象的所有变量中计算出这样一个多维数据集。多维数据集主要用于表示一组变量。从数学逻辑来看,如果你存在或普遍地抽象出多个变量,那么抽象化这些变量的顺序就无关紧要了。由于CUDD中的递归BDD操作是在BDDs的对(或三重)上实现的,所以CUDD内部也将一组变量表示为一个多维数据集,这样存在抽象操作就可以只在(1)执行存在抽象的BDD上工作,(2) BDD表示要从其中抽象的变量集。多维数据集作为BDD的内部表示不应该与开发人员仅使用CUDD (而不是扩展CUDD)相关,只是表示变量的BDDD也可以用作多维数据集。

票数 5
EN

Stack Overflow用户

发布于 2020-02-23 14:36:53

使用Cython绑定到package dd的CUDD的一种方法如下所示,它使用常量值替换变量x2

代码语言:javascript
复制
import dd.cudd as _bdd

bdd = _bdd.BDD()
bdd.declare('x1', 'x2')
# negated conjunction of the variables x1 and x2
u = bdd.add_expr(r'~ (x1 /\ x2)')

let = dict(x2=False)
v = bdd.let(let, u)
assert v == bdd.true, v

let = dict(x2=True)
w = bdd.let(let, u)
w_ = bdd.add_expr('~ x1')
assert w == w_, (w, w_)

通过将import语句更改为import dd.autoref as _bdd,相同的代码在纯Python中运行。纯Python版本的dd可以与pip install dd一起安装。dddd.cudd模块的安装描述为这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55246590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档