在 Z3 中证明归纳事实

2024-03-19

我试图在 Microsoft 的 SMT 求解器 Z3 中证明一个归纳事实。我知道 Z3 一般不提供此功能,如Z3 guide http://rise4fun.com/z3/tutorial/guide(第 8 节:数据类型),但是当我们限制要证明事实的域时,这似乎是可能的。考虑以下示例:

(declare-fun p (Int) Bool)
(assert (p 0))

(assert (forall ((x Int)) 
    (=> 
    (and (> x 0) (<= x 20))
    (= (p (- x 1)) (p x) ))))
(assert (not (p 20)))

(check-sat)

求解器正确响应unsat, 意思就是(p 20)已验证。问题是,当我们进一步放松这个约束时(我们替换20在前面的示例中,任何大于 20 的整数),求解器都会响应unknown.

我觉得这很奇怪,因为 Z3 不需要很长时间就能解决原来的问题,但是当我们将上限增加 1 时,它突然变得不可能了。我尝试向量词添加模式,如下所示:

(declare-fun p (Int) Bool)
(assert (p 0))

(assert (forall ((x Int)) 
    (! (=> 
    (and (> x 0) (<= x 40))
    (= (p (- x 1)) (p x) )) :pattern ((<= x 40)))))
(assert (not (p 40)))

(check-sat)

哪个似乎效果更好,但现在上限是 40。这是否意味着我最好不要使用 Z3 来证明这些事实,或者我是否错误地表述了我的问题?


Z3 使用许多启发式方法来控制量词实例化。其中之一是基于“实例化深度”的。 Z3 用“深度”属性标记每个表达式。所有用户提供的断言都标记为深度 0。实例化量词时,新表达式的深度会增加。 Z3 不会使用深度大于预定义阈值标记的表达式来实例化量词。在您的问题中,达到了阈值:(p 40)深度为0,(p 39)是深度1,(p 38)是深度 2,等等。

要增加阈值,您应该使用以下选项:

(set-option :qi-eager-threshold 100)

以下是使用此选项的示例:http://rise4fun.com/Z3/ZdxO http://rise4fun.com/Z3/ZdxO.

当然,使用这个设置,Z3会超时,例如(p 110).

