繁体   English   中英

z3 python 改逻辑门子

[英]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_twoor_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM