python - 使用 z3Py 证明两个表达式范围的等价/不同
问题描述
from z3 import *
s = Solver()
a, b = Ints("a b")
s.add(a > 2)
s.add(b > 0)
s.add(Or(Exists(a, ForAll(b, a != b)), Exists(b, ForAll(a, a != b))))
s.check() # print "unsat"
我试图证明 和 范围的a
差异b
。这可以通过定位超出范围的b
值的赋值来完成。1
a
但是,上面的程序给出了意想不到的unsat
. 我想知道为什么以及是否有更有效的方法来实现这一目标。
解决方案
ForAll
确切的意思是:所有数字,即Exists(a, ForAll(b, a != b))
始终为假,因为没有Int
与所有Int
s 不同的东西,因此第三个断言本身是不可满足的。你想要类似的东西s.add(Exists(a, (Exists (b, And(Not(a > 2), b > 0)))))
。
另外,请注意您使用了两个不同的a
and b
。Exists(a, ...)
不会对现有变量进行量化,但会引入一个新变量,该变量被意外称为与您的 global (existential) 同名的a
, b
.
推荐阅读
- state-machine - AWS Step Function in the Wait step. How to change the specified date and time of that Wait step if it is already active?
- java - Unexpected response code 406 - GET request for JSOnObject using Volley - Android Studio
- python - Tkinter使用for循环将条目数据保存在excel文件中
- java - 如何使用 Java 检查 Selenium 中显示的日期
- visual-studio-code - 在 VS Code 中向 gdb 发送消息
- javascript - 在谷歌标签管理器服务器端准备一个输入表,作为 API 请求正文的一部分发送
- knitr - knitr 内联代码“message = false”不起作用
- unity3d - 如何调整/拉伸世界空间 UI?
- python - 使用 Pandas 创建多级列
- amazon-web-services - 函数返回 null 作为响应