0

我正在使用 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 x2,是否可以创建另一个具有 2 个输出的表来提取 的值?:x3

期望的输出:

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

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

4

1 回答 1

0

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

您想要的输出表只有双线左侧的 y1 。因此,您需要两个 BDD x2 和 x3,它们的范围仅超过 x1 的值。

请注意,如果对于 x1 的某个值,存在 x2、x3 的多个组合使得 y(x1,x2,x3)=True,那么您的问题是不明确的。但如果不是这种情况,这里有一个可行的解决方案。

让我们只考虑您想要 x2 的函数的情况(另一种​​情况类似)。你存在抽象 x3 并得到:

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

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

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

我们可以将第一个案例构建为:

(y & x2).ExistAbstract(x2)

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

于 2019-05-02T19:12:34.350 回答