Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
增量求解在Z3中是如何工作的?_Z3_Smt - Fatal编程技术网

增量求解在Z3中是如何工作的?

增量求解在Z3中是如何工作的?,z3,smt,Z3,Smt,我有一个关于Z3如何增量解决问题的问题。在阅读了这里的一些答案后,我发现: 有两种方法可以使用Z3进行增量求解:一种是推送/弹出(堆栈)模式,另一种是使用假设 在堆栈模式下,即使在一次局部“pop”之后,z3也会忘记全局范围内的所有学习引理(我说得对吗?) 在假设模式下(我不知道名称,这是我想到的名称),z3不会简化一些公式,例如值传播 我做了一些比较(欢迎你问公式,它们太大了,不能放在rise4fun上),但我的观察结果是:在一些公式上,包括量词,假设模式更快。在一些含有大量布尔变量(假设变量

我有一个关于Z3如何增量解决问题的问题。在阅读了这里的一些答案后,我发现:

  • 有两种方法可以使用Z3进行增量求解:一种是推送/弹出(堆栈)模式,另一种是使用假设
  • 在堆栈模式下,即使在一次局部“pop”之后,z3也会忘记全局范围内的所有学习引理(我说得对吗?)
  • 在假设模式下(我不知道名称,这是我想到的名称),z3不会简化一些公式,例如值传播 我做了一些比较(欢迎你问公式,它们太大了,不能放在rise4fun上),但我的观察结果是:在一些公式上,包括量词,假设模式更快。在一些含有大量布尔变量(假设变量)的公式上,堆栈模式比假设模式快


    它们是否为特定目的而实施?增量求解在Z3中是如何工作的

    是的,基本上有两种增量模式

    基于堆栈:使用push(),pop()创建遵循堆栈规则的本地上下文。在push()下添加的断言将在匹配的pop()之后删除。此外,任何在推力下导出的引理都被移除。使用push()/pop()模拟冻结状态并在冻结状态上添加其他约束,然后恢复到冻结状态。它的优点是释放了在push()范围内建立的任何额外内存开销(如学习的引理)。工作假设是,在推的作用下学习的引理将不再有用

    基于假设:使用传递给check()/check_sat()的其他假设文本,您可以(1)在假设文本上提取不可满足的核心,(2)获得局部增量,而无需独立于假设派生的垃圾收集引理。换句话说,如果Z3学习到一个引理,而该引理不包含任何假定文本,它就不会对它们进行垃圾收集。要有效地使用假设文字,还必须将其添加到公式中。因此,折衷的办法是,与假设一起使用的子句包含一定数量的膨胀。例如,如果你想局部地假设一些公式(p(