你知道如何为每个 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.