[英]z3 python change logic gate children
我的算法需要修改现有逻辑门的children()
。 假设我有以下代码
a = Bool('a')
b = Bool('b')
c = Bool('c')
or_gate = Or(a, b)
我想将or_gate
修改为Or(a, c)
。
我尝试了以下方法:
or_gate.children()[1] = c
print(or_gate)
上面的代码不起作用, or_gate
仍然是Or(a, b)
。 那么如何更改 z3 中逻辑门的子级?
编辑:由于嵌套门,我无法创建包含我想要的孩子的新Or()
。 例如考虑以下
a = Bool('a')
b = Bool('b')
c = Bool('c')
d = Bool('d')
e = Bool('e')
or_gate_one = Or(a, b)
or_gate_two = Or(or_gate_one, c)
or_gate_three = Or(or_gate_two, d)
如果我们创建新的 object 而不是直接修改or_gate_one
的孩子,那么or_gate_two
和or_gate_three
也应该修改,这对于大规模来说是可怕的。 我需要直接修改or_gate_one
的孩子。
使用替代方法:
from z3 import *
a = Bool('a')
b = Bool('b')
c = Bool('c')
or_gate = Or(a, b)
print(or_gate)
or_gate_c = substitute(or_gate, *[(a, c)])
print(or_gate_c)
这打印:
Or(a, b)
Or(c, b)
我不会担心效率,除非您发现它是一个问题:(1)当您尽可能多地使用substitute
时,z3 将“共享”内部 AST,以及(2)在大多数 z3 编程中,运行时主要是解决约束,而不是构建约束。
如果您发现构建约束的成本非常高,那么您应该切换到较低级别的 API(即 C/C++),而不是使用 Python,这样您就可以避免在两者之间进行额外级别的解释。 但同样,只有在您有运行时证据表明构建是瓶颈而不是解决问题时才这样做。 (因为在后者的常见情况下,切换到 C/C++ 无论如何也不会为您节省太多。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.