繁体   English   中英

如何从 z3py 中的 Z3 Solver object 中获取现有约束?

[英]How to get existing constraints out of a Z3 Solver object in z3py?

例如,我想从 s 中获取现有约束并进入优化 object。

from z3 import *

a = Int('a')
x = Int('x')
b = Array('I', IntSort(), IntSort())
s = Solver()

s.add(a >= 0)
s.add(x == 0)
s.add(Select(b, 0) == 10)
s.add(Select(b, x) >= a)

opt = Optimize()
opt.add(s.constraints)

obj1 = opt.maximize(a)
obj2 = opt.minimize(a)

opt.set('priority', 'box')   # Setting Boxed Multi-Objective Optimization

is_sat = opt.check()
assert is_sat

print("Max(a): " + str(obj1.value()))
print("Min(a): " + str(obj2.value()))

那么结果会是这样的。

~$ python test.py 
Max(a): 10
Min(a): 0

如果想要获得添加到Solver (或Optimize )实例的所有约束的向量,可以使用方法assertions()

 | assertions(self) | Return an AST vector containing all added constraints. | | >>> s = Solver() | >>> s.assertions() | [] | >>> a = Int('a') | >>> s.add(a > 0) | >>> s.add(a < 10) | >>> s.assertions() | [a > 0, a < 10]

[来源:z3 文档]

例子:

from z3 import *

a = Int('a')
x = Int('x')
b = Array('I', IntSort(), IntSort())

s = Solver()

s.add(a >= 0)
s.add(x == 0)
s.add(Select(b, 0) == 10)
s.add(Select(b, x) >= a)

opt = Optimize()

opt.add(s.assertions())

obj1 = opt.maximize(a)
obj2 = opt.minimize(a)

opt.set('priority', 'box')

is_sat = opt.check()
assert is_sat

print("Max(a): " + str(obj1.value()))
print("Min(a): " + str(obj2.value()))

Output:

~$ python test.py 
Max(a): 10
Min(a): 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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