(check-sat)然后(check-sat-using qfnra-nlsat)

时间:2016-05-18 17:37:05

标签: z3 smt

我想做什么:我想致电(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}为了我的目的,所以这不是一个选择。

1 个答案:

答案 0 :(得分:1)

这不可能直接使用(check-sat),但default使用的(check-sat)策略在this question之后公开。因此,在Z3的当前主分支中,可以编写:

(check-sat-using (or-else default qfnra-nlsat))

此功能应适用于Z3 4.4.2及更高版本。