Binary CUDD:BDD的操作 我正在使用CUDC++接口(),但是几乎没有关于这个库的信息。我想知道如何根据一个变量的值删除它

Binary CUDD:BDD的操作 我正在使用CUDC++接口(),但是几乎没有关于这个库的信息。我想知道如何根据一个变量的值删除它,binary,binary-decision-diagram,cudd,Binary,Binary Decision Diagram,Cudd,例如,我现在将下一个表存储在bdd中: |-----|-----|-----| | x1 | x2 | y | |-----|-----|-----| | 0 | 0 | 1 | |-----|-----|-----| | 0 | 1 | 1 | |-----|-----|-----| | 1 | 0 | 1 | |-----|-----|-----| | 1 | 1 | 0 | |-----|-----|-----| 我想根据x2的值将

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

|-----|-----|-----|
|  x1 |  x2 |  y  |
|-----|-----|-----|
|  0  |  0  |  1  |
|-----|-----|-----|
|  0  |  1  |  1  |
|-----|-----|-----|
|  1  |  0  |  1  |
|-----|-----|-----|
|  1  |  1  |  0  |
|-----|-----|-----|
我想根据x2的值将上一个表拆分为两个独立的
bdd
s,然后删除该节点:

如果
x2=0

|-----|-----|
|  x1 |  y  |
|-----|-----|
|  0  |  1  |
|-----|-----|
|  1  |  1  |
|-----|-----|
如果
x2=1

|-----|-----|
|  x1 |  y  |
|-----|-----|
|  0  |  1  |
|-----|-----|
|  1  |  0  |
|-----|-----|

<> P/> P> > CUD库的C++界面上几乎没有文档的原因是它只是C函数的包装器,有大量的文档。p>

C++包主要用于清除所有CUDDYRF(…)和CUDDYRelsivEDREF(…)调用C接口需要的代码。请注意,如果需要,也可以使用C++接口的C接口。

要完成您想做的事情,您必须将CUDD提供的布尔运算符组合在一起,以获得具有所需属性的新布尔函数

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

BDD s0 = s & !x;
BDD s1 = s & x;
正如您所注意到的,新的BDD(还)没有忘记x变量的值。你希望它们是“不在乎”的w.r.t,等于x的值。因为您已经知道x在s0和s1中被限制为一个特定值,所以可以使用存在抽象运算符:

s0 = s0.ExistAbstract(x);
s1 = s1.ExistAbstract(x);
请注意,
x
在这里用作所谓的多维数据集(见下文)

这些是您现在想要的BDD


多维数据集解释:如果同时从多个变量中提取数据集,则应首先从要提取的所有变量中计算此类多维数据集。多维数据集主要用于表示一组变量。从数理逻辑中,我们知道,如果你存在或普遍地抽象出多个变量,那么抽象出这些变量的顺序并不重要。由于CUDD中的递归BDD操作尽可能在BDD对(或三元组)上实现,因此CUDD在内部也将一组变量表示为多维数据集,因此存在抽象操作可以只处理(1)要执行存在抽象的BDD,以及(2)表示要从中提取的变量集的BDD。多维数据集作为BDD的内部表示不应该与仅使用CUDD(而不是扩展CUDD)的开发人员相关,除非表示变量的BDDD也可以用作多维数据集。

使用Python包的Cython绑定到CUDD的方法如下:,它使用常量值替换变量
x2

从dd导入cudd作为_bdd
bdd=_bdd.bdd()
bdd.declare('x1','x2')
#变量x1和x2的反合取
u=bdd.add_expr(“~(x1/\x2)”)
let=dict(x2=False)
v=bdd.let(let,u)
断言v==bdd.true,v
let=dict(x2=True)
w=bdd.let(let,u)
w=bdd.add_expr(“~x1”)
断言w==w(w,w)

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

感谢您的回答,这非常有帮助。但我并不真正理解立方体的概念。我试图使用
Cudd\u bddComputeCube()
函数,但是我没有得到我想要的BDD。@A.J.X我已经在答案(上面)中添加了对多维数据集背后思想的解释。