Z3中关于增量SAT的一些问题:它可以被停用吗?里面使用了哪些技术?
Some questions about incremental SAT in Z3: can it be deactivated? Which techniques are used inside?
我还在学习Z3的胆量(Python)。
我注意到 Z3 默认执行增量 SAT 求解(参见 ):具体来说,每次使用 s.add
命令(其中 s
是一个求解器),这意味着它将那个子句添加到 s
,但它不会忘记你之前学到的一切。
第一个问题:Z3可以做非增量SAT求解吗?也就是说,不知何故 'deactivate' 增量求解。这意味着什么?我们正在为每个放大的公式创建一个新的求解器?
例如,这种方法是 Z3-default-incremental:
...
phi = a_formula
s = Solver()
s.add(phi)
while s.check() == sat:
s.check()
m = s.model()
phi = add_modelNegation(m)
s.add(phi) #in order not to explore the same model again
...
也就是说,一旦我们得到一个模型,我们就将否定的模型附加到相同的求解器。
虽然这个 'forcing' Z3 是非增量的:
...
phi_st = a_formula
s = Solver()
s.add(phi_st)
negatedModelsStack = []
while s.check() == sat:
m = s.model()
phi_n = add_modelNegation(m)
negatedModelsStack.append(phi_n)
original_plus_negated = And(phi_st, And(negatedModelsStack))
s = Solver()
s.add(original_plus_negated) #in order not to explore the same model again
...
也就是说,一旦我们得到一个模型,我们就将获得的模型附加到一个新的求解器。
我说得对吗?
另一方面,在附件link中,声明如下:
将其与 CVC4 等进行比较;默认情况下不是增量的。如果你想在增量模式下使用 CVC4,你必须传递一个特定的命令行参数
这是否意味着在 CVC4 中您每次都必须创建一个新的求解器?就像在第二个代码中一样?
第二个问题:我如何才能确切知道我在 Z3 中使用什么技术进行增量求解?我一直在阅读增量 SAT 理论,我看到其中一种技术是 'CDCL'(http://www.cril.univ-artois.fr/~audemard/slidesMontpellier2014.pdf),这是否用于 Z3 的增量搜索?
参考文献: 为了不让 Stack 被类似的问题淹没,您一般推荐哪些阅读增量 SAT,特别是 Z3 的增量 SAT?另外,Z3 的增量 SAT 是否与其他求解器(如 MiniSAT 或 PySAT)相似?
我不确定您为什么要让 z3 以非增量方式运行。但是,如果那是您的目标,请不要多次调用 check
:这等同于非增量。 (将增量视为“附加功能”。您不必使用它。z3 和 cvc4 之间的唯一区别是后者需要您提前告诉它您打算以增量方式使用它,而前者默认情况下是增量的。)作为最终用户,您真的不需要知道或关心差异。
旁注 如果你启动 cvc4 时没有告诉它是增量的并调用 check
两次,它会抱怨。 z3不会。但除此之外,体验应该是一样的。
从编程的角度来看,我不认为了解求解器如何逐步实施真的很有帮助。 (如果您正在实施自己的 SMT 求解器,这当然是最重要的。)网上有许多关于 SMT 的许多方面的论文,但如果您想从头开始研究该主题,我推荐 Daniel 和 Ofer 的关于决策程序的书:http://www.decision-procedures.org
我还在学习Z3的胆量(Python)。
我注意到 Z3 默认执行增量 SAT 求解(参见 s.add
命令(其中 s
是一个求解器),这意味着它将那个子句添加到 s
,但它不会忘记你之前学到的一切。
第一个问题:Z3可以做非增量SAT求解吗?也就是说,不知何故 'deactivate' 增量求解。这意味着什么?我们正在为每个放大的公式创建一个新的求解器?
例如,这种方法是 Z3-default-incremental:
...
phi = a_formula
s = Solver()
s.add(phi)
while s.check() == sat:
s.check()
m = s.model()
phi = add_modelNegation(m)
s.add(phi) #in order not to explore the same model again
...
也就是说,一旦我们得到一个模型,我们就将否定的模型附加到相同的求解器。
虽然这个 'forcing' Z3 是非增量的:
...
phi_st = a_formula
s = Solver()
s.add(phi_st)
negatedModelsStack = []
while s.check() == sat:
m = s.model()
phi_n = add_modelNegation(m)
negatedModelsStack.append(phi_n)
original_plus_negated = And(phi_st, And(negatedModelsStack))
s = Solver()
s.add(original_plus_negated) #in order not to explore the same model again
...
也就是说,一旦我们得到一个模型,我们就将获得的模型附加到一个新的求解器。
我说得对吗?
另一方面,在附件link中,声明如下:
将其与 CVC4 等进行比较;默认情况下不是增量的。如果你想在增量模式下使用 CVC4,你必须传递一个特定的命令行参数
这是否意味着在 CVC4 中您每次都必须创建一个新的求解器?就像在第二个代码中一样?
第二个问题:我如何才能确切知道我在 Z3 中使用什么技术进行增量求解?我一直在阅读增量 SAT 理论,我看到其中一种技术是 'CDCL'(http://www.cril.univ-artois.fr/~audemard/slidesMontpellier2014.pdf),这是否用于 Z3 的增量搜索?
参考文献: 为了不让 Stack 被类似的问题淹没,您一般推荐哪些阅读增量 SAT,特别是 Z3 的增量 SAT?另外,Z3 的增量 SAT 是否与其他求解器(如 MiniSAT 或 PySAT)相似?
我不确定您为什么要让 z3 以非增量方式运行。但是,如果那是您的目标,请不要多次调用 check
:这等同于非增量。 (将增量视为“附加功能”。您不必使用它。z3 和 cvc4 之间的唯一区别是后者需要您提前告诉它您打算以增量方式使用它,而前者默认情况下是增量的。)作为最终用户,您真的不需要知道或关心差异。
旁注 如果你启动 cvc4 时没有告诉它是增量的并调用 check
两次,它会抱怨。 z3不会。但除此之外,体验应该是一样的。
从编程的角度来看,我不认为了解求解器如何逐步实施真的很有帮助。 (如果您正在实施自己的 SMT 求解器,这当然是最重要的。)网上有许多关于 SMT 的许多方面的论文,但如果您想从头开始研究该主题,我推荐 Daniel 和 Ofer 的关于决策程序的书:http://www.decision-procedures.org