Z3 (检查sat)vs(使用smt检查sat)

Z3 (检查sat)vs(使用smt检查sat),z3,Z3,在阅读了Z3和Leo的文章后,我认为(检查sat)和(使用smt检查sat)是等效的。但是,当对我们的测试套件(230个SMTLIB2文件)运行Z3 4.3.2三次时,使用(检查sat),需要198s/192s/195s秒,而使用(使用smt检查sat),则需要275s/283s/270s秒。我还尝试了夜间构建Z3 4.4.0 d3fb5f2a4cda,两者的区别很相似 为什么会这样 更多可能相关的信息: Windows 7 x64、Z3 x64 我们所有的测试都配置了auto_config

在阅读了Z3和Leo的文章后,我认为
(检查sat)
(使用smt检查sat)
是等效的。但是,当对我们的测试套件(230个SMTLIB2文件)运行Z3 4.3.2三次时,使用
(检查sat)
,需要198s/192s/195s秒,而使用
(使用smt检查sat)
,则需要275s/283s/270s秒。我还尝试了夜间构建Z3 4.4.0 d3fb5f2a4cda,两者的区别很相似

为什么会这样

更多可能相关的信息:

  • Windows 7 x64、Z3 x64
  • 我们所有的测试都配置了
    auto_config false
    smt.mbqi false
  • 所有函数都使用量词和未解释的函数
  • 有些使用(非线性)整数和/或实数算术
  • 所有产品都大量使用推拉式挡块

编辑:我最终想做的是为一些
检查sat
调用设置超时,但不是为所有调用设置超时。好的,这在
检查sat
本身是不可能的,但是
使用检查sat(使用参数smt:soft\u timeout$timeout)
应该可以工作。是这样吗?

我想您正在SMT2文件上运行Z3

Z3具有在未指定任何基准时确定基准逻辑的功能(例如,参见)。
smt
策略是在没有其他策略适用时的回退策略。当Z3以-v:10运行时,它将显示运行的是哪个(子)策略


在最近的一段时间里,我们还遇到了一些配置参数无法传递到smt内核的问题。我们已经解决了这些问题,但当然也有可能在某个地方仍然存在bug

因此,可能是
(检查sat)
选择了比
smt
更专业(更高效)的解算器,因此运行时间上存在差异?也请看我编辑的问题。是的,可能是,这取决于基准中使用的内容。你有没有试过(重置)(设置选项:超时或:软超时…[东西](检查sat)?很好!出于某种原因,我认为在第一次断言完成后,您无法更改选项,但在每次
检查sat
之前设置
:timeout
,似乎效果很好(
:soft\u timeout
被拒绝,因为该选项显然已重命名为
:timeout
)。使用
reset
也可能不是那么容易,因为它也会重置符号声明(我使用
:global decls
使符号声明在pops中生存),而且它似乎会重置推送pop堆栈。是的,目前这两个选项名称有点不一致。我们决定删除soft_timeout选项,但尚未在代码的所有部分都删除。看起来好像在Z3的当前主分支中有潜在的关联fyi,可以使用
(使用默认值检查sat)
获得您想要的效果。看见