z3 - 新变量未显示在找到的模型中
问题描述
我正在使用 z3 编写静态检查器。我有以下问题:
>>> from z3 import *
>>> s = Solver()
>>> s.add(FreshInt() + FreshInt() > 0)
>>> s.check()
sat
>>> s.model()
[]
如您所见,模型中未显示新变量。我也无法获得它们的价值:
>>> a = FreshInt()
>>> s.add(a > 3)
>>> s.check()
sat
>>> s.model()
[]
>>> s.model()[a]
我查看了文档,但找不到改变这种行为的方法。我可以自己生成唯一的变量,但如果 z3 可以为我处理这个问题,那就太好了。有人可以指出我正确的方向吗?还是不能在 z3py 中改变它?
解决方案
FreshInt
/FreshReal
等旨在创建用户不可见的内部变量。您应该改为使用Int('name')
andReal('name')
创建将在模型中显示的用户级变量。
如果您真的想查看该值,可以添加一个observer
函数并像这样使用它:
from z3 import *
def observeInt(s, a):
obs = Int('observer')
s.add(obs == a)
# might want to check the following really returns sat!
s.check()
print s.model()[obs]
s = Solver()
a = FreshInt()
s.add(a + FreshInt() > 0)
s.add(a > 12)
print s.check()
observeInt(s, a)
这打印:
sat
13
这显然并不便宜(因为它涉及对 的调用check
),但它是安全的,只要它在调试情况下用于强臂 z3 就像你所说的那样,它应该可以解决问题。
推荐阅读
- git - 不能将 2 个本地分支设置为同一个上游远程
- javascript - 未找到 Service Worker 端点
- javascript - JavaScript:将 Json 数据数组更改为新格式
- javascript - D3.JS V5:错误:
属性 d:预期数字,“MNaN,242.20533333…” - amazon-web-services - 具有 503 服务的 Aws wordpress EC2 不可用
- javascript - Paypal Pass 项目 sku 和订单参考 ID
- java - 不能在java中使用来自sql的Varchar变量作为String
- html - 离子刷新背景是黑色而不是白色错误
- c++ - C++ 类成员函数别名模板防止大括号括起来的初始值设定项列表被识别为对/元组
- python - AttributeError:“RefVariable”对象在非急切执行模式下没有属性“_id”