z3中“简化”和“ctx-solver-simplified”之间的区别是什么

时间:2012-08-04 13:29:54

标签: z3

从当前版本开始,在“ctx-solver-simplified”中存在一些问题,如示例http://rise4fun.com/Z3/CqRv中的z3给出了错误的答案。我将“ctx-solver-simplify”替换为“简化”,如http://rise4fun.com/Z3/x9X4 我想知道,这两种策略“简化”和“ctx-solver-simplified”之间有什么区别?

1 个答案:

答案 0 :(得分:7)

策略simplify仅执行“本地简化”。对于每个字词t,我们都认为simplify(t)是一个等同于t的新字词。此外,simplify(t)的结果不依赖于t出现的上下文。根据上下文,我的意思是断言F,其中t发生,所有其他断言。由于simplify是本地的,因此非常有效。实施基本上是基于简化规则的自下而上应用。此外,由于simplify(t)的结果不依赖于上下文信息,我们可以缓存它。因此,即使t在公式N中出现F次,我们也只需要简化一次。 Z3中的所有内置求解器都适用于这种简化。因此,simplify等策略已经过广泛测试。

策略ctx-solver-simplify使用t出现的上下文来应用简化。基本思想是通过使用求解器F遍历公式来简化公式S。解算器S基本上包含“上下文”。每当S.check()返回unsat时,我们就知道当前上下文不一致,那么我们可以用false替换当前公式。 ctx-solver-simplify要贵得多。首先,它会对S.check()执行多次调用。这些呼叫中的每一个都可能非常昂贵。缓存中间结果也困难得多。 Z3可能需要多次简化子公式t,因为它发生在不同的上下文中。

您在问题中报告的错误已修复。该修复程序将在下一版本(4.1版)中提供。如果您需要,我们可以为您提供Z3 4.1的预发布版本