CUDD:将变量转换为输出

时间:2019-05-02 14:10:03

标签: binary binary-decision-diagram cudd

我正在使用CUDD C ++,我想知道是否可以执行以下操作:

现在,我将下一张表存储在bdd中:

|-----|-----|-----||-----|
|  x1 |  x2 |  x3 ||  y  |
|-----|-----|-----||-----|
|  0  |  0  |  0  ||  0  |
|-----|-----|-----||-----|
|  0  |  0  |  1  ||  0  |
|-----|-----|-----||-----|
|  0  |  1  |  0  ||  1  |
|-----|-----|-----||-----|
|  0  |  1  |  1  ||  0  |
|-----|-----|-----||-----|
|  1  |  0  |  0  ||  0  |
|-----|-----|-----||-----|
|  1  |  0  |  1  ||  1  |
|-----|-----|-----||-----|
|  1  |  1  |  0  ||  0  |
|-----|-----|-----||-----|
|  1  |  1  |  1  ||  0  |
|-----|-----|-----||-----|

如果原始输出的值为1,是否可以用2个输出创建另一个表来提取x2x3的值?:

所需的输出:

|-----||-----|-----|
|  x1 ||  x2 |  x3 |
|-----||-----|-----|
|  0  ||  1  |  0  |
|-----||-----|-----|
|  1  ||  0  |  1  |
|-----||-----|-----|

我已经尝试使用ExistAbastract()命令,并获得2个bdds和正确的数据,但是仍然输入x2x3。是否可以根据x2的值将x3y从变量转换为输出?

1 个答案:

答案 0 :(得分:0)

您的第一个表是一个值表,它为x1,x2,x3的每个组合定义y的值,因此可以表示为变量x1,x2,x3上的BDD。

您所需的输出表仅在双行的左侧保留y1。因此,您需要两个BDD x2和x3,它们的范围仅超过x1的值。

请注意,如果对于x1的某个值,存在x2,x3的多个组合,使得y(x1,x2,x3)= True,则您的问题就模棱两可。但是,如果不是这种情况,这是一种可行的解决方案。

让我们只考虑需要x2函数的情况(另一种​​情况类似)。您从本质上抽象了x3并得到:

groovy.lang.MissingPropertyException: No such property: $ref for class: 
groovy.lang.Binding
    at groovy.lang.Binding.getVariable(Binding.java:63)

不错的开始。现在,您要作为最终函数的是y为真的行中x2的值。让我们分解一下:

  • 对于x1的所有值,如果最终函数的输出为true,则y(x1,true)为true
  • 对于x1的所有值,如果最终函数的输出为false,则y1(x1,false)为true。

我们可以建立第一种情况:

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

这个表达式已经足够了,因为这个表达式无论如何都会为其他所有输入值返回FALSE。