UFBV上对Z3的增量调用,包括推送调用和不包括推送调用

UFBV上对Z3的增量调用,包括推送调用和不包括推送调用,z3,Z3,我在UFBV查询上运行Z3。当前查询包含2个调用检查sat。 如果我在check sat之后放置push 1,Z3将在30秒内解决查询。如果我根本没有放入任何push 1,因此有两个调用check sat,而它们之间没有任何push 1,那么Z3将在200秒内解决它。 有趣。有什么具体的原因或巧合吗?Z3.x有一种基于战术和战术的“战略规范语言”。我还没有“做广告”,因为它正在进行中。 本文描述了基本思想。 对于每种逻辑,我们都有不同的内置策略。这些策略通常不支持增量求解,因为它们可能应用使用“

我在UFBV查询上运行Z3。当前查询包含2个调用
检查sat
。 如果我在
check sat
之后放置
push 1
,Z3将在30秒内解决查询。如果我根本没有放入任何
push 1
,因此有两个调用
check sat
,而它们之间没有任何
push 1
,那么Z3将在200秒内解决它。 有趣。有什么具体的原因或巧合吗?

Z3.x有一种基于战术和战术的“战略规范语言”。我还没有“做广告”,因为它正在进行中。 本文描述了基本思想。 对于每种逻辑,我们都有不同的内置策略。这些策略通常不支持增量求解,因为它们可能应用使用“封闭世界”假设的转换。例如,我们有将0-1线性整数算法映射到SAT的转换。每当Z3检测到用户“想要”增量解算(例如,多个
检查SAT
命令、
&
pop
命令),它就会切换到通用解算器。在未来的版本中,我们将提供更多用于控制Z3行为的功能

顺便说一句,如果您有两个连续的
(check-sat)(check-sat)
命令,Z3不一定以增量模式进入。只有在两次调用之间有
assert
push
命令时,它才会进入


现在,假设您的查询形式为:
(check-sat)(check-sat)
,第二个查询形式为
(check-sat)(push)(check-sat)
。在这两种情况下,Z3将在第二次
(检查sat)
时处于增量模式。然而,行为仍然不一样。增量解算器将断言的公式“编译”为内部格式,如果执行了
push
命令,则其行为将受到影响。例如,只有在没有用户作用域的情况下,它才会使用更有效的二进制子句编码。通过用户范围,我的意思是,
push
命令的数量-
pop
命令的数量。这是因为在更高效的编码中使用的数据结构没有有效的撤消/反转操作。

两个版本的查询都是增量的。区别在于有
推送
。非增量查询在8秒内解决。)
push
是否更改策略?或者是由于推送情况下的程序流不同?(例如,可能改变约束顺序的额外复制…)如果使用
push
,Z3会自动假定它处于增量模式。是的,我明白你的意思,利奥。但是Z3假设这两个查询都是增量的(因为在第一个-2次调用
检查sat
,第二个-2次调用
检查sat
,还有
推送
。那么..有什么区别吗?:)我明白了,您正在比较
(检查sat)。。。(检查sat)
(检查sat)。。。(按下)(检查sat)
。我会更新答案。