Z3软约束
Z3 soft constraint
我对 z3 中软约束的使用感到困惑。当运行这个程序时,我得到以下输出。
from z3 import *
o = Solver()
expr = f"""
(declare-const v Real)
(declare-const v1 Bool)
(assert-soft v1)
(assert (= v1 (<= 0 v)))
(assert (> 10 v))
"""
p = parse_smt2_string(expr)
o.add(p)
print(o.check())
print(o.model())
输出:
[v1 = 假,v = -1]
请问有人知道为什么在存在允许软约束的 v 值的情况下不满足软约束吗?
同样,这个程序没有return预期的输出:
from z3 import *
o = Optimize()
expr = f"""
(declare-const v1 Real)
(declare-const e Bool)
(assert (= e (<= 6 v1)))
(assert-soft e)
"""
p = parse_smt2_string(expr)
o.add(p)
print(o.check())
print(o.model())
它 returns [v1 = 0, e = False]。为什么软约束不能实现?
看起来 parse_smt2_string
没有 保留软断言。
如果您在调用 check
之前添加 print(o.sexpr())
,它会打印:
(declare-fun v () Real)
(declare-fun v1 () Bool)
(assert (= v1 (<= (to_real 0) v)))
(assert (> (to_real 10) v))
如您所见,soft-constraint 已消失。所以,z3 看到的并不是您认为的那样。这解释了意外的输出。
我知道 parse_smt2_string
并不完全忠实,因为它不处理任意 SMTLib 输入。我不确定是否支持这种特殊情况。在 https://github.com/Z3Prover/z3/issues 将其作为问题提交,开发人员可能会查看。
我对 z3 中软约束的使用感到困惑。当运行这个程序时,我得到以下输出。
from z3 import *
o = Solver()
expr = f"""
(declare-const v Real)
(declare-const v1 Bool)
(assert-soft v1)
(assert (= v1 (<= 0 v)))
(assert (> 10 v))
"""
p = parse_smt2_string(expr)
o.add(p)
print(o.check())
print(o.model())
输出: [v1 = 假,v = -1]
请问有人知道为什么在存在允许软约束的 v 值的情况下不满足软约束吗?
同样,这个程序没有return预期的输出:
from z3 import *
o = Optimize()
expr = f"""
(declare-const v1 Real)
(declare-const e Bool)
(assert (= e (<= 6 v1)))
(assert-soft e)
"""
p = parse_smt2_string(expr)
o.add(p)
print(o.check())
print(o.model())
它 returns [v1 = 0, e = False]。为什么软约束不能实现?
看起来 parse_smt2_string
没有 保留软断言。
如果您在调用 check
之前添加 print(o.sexpr())
,它会打印:
(declare-fun v () Real)
(declare-fun v1 () Bool)
(assert (= v1 (<= (to_real 0) v)))
(assert (> (to_real 10) v))
如您所见,soft-constraint 已消失。所以,z3 看到的并不是您认为的那样。这解释了意外的输出。
我知道 parse_smt2_string
并不完全忠实,因为它不处理任意 SMTLib 输入。我不确定是否支持这种特殊情况。在 https://github.com/Z3Prover/z3/issues 将其作为问题提交,开发人员可能会查看。