(check-sat) 然后 (check-sat-using qfnra-nlsat)
(check-sat) then (check-sat-using qfnra-nlsat)
我想做的事情:我想调用(check-sat)
,然后如果结果是unknown
,调用(check-sat-using qfnra-nlsat)
.
我为什么要这样做?: 对于我的应用程序,使用 (check-sat)
应用的 Z3 默认策略优于我使用 [=15= 设计的任何策略].但是,在某些情况下 (check-sat)
returns unknown
,但 (check-sat-using ...)
通过明智地选择策略会找到结果。这是一个例子:
(declare-fun x () Real)
(declare-fun y () Real)
(declare-fun z () Real)
(declare-fun i () Int)
(declare-fun j () Int)
(declare-fun k () Int)
(assert (= z (* x y)))
(assert (= k (* i j)))
(assert (< k z))
; This returns unknown
(check-sat)
; This gives a solution
(check-sat-using qfnra-nlsat)
(get-value (x y z i j k))
我尝试了什么?: 我在单个 SMT 文件中最接近的是 (check-sat-using (or-else smt qfnra-nlsat)).
不幸的是 (check-sat-using smt)
的表现不如(check-sat)
出于我的目的,所以这不是一个选项。
直接使用 (check-sat)
是不可能的,但是 (check-sat)
使用的 default
策略在 之后暴露出来了。所以,在Z3当前的master分支中,可以这样写:
(check-sat-using (or-else default qfnra-nlsat))
此功能应适用于 Z3 4.4.2 及更高版本。
我想做的事情:我想调用(check-sat)
,然后如果结果是unknown
,调用(check-sat-using qfnra-nlsat)
.
我为什么要这样做?: 对于我的应用程序,使用 (check-sat)
应用的 Z3 默认策略优于我使用 [=15= 设计的任何策略].但是,在某些情况下 (check-sat)
returns unknown
,但 (check-sat-using ...)
通过明智地选择策略会找到结果。这是一个例子:
(declare-fun x () Real)
(declare-fun y () Real)
(declare-fun z () Real)
(declare-fun i () Int)
(declare-fun j () Int)
(declare-fun k () Int)
(assert (= z (* x y)))
(assert (= k (* i j)))
(assert (< k z))
; This returns unknown
(check-sat)
; This gives a solution
(check-sat-using qfnra-nlsat)
(get-value (x y z i j k))
我尝试了什么?: 我在单个 SMT 文件中最接近的是 (check-sat-using (or-else smt qfnra-nlsat)).
不幸的是 (check-sat-using smt)
的表现不如(check-sat)
出于我的目的,所以这不是一个选项。
直接使用 (check-sat)
是不可能的,但是 (check-sat)
使用的 default
策略在
(check-sat-using (or-else default qfnra-nlsat))
此功能应适用于 Z3 4.4.2 及更高版本。