使用和不使用推送调用在UFBV上对Z3进行增量调用

时间:2012-02-03 15:26:04

标签: z3

我在UFBV查询上运行Z3。目前,该查询包含2个调用check-sat。 如果在push 1之后放置check-sat Z3在30秒内解决了查询。如果根本不放任何push 1 - Z3在200秒内解决它。 有趣。任何具体原因或只是巧合?

1 个答案:

答案 0 :(得分:7)

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

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

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