你知道如何为每个 z3 数组元素设置 "weak" 初始值吗?
Do you know how to set "weak" initial values to each of z3 Array element?
比如Z3中有没有类似下面weak_Store的函数?
from z3 import *
a = Array('a', IntSort(), IntSort())
a = weak_Store(a, 0, 0)
a = weak_Store(a, 1, 1)
s = Solver()
s.add(a[0] == 100)
print(s.check()) # should print "sat"
print(s.model().eval(a[0])) # should print "100"
print(s.model().eval(a[1])) # should print "1" which is stored as weak_Store.
由于a[1]没有参与上面的约束求解,所以即使在s.check()之后也不应该计算和改变。
我认为这与 z3_model_eval
中的 model_completion
变量有关,
但是 z3_model_eval
不适用于 z3 Array
元素。
虽然这个例子是用Python写的,但我想用z3 C api.
来做
有人可以帮我吗?
提前致谢。
这种约束称为 "soft" 约束,即必要时可以违反的约束,但求解器会尝试满足它们。请注意,您必须使用 Optimize
对象(而不是 Solver
),它通常会降低容量。 (即,更慢,更有可能说 unknown
等)
要添加软约束,请在 z3py 中使用 add_soft
而不是 add
。您可以像这样在 Python 中编写您的示例代码:
from z3 import *
a = Array('a', IntSort(), IntSort())
s = Optimize()
s.add_soft(a[0] == 0)
s.add_soft(a[1] == 1)
s.add(a[0] == 100)
print(s.check())
print(s.model().eval(a[0]))
print(s.model().eval(a[1]))
这会打印:
sat
100
1
如您所愿。
C-API中对应的调用是Z3_optimize_assert_soft.
比如Z3中有没有类似下面weak_Store的函数?
from z3 import *
a = Array('a', IntSort(), IntSort())
a = weak_Store(a, 0, 0)
a = weak_Store(a, 1, 1)
s = Solver()
s.add(a[0] == 100)
print(s.check()) # should print "sat"
print(s.model().eval(a[0])) # should print "100"
print(s.model().eval(a[1])) # should print "1" which is stored as weak_Store.
由于a[1]没有参与上面的约束求解,所以即使在s.check()之后也不应该计算和改变。
我认为这与 z3_model_eval
中的 model_completion
变量有关,
但是 z3_model_eval
不适用于 z3 Array
元素。
虽然这个例子是用Python写的,但我想用z3 C api.
有人可以帮我吗?
提前致谢。
这种约束称为 "soft" 约束,即必要时可以违反的约束,但求解器会尝试满足它们。请注意,您必须使用 Optimize
对象(而不是 Solver
),它通常会降低容量。 (即,更慢,更有可能说 unknown
等)
要添加软约束,请在 z3py 中使用 add_soft
而不是 add
。您可以像这样在 Python 中编写您的示例代码:
from z3 import *
a = Array('a', IntSort(), IntSort())
s = Optimize()
s.add_soft(a[0] == 0)
s.add_soft(a[1] == 1)
s.add(a[0] == 100)
print(s.check())
print(s.model().eval(a[0]))
print(s.model().eval(a[1]))
这会打印:
sat
100
1
如您所愿。
C-API中对应的调用是Z3_optimize_assert_soft.