我想做什么:我想致电(check-sat)
,如果结果是unknown
,请致电(check-sat-using qfnra-nlsat)
。
我为什么要这样做?:对于我的应用,使用(check-sat)
的Z3默认策略优于我使用(check-sat-using)
设计的任何内容。但是,在某些情况下,(check-sat)
会返回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)
的效果不如{{1}为了我的目的,所以这不是一个选择。
答案 0 :(得分:1)
这不可能直接使用(check-sat)
,但default
使用的(check-sat)
策略在this question之后公开。因此,在Z3的当前主分支中,可以编写:
(check-sat-using (or-else default qfnra-nlsat))
此功能应适用于Z3 4.4.2及更高版本。