z3 - 在 Z3py 的 forall 中定义量词变量问题
问题描述
以下代码应返回 z>=15 的 sat。然而,它给了unsat。我认为,量词变量 'y' 必须在 forall 范围内定义。请建议如何做到这一点。
from z3 import *
s = Solver()
s.set(auto_config=False, mbqi=False)
x = Int('x')
y = Int('y')
z = Int('z')
s.add(ForAll([y], Implies(And(y>-5,y<5),And(x==y+z,x>10))))
print(s.check())
m = s.model()
print(m)
解决方案
正如您所怀疑的那样,您所写的并不真正意味着您的意图。你写的选择一个单一的值x
来满足它。相反,您要说的是,x
可以为y
. 所以,只要用那个量化来说明它:
from z3 import *
s = Solver()
s.set(auto_config=False, mbqi=False)
x = Int('x')
y = Int('y')
z = Int('z')
s.add(ForAll([y], Implies(And(y>-5,y<5), Exists([x], And(x==y+z,x>10)))))
print(s.check())
m = s.model()
print(m)
注意存在论上x
。这打印:
sat
[z = 15]
虽然 z3 可以解决此类涉及量化的简单情况,但您应该知道 SMT 求解器通常不擅长使用量词进行推理,尤其是在它们嵌套时。一旦问题变得足够复杂,您可能会开始得到unknown
结果。
推荐阅读
- javascript - 将 JSON 转成表格纯 javascript
- c++ - 在两个线程都在使用时将一个线程移动到另一个线程
- macos - macOS 升级到 Big Sur 后 Virtualbox 启动失败
- python - cs50 pset7 房屋名册
- java - 以编程方式设置骆驼 ActiveMQ 组件选项
- python - Python - 如何在 CSV 输出中添加分隔符和删除换行符?
- javascript - 如何在 Angular 中的 NodeJS 发送的错误对象中查找错误消息
- python - window.blit(textR,name) UnboundLocalError: 在赋值之前引用了局部变量“name”
- python - 使用布尔数组的不同组合作为键的熊猫 groupby 结果
- python - 如何在python中的所有元音上使用“开头”?