什么';这两者之间的区别是什么;简化;及;ctx解算器简化“;在z3中

什么';这两者之间的区别是什么;简化;及;ctx解算器简化“;在z3中,z3,Z3,自当前版本以来,“ctx解算器简化”中存在一些问题,如示例z3中给出的错误答案。我将“ctx解算器简化”替换为“简化”,如 我想知道,这两种策略“简化”和“ctx解算器简化”之间的区别是什么?策略简化只执行“局部简化”。对于每个术语t,我们都知道simplify(t)是一个新术语,相当于t。此外,simplify(t)的结果并不取决于发生t的上下文。所谓上下文,我指的是发生在t处的断言F,以及所有其他断言。因为,simplify是本地的,所以它非常高效。实现基本上基于简化规则的自底向上应用。此外

自当前版本以来,“ctx解算器简化”中存在一些问题,如示例z3中给出的错误答案。我将“ctx解算器简化”替换为“简化”,如
我想知道,这两种策略“简化”和“ctx解算器简化”之间的区别是什么?

策略
简化
只执行“局部简化”。对于每个术语
t
,我们都知道
simplify(t)
是一个新术语,相当于
t
。此外,
simplify(t)
的结果并不取决于发生
t
的上下文。所谓上下文,我指的是发生在
t
处的断言
F
,以及所有其他断言。因为,
simplify
是本地的,所以它非常高效。实现基本上基于简化规则的自底向上应用。此外,由于
simplify(t)
的结果不依赖于上下文信息,因此我们可以缓存它。因此,即使
t
在公式
F
中出现
N
次,我们只需要简化一次。Z3中的所有内置解算器都应用这种简化。因此,
simplify
等策略已经得到了广泛的测试

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

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