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