未来Z3将对“有界量化”有更好的支持。在大多数情况下,处理此类量词的最佳方法是对其进行扩展。 通过编程 API,我们可以在将表达式发送到 Z3 之前轻松“实例化”它们。 这是 Python 中的一个示例(http://rise4fun.com/Z3Py/44lE http://rise4fun.com/Z3Py/44lE):

p = Function('p', IntSort(), BoolSort())

s = Solver()

s.add(p(0))
s.add([ p(x+1) == p(x) for x in range(40)])
s.add(Not(p(40)))

print s.check()

最后,在Z3中,包含算术符号的模式并不是很有效。问题是Z3在求解之前对公式进行了预处理。那么,大多数包含算术符号的模式将永远不会匹配。有关如何有效使用模式/触发器的更多信息,请参阅本文 http://research.microsoft.com/en-us/um/people/moskal/pdf/prtrig.pdf。作者还提供了一个幻灯片 http://research.microsoft.com/en-us/um/people/moskal/pdf/prtrig-slides.pdf.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Z3 中证明归纳事实 的相关文章

  • 使用布尔运算符在 Z3 中定义约束

    比方说 我想使用 Z3 约束将字符串的每个字符限制为字符集 a zA Z0 9 我可以使用布尔运算符来指定吗 举个例子 input BitVec input s i 8 for i in range 10 for i in range 10
  • 从 z3 模型中仅提取一个值

    我正在寻找相当于 z3 源 API获取价值 例如 当我有以下查询时 我可以轻松指定我想要查看哪些值 declare const s1 String declare const s2 String assert 8 str len s1 as
  • 如何在线使用Z3Py解决运算放大器的问题

    求下列电路中R的值 使用以下代码可以解决此问题 R V1 V2 Vo Reals R V1 V2 Vo I1 V1 R 50 I2 V2 R 10 g R I1 I2 print g equations Vo g print equatio
  • 如何使用 z3py 进行增量求解

    我正在使用 Z3 求解器的 python API 来搜索优化的时间表 它工作得很好 除了有时即使对于小图也非常慢 但有时非常快 原因可能是我的调度问题的约束相当复杂 我试图加快速度 并偶然发现了一些关于增量解决方案的文章 据我了解 您可以使
  • 有没有办法获取Z3中的默认上下文?

    我正在使用 z3py API 4 3 0 我可以轻松翻译一个表达expr从默认上下文到新上下文target ctx using expr translate target ctx 但是我如何从给定的上下文中进行翻译ctx进入默认的 Z3 上
  • 如何让 z3 返回多个 unsat 核心、多个令人满意的作业

    我正在研究一个研究工具的一个组件 我有兴趣检索 对于 QF LRA 多个 最少或其他 UNSAT核心以及 多项 SAT 作业 我检查了论坛以获取有关此主题的早期讨论 例如 在逻辑 QF LRA 上使用 z3 时如何获得不同的 unsat 核
  • 在 Z3 中使用 SMT 约束时获取合法范围信息的(次)最佳方法

    这个问题与我之前的问题相关 在 Z3 中使用 SMT 约束时是否可以获得合法的范围信息 https stackoverflow com questions 53676016 is it possible to get a legit ran
  • (Z3Py) 函数声明有什么限制吗?

    函数声明有什么限制吗 例如 这段代码返回 unsat from z3 import def one op op arg1 arg2 if op 1 return arg1 arg2 if op 2 return arg1 arg2 if o
  • z3 是否支持有理算术的输入约束?

    事实上 SMT LIB标准是否有理性的 不仅仅是真实的 排序 按其website http smtlib cs uiowa edu theories shtml 它不是 如果 x 是有理数并且我们有约束 x 2 2 那么我们应该返回 不可满
  • 如何将公式转换为析取范式?

    说给定一个公式 t1 gt 2 或 t2 gt 3 且 t3 gt 1 我希望得到它的析取范式 t1 gt 2 且 t3 gt 1 或 t2 gt 3 且 t3 gt 1 在Z3中如何实现这一点 Z3没有将公式转换为DNF的API或策略 然
  • 使用 Z3 SMT 解决谓词演算问题

    我想使用 Z3 来解决最自然地用原子 符号 集合 谓词和一阶逻辑表达的问题 例如 伪代码 A a1 a2 a3 A is a set B b1 b2 b3 C c1 c2 c3 def p a A b B c C gt Bool p is
  • 在使用和不使用推送调用的情况下对 UFBV 上的 Z3 进行增量调用

    我正在 UFBV 查询上运行 Z3 目前查询包含2个调用check sat 如果我把push 1刚过check sat Z3在30秒内解决了查询 如果我不放任何push 1根本没有 因此有两个电话check sat没有任何push 1他们之
  • Z3 支持非线性算术

    我知道 Z3 对非线性算术有一些支持 但想知道扩展到什么范围 是否可以指定支持和不支持 或可能超时 哪些类别的非线性算术 提前了解这些将帮助我尽早放弃我的任务 似乎不支持与电源相关的内容 如下所示 def pow2 x k Int k re
  • 将理论插件与求解器结合使用

    最新版本Z3 http z3 codeplex com解耦了以下概念Z3 context and Z3 solver The API http research microsoft com en us um redmond projects
  • 在 Z3 中证明归纳事实

    我试图在 Microsoft 的 SMT 求解器 Z3 中证明一个归纳事实 我知道 Z3 一般不提供此功能 如Z3 guide http rise4fun com z3 tutorial guide 第 8 节 数据类型 但是当我们限制要证
  • SMT中量化算术推理的局限性是什么?

    我在以下看似微不足道的基准测试中尝试了几种 SMT 求解器 CVC3 CVC4 和 Z3 set logic LIA set info smt lib version 2 0 assert forall x Int forall y Int
  • Z3统计中内存使用量的单位是什么?

    z3 统计中测量内存使用情况的单位是什么 是MB还是KB 记忆到底意味着什么 是执行期间的最大内存使用量还是所有分配的总和 它是执行期间最大堆大小的近似值 并通过 cmd context cpp 中的以下函数将其添加到统计对象中 void
  • 为什么 Z3 对于很小的搜索空间来说很慢?

    我正在尝试制作一个 Z3 程序 在 Python 中 它生成执行某些任务的布尔电路 例如 添加两个 n 位数字 但性能非常糟糕 以至于对整个解决方案空间进行强力搜索将导致快一点 这是我第一次使用 Z3 所以我可能会做一些影响我性能的事情 但
  • 能够删除特定约束的增量 SMT 求解器

    是否有增量 SMT 求解器或用于某些增量 SMT 求解器的 API 我可以在其中增量添加约束 在其中我可以通过某个标签 名称唯一地标识每个约束 我想唯一地标识约束的原因是这样我可以稍后通过指定标签 名称来删除它们 需要放弃约束是因为我之前的
  • 如何以跨系统的方式将进程仅绑定到物理核心?

    我在用着每次将线程数加倍的项目 https github com ConsenSys mythril pull 1372 files 您会增加 40 到 60 的开销 由于超线程将性能最多提高了 30 这意味着程序在超线程系统上的运行速度比

随机推荐

  • 如何设计一个带有需要引用自身的表的数据库?

    我正在构建一个数据库 但遇到了一个我似乎无法解决的问题 数据库比图中复杂得多 但问题可以归纳为下面的表结构 问题是每个员工都有一个经理 每个经理都是员工 看起来这些表必须互相引用 但是 当我设置它时 这似乎无法正常工作 我正在使用cakep
  • 使用单个服务器端变量处理多个复选框

    我有以下 HTML 代码
  • C#:例如集合的封装

    我想知道其中哪一个被认为是最干净或最好用的以及为什么 其中一个公开乘客列表 允许用户添加和删除等 另一个隐藏列表 只允许用户枚举它们并使用特殊方法添加 实施例1 class Bus public IEnumerable
  • Android模拟器源码在哪里

    当我几周前更新 Android Studio 时 不同组件的新版本也会自动更新 与 Android 模拟器的情况一样 我现在的版本 29 2 3 5916265 有一个错误 降级似乎非常非常困难 在最新版本的模拟器中 模拟 GPX 轨道的布
  • Interval 属性更改时 System.Timer 的行为

    我有一个 System Timer 设置 每天凌晨 2 点触发一个事件 如果计时器启动的进程失败那么我想要计时器 重置为每 15 分钟运行一次 直到该过程成功完成 this is how the timer is set up this i
  • String[] 内存使用情况

    我将字符串数组声明为 String items1 new String 5 String items2 new String 20 如果这两个数组都只包含 2 个元素 会对内存和性能产生多大影响 你可以自己测试一下 public stati
  • Spring Security - 即使凭据正确,身份验证也不起作用

    我在我的应用程序中使用 spring security 拦截一些 URL 进行身份验证 虽然网址 securemapping1 通过显示登录页面提示用户登录 但是登录不起作用 即使我提供了正确的凭据 我也会返回登录页面 凭据错误 错误通过调
  • AngularJS 应用程序在 IE 中加载缓慢 - 添加进度条

    UPDATE1 开始使用ngProgress http victorbjelkholm github io ngProgress 但在 IE 中没有给出所需的效果 最终更新 找到最佳解决方案 请参阅下面的最后一个答案 AngularJS 应
  • TreeSet 自定义比较器算法 .. 字符串比较

    从提供的输入字符串 200 400 7 1 100 0 1 1 200 200 3 1 0 400 11 1 407 308 5 1 100 600 9 1 我在 TreeSet 中添加相同的内容 并希望它按第三个元素顺序排序 因此预期输出
  • Mac Excel 2016 VBA - Workbook.open 出现 1004 错误

    我正在尝试让一个在 Excel 2011 for Mac 中完美运行的宏在 Excel 2016 for mac 中运行 目标是让用户指定一个包含 csv 文件的文件夹 然后宏循环遍历所有 csv 文件 打开每个文件将信息从其中复制到另一个
  • 钩子回调时状态不正确

    我正在使用 socket io 和 React hooks 编写一个聊天客户端 消息历史记录 chatMessages 时addMessage 收到消息事件后 调用不正确 始终为空数组 chatMessages确实更新 正确 但在下次调用时
  • 在 VBA (Microsoft Access) 中将标签的“Caption”属性的一部分加粗

    如何将 Microsoft Access 标签标题中的某个单词加粗 如果有帮助 文本本身将存储在 Microsoft Access 表中 下面是一个例子 我有一个带有标签的 Microsoft Access 表单 位于Form Load 事
  • 缓慢选择所有条目

    下面的 SELECT 与内部表一起运行GIT KUNNR TAB包含 2 291 000 条具有唯一客户 kunnr 的行 需要 16 分钟才能完成 select kunnr umsks umskz gjahr belnr buzei bs
  • 有没有办法知道文档何时已从缓存与数据库同步?

    我正在构建一个即时通讯应用程序 类似于WhatsApp 我需要显示消息的发送状态 正在发送 已发送 如果是 Firebase 缓存 由于处于离线状态 则发送 如果消息位于在线数据库上 则发送 有没有办法判断特定文档是否已上传到数据库 我目前
  • androidplot背景图像移位

    我尝试使用以下代码将图形网格的背景分为 3 个区域 int data 0xff000000 0x80008000 0xff000000 bgBitmap Bitmap createBitmap data 1 3 Bitmap Config
  • 如何在facebook SDK中分享视频?

    我编写了如下代码 其中文件存在于资源中 它不为空 我成功添加图像 但卡在视频上 void uploadVideo NSLog UPload Videio NSString filePath NSBundle mainBundle pathF
  • 数据库中的实体类...错误无效资源_pm

    我通过 phpMyAdmin 在 MySQL 中创建了数据库和表 我正在尝试使用数据库中的实体类将其连接到我的项目 但是 当我运行我的项目时 出现以下错误 Caused by com sun appserv connectors inter
  • Windows 7、R 3.0.2、插入符号 6.0-21 上插入符号中的 train() 出现致命错误

    我正在尝试使用train 插入符号以适应分类模型 但我遇到了某种未处理的异常 并且在 R 控制台中输出任何错误信息之前我的 R 会话崩溃了 Windows 错误 R for Windows 终端前端已停止工作 我正在运行 Windows 7
  • html表格中的MVC分页

    我有一个带有搜索按钮的搜索表单 当用户输入所有搜索输入字段并按下搜索按钮时 将仅返回同一页面中 html 表中的前 10 条记录 我已经做到了这一点 当用户按下下一页按钮时 我必须保留用户输入的值并将其发送到数据库并获取接下来的 10 条记
  • 在 Z3 中证明归纳事实

    我试图在 Microsoft 的 SMT 求解器 Z3 中证明一个归纳事实 我知道 Z3 一般不提供此功能 如Z3 guide http rise4fun com z3 tutorial guide 第 8 节 数据类型 但是当我们限制要证