首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >乘积布尔表达式的CUDD和

乘积布尔表达式的CUDD和
EN

Stack Overflow用户
提问于 2016-04-08 10:09:10
回答 2查看 528关注 0票数 1

我想为以下布尔函数创建BDD:

代码语言:javascript
复制
F = (A'B'C'D') OR (A'B C) OR (C' D') OR (A)

我只使用以下代码创建了F = (A'B'C'D'),但是如何将其他产品术语添加到现有的BDD中呢?

代码语言:javascript
复制
 int main (int argc, char *argv[])
{
    char filename[30];
    DdManager *gbm; /* Global BDD manager. */
    gbm = Cudd_Init(0,0,CUDD_UNIQUE_SLOTS,CUDD_CACHE_SLOTS,0); /* Initialize a new BDD manager. */
    DdNode *bdd, *var, *tmp_neg, *tmp;
    int i;
    bdd = Cudd_ReadOne(gbm); /*Returns the logic one constant of the manager*/
    Cudd_Ref(bdd); /*Increases the reference count of a node*/

    for (i = 3; i >= 0; i--) {
        var = Cudd_bddIthVar(gbm,i); /*Create a new BDD variable*/
        tmp_neg = Cudd_Not(var); /*Perform NOT boolean operation*/
        tmp = Cudd_bddAnd(gbm, tmp_neg, bdd); /*Perform AND boolean operation*/
        Cudd_Ref(tmp);
        Cudd_RecursiveDeref(gbm,bdd);
        bdd = tmp;
    }

    bdd = Cudd_BddToAdd(gbm, bdd); 
    print_dd (gbm, bdd, 2,4);   
    sprintf(filename, "./bdd/graph.dot"); 
    write_dd(gbm, bdd, filename);  
    Cudd_Quit(gbm);
    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-08 10:43:40

独立构建每个连接,以便使conj0conj3,确保只否定正确的文字。我对C不太熟悉,现在还没有开发环境设置,所以您需要做一些修改。

我将使用以下映射

代码语言:javascript
复制
A <=> BDD(0)
B <=> BDD(1)
C <=> BDD(2)
D <=> BDD(3)

按照现在在for循环中所做的方式构建conj0。以后一定要确认conj0 = bdd

对于conj1,它将编码(A' B C),使用

代码语言:javascript
复制
bdd = Cudd_IthVar(gbm, 0);
bdd = Cudd_Not(bdd);
tmp = Cudd_And(gbm, bdd, Cudd_IthVar(gbm, 1));
Cudd_Ref(tmp);
Cudd_Deref(gbm, bdd);
bdd = tmp;
tmp = Cudd_And(gbm, bdd, Cudd_IthVar(gbm, 2));
Cudd_Ref(tmp);
Cudd_Deref(gbm, bdd);
bdd = tmp;
conj1 = bdd;

conj2conj3也这样做。

在得到所有的连词之后,使用Cudd_bddOr()构建顶层分离。还请确保正确使用Cudd_Ref()Cudd_Deref(),否则会泄漏内存。

票数 2
EN

Stack Overflow用户

发布于 2016-04-14 22:52:59

如果您只对该特定函数感兴趣,下面是构建和检查它的一种方法:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include "cudd.h"

int main(void) {
  /* Get set. */
  DdManager * mgr = Cudd_Init(4,0,CUDD_UNIQUE_SLOTS,CUDD_CACHE_SLOTS,0);
  DdNode *a = Cudd_bddIthVar(mgr, 0);
  DdNode *c = Cudd_bddIthVar(mgr, 1);
  DdNode *b = Cudd_bddIthVar(mgr, 2);
  DdNode *d = Cudd_bddIthVar(mgr, 3);
  char const * const inames[] = {"a", "c", "b", "d"};
  /* Build BDD. */
  DdNode * tmp = Cudd_bddIte(mgr, c, b, Cudd_Not(d));
  Cudd_Ref(tmp);
  DdNode * f = Cudd_bddOr(mgr, a, tmp);
  Cudd_Ref(f);
  Cudd_RecursiveDeref(mgr, tmp);
  /* Inspect it. */
  printf("f");
  Cudd_PrintSummary(mgr, f, 4, 0);
  Cudd_bddPrintCover(mgr, f, f);
  char * fform = Cudd_FactoredFormString(mgr, f, inames);
  printf("%s\n", fform);
  /* Break up camp and go home. */
  free(fform);
  Cudd_RecursiveDeref(mgr, f);
  int err = Cudd_CheckZeroRef(mgr);
  Cudd_Quit(mgr);
  return err;
}

注意(最优)变量顺序的选择。您应该看到这个输出:

代码语言:javascript
复制
f: 5 nodes 1 leaves 12 minterms
1--- 1
-11- 1
-0-0 1

a | (c & b | !c & !d)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36496922

复制
相关文章

相似问题

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