假设我有以下布尔函数:
or(x, y) := x || y
and(x, y) := x && y
not(x) := !x
foo(x, y, z) := and(x, or(y, z))
bar(x, y, z, a) := or(foo(x, y, z), not(a))
baz(x, y) := and(x, not(y))
现在我想从它们中构建一个二叉决策图。我查阅了几篇论文,但没有找到如何从这些嵌套逻辑公式中构建它们的方法。
据说布尔函数是一个根据方向的无环图。它有几个非终端和终端节点。然后它说每个非终端节点由布尔变量(而不是函数)标记,它有两个子节点。从节点到子节点a或b的边分别表示将节点分配为0或1。如果同构子图已合并,则称其为约简,并且删除其两个子节点是同构的节点。这是一个约简有序二叉决策图(ROBDD)。
从那里以及我遇到的所有资源中,我都无法弄清楚如何将这些函数转换为BDDs/ROBDDs:
foo(1, 0, 1)
bar(1, 0, 1, 0)
baz(1, 0)
或许需要转换的是这些:
foo(x, y, z)
bar(x, y, z, a)
baz(x, y)
我希望能得到关于如何将这个转换成根据方向有序且无环的图的解释。了解数据结构的样子也会很有帮助。看起来它只是这样的:
var nonterminal = {
a: child,
b: child,
v: some variable, not sure what
}
但问题在于如何从这些函数foo
、bar
和baz
构建图形。
(A.var, OP(A.lo, B.lo), OP(A.hi, B.hi))
中的OP
是什么意思。对于“由简单操作组成的复杂函数可以通过自下而上地应用此方法转换为BDD,在每个步骤中只需对BDD进行简单的组合”,我不太确定您的意思。如果您能提供一个例子,那将会很有帮助。 - Lance