首页
学习
活动
专区
圈层
工具
发布

Z3软约束
EN

Stack Overflow用户
提问于 2022-05-27 16:34:31
回答 1查看 87关注 0票数 0

我对在z3中使用软约束感到困惑。运行此程序时,我将获得以下输出。

代码语言:javascript
复制
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 = False,v= -1

请有人知道为什么当v存在允许的值时,软约束不满足吗?

类似地,此程序不返回预期的输出:

代码语言:javascript
复制
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())

它返回v1 = 0,e= False。为什么软约束不能得到满足?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-27 17:06:58

parse_smt2_string似乎不保留软断言。

如果在调用print(o.sexpr())之前添加check,它会打印:

代码语言:javascript
复制
(declare-fun v () Real)
(declare-fun v1 () Bool)
(assert (= v1 (<= (to_real 0) v)))
(assert (> (to_real 10) v))

正如你所看到的,软约束已经消失了。所以,z3看到的不是你想象的那样。这解释了意外的输出。

我知道parse_smt2_string并不完全忠实,因为它不处理任意的SMTLib输入。这个案子是否得到支持,我不确定。将其作为一个问题提交给https://github.com/Z3Prover/z3/issues,开发人员可能会看一看。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72408522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档