首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cudd_bddIte的意外输出

Cudd_bddIte的意外输出
EN

Stack Overflow用户
提问于 2018-09-15 02:48:13
回答 1查看 86关注 0票数 1

我正在尝试使用Cudd_bddIte来实现简单的BDDs。下面的代码按照预期工作,给出了图片中的图表(表示节点bdd):

代码语言:javascript
复制
DdNode *v1 = Cudd_bddNewVar(gbm);
Cudd_Ref(v1);

DdNode *v2 = Cudd_bddNewVar(gbm);
Cudd_Ref(v2);

DdNode *v3 = Cudd_bddNewVar(gbm);
Cudd_Ref(v3);

DdNode *tmp1 = Cudd_bddIte(gbm, v1, Cudd_ReadLogicZero(gbm), Cudd_ReadOne(gbm));
Cudd_Ref(tmp1);

DdNode *tmp2 = Cudd_bddIte(gbm, v2, tmp1, Cudd_ReadOne(gbm));
Cudd_Ref(tmp2);
Cudd_RecursiveDeref(gbm,tmp1);

DdNode *bdd = Cudd_bddIte(gbm, v3, tmp2, Cudd_ReadOne(gbm));
Cudd_Ref(bdd);
Cudd_RecursiveDeref(gbm,tmp2);

但是,如果我将tmp2的ITE语句更改为以下内容

代码语言:javascript
复制
DdNode *tmp2 = Cudd_bddIte(gbm, v2, tmp1, Cudd_ReadLogicZero(gbm));

我得到了这个意想不到的图表:

对我来说,这是错误的,因为我希望最上面的变量仍然会在false的情况下立即产生1,就像第一张图片中一样。我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2018-09-16 16:55:46

在(RO)BDD中,所有变量都以特定的顺序出现。在您的例子中,顺序似乎是您分配的"v1,v2,v3“,并且似乎没有发生任何变量重新排序。

在构建Cudd_bddIte时,BDD函数不要求您遵守顺序。当您在代码中使用bddIte函数时,您将利用此功能:为了构建"bdd",您使用v1和v2上的两个子树将bddIte函数应用于变量v3。但是,v3位于变量顺序的末尾,因此整个树都被重构了。

实际上,您所显示的第二个树具有您所期望的属性:每当v3具有真值时,BDD就会将变量valuation映射为TRUE。从以下事实可以看出这一点:到达"0“接收器的唯一途径是经由节点0x2e,其用于变量v3,并且只有当获取该节点的当时的后继者时才能到达"0”接收器。

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

https://stackoverflow.com/questions/52337722

复制
相关文章

相似问题

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