如何用CUDD包替换BDD中的一些变量?

How can I replace some variables in a BDD by CUDD package?

假设 DdManager 有四个变量:x, y, x', y' 并且我有一个由 xy 构建的 BDD。 现在我想将 x 更改为 x',将 y 更改为 y',即获得由 x'y' 构建的相同 BDD。

我如何使用 CUDD 包获得它?我在想实现一个模型检查算法时遇到了这个问题。我想知道如何实现这个操作或者我是否误解了符号模型检查算法? 非常感谢!

您可以使用函数 Cudd_bddSwapVariables 执行此操作。它获取以下参数:

  1. BDD 经理
  2. 您想用其他变量替换变量的 BDD。
  3. 第一个变量数组(由同样 Cudd_bddNewVar 将 return 表示的 BDD 节点表示)
  4. 第二个变量数组
  5. 交换的变量数。

您需要自己分配和释放数组。

使用 Cython 绑定到 package dd 中包含的 CUDD 的变量替换示例:

from dd import cudd

bdd = cudd.BDD()  # instantiate a shared BDD manager
bdd.declare("x", "y", "x'", "y'")
u = bdd.add_expr(r"x \/ y")  # create the BDD for the disjunction of x and y
rename = dict(x="x'", y="y'")
v = bdd.let(rename, u)  # substitution of x' for x and y' for y
s = bdd.to_expr(v)
print(s)  # outputs:  "ite(x', TRUE, y')"

# another way to confirm that the result is as expected
v_ = bdd.add_expr(r"x' \/ y'")
assert v == v_