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