Z3 的默认解算器是什么?

What is Z3's default solver?

[新手]。根据http://rise4fun.com/Z3/tutorialcontent/strategies,'smt'是Z3的主要战术。但是,对于微不足道的问题,使用它显式收支平衡。如何在战术序列中引用默认的 Z3 解算器?

http://rise4fun.com/Z3/K8nn

(declare-fun var1 () Real)
(assert (= (* var1 var1) 9.0))
(assert (< var1 0.0))
; Works
;(check-sat)
;(get-model)
; Breaks
(check-sat-using smt)
(get-info :reason-unknown)

默认情况下,Z3 会查看您的公式以确定需要哪些功能和逻辑,然后调用合适的 solver/tactic。您可以提供一个 (set-logic ...) 命令来控制它,或者您可以直接使用其中一种默认策略。有关 Z3 具有自定义策略的 SMT 逻辑列表,请参阅 default_tactic.cpp。如果其中 none 个匹配并且没有选择逻辑,则 "smt" 是将要执行的策略。

要查看哪些策略是运行,请在命令行中添加-v:10,Z3 将在执行时打印策略名称和统计信息。

对于这种类型的非线性实数,"smt" 策略不是很强大,它会很快放弃并且 return "unknown"。但是,这不是解决此类问题的默认策略;相反(在一些预处理之后)它是解决问题的 "nlsat" 策略,通过 QF_NRA 的默认策略调用(参见 qfnra.cpp)